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

时间:2018-03-07 00:43:01

标签: memory linux-kernel kernel-module

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

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

sass

从我的理解来看,这意味着它正在写入一个在用户空间中间浮出的地址。

我知道这不是最佳情况,能够使用内存映射地址/寄存器会更好,但我现在无法改变其工作方式。

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

我尝试了mmap和ioremap,但这些实际上是用于内存映射寄存器,而不是访问用户空间中已经存在的内存。我相信我只需使用指针即可从地址读取/写入,但如果将该区域分配给另一个进程,则无法防止损坏。

1 个答案:

答案 0 :(得分:1)

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

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

你可以在boot args中拥有多个mem 例如:mem = 1M @ 0x900000 mem = 1M @ 0xA00000

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

cat /proc/iomem | grep System