如何在内核模块中注册用户 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
我正在开发一个 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