如何在内核模块中注册用户 space 内存区域?

How do you register a region of user space memory in a kernel module?

我正在开发一个 Linux 模块来连接第三方设备。当这个设备准备好给我的模块信息时,它直接写入 RAM 内存地址 0x900000。

当我检查 /proc/iomem 时,我得到:

00000000-3fffffff: System Ram
   00008000-00700fff: Kernel code
   00742000-007a27b3: Kernel datat

根据我的理解,这意味着它正在写入一个在user-space中间浮出的地址。

我知道这不是最佳情况,如果能够使用内存映射会更好addresses/registers,但我现在无法更改它的工作方式。

如何让我的内核模块安全地声明用户 space 内存 space 从 0x900000 到 0x901000?

我尝试了 mmap 和 ioremap,但它们实际上是用于内存映射寄存器,而不是访问用户 space 中已经“存在”的内存。我相信我可以通过使用指针从地址 read/write,但是如果该区域被分配给另一个进程,这并不能防止损坏。

你可以通过在 bootargs 中设置 mem 参数告诉内核限制内核 space 的地址:

mem=1M@0x900000 --> instructs to use 1M starting from 0x900000

你可以在引导参数中有多个内存 示例:mem=1M@0x900000 mem=1M@0xA00000

以下命令应该告诉您分配给内核的内存区域:

cat /proc/iomem | grep System