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

Memory 如何在内核模块中注册用户空间内存区域?,memory,linux-kernel,kernel-module,Memory,Linux Kernel,Kernel Module,我正在使用Linux模块与第三方设备进行接口。当该设备准备好提供模块信息时,它会直接写入RAM内存地址0x900000 当我检查/proc/iomem时,我得到: 00000000-3fffffff: System Ram 00008000-00700fff: Kernel code 00742000-007a27b3: Kernel datat 从我的理解来看,这意味着它正在写入一个在用户空间中间浮动的地址。p> 我知道这不是一个最佳情况,最好能够使用内存映射地址/寄存器,但我现

我正在使用Linux模块与第三方设备进行接口。当该设备准备好提供模块信息时,它会直接写入RAM内存地址0x900000

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

00000000-3fffffff: System Ram
   00008000-00700fff: Kernel code
   00742000-007a27b3: Kernel datat
从我的理解来看,这意味着它正在写入一个在用户空间中间浮动的地址。p> 我知道这不是一个最佳情况,最好能够使用内存映射地址/寄存器,但我现在没有改变它工作方式的选择

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


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

您可以通过在引导参数中设置mem参数来告诉内核限制内核空间的地址:

mem=1M@0x900000 --> instructs to use 1M starting from 0x900000
启动参数中可以有多个mem 示例:mem=1M@0x900000记忆=1M@0xA00000

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

cat /proc/iomem | grep System
“它直接写入RAM内存地址0x900000”——除非您的系统具有IOMMU,否则此地址很可能是物理内存地址,而不是您假定的虚拟地址。你不能区分不同类型的“地址”,这会给你带来很多困惑