检查是否可以从linux内核空间访问内存地址

时间:2015-03-25 08:53:39

标签: linux memory linux-kernel linux-device-driver

没有输入太多细节,我正在为具有DMA功能的fpga pci板编写此设备驱动程序。 存在这样的情况:板dma-在存储器中用一些数据写入ACK。该数据实际上是指向先前分配的存储器中的结构的指针,通过使用寄存器将指针通知给板。因此,我使用电路板写入的数据来取消引用存储区域。 由于我们仍处于该板的调试阶段,因此无法完全确定DMA写入的数据,因此它恰好取消引用无效指针(因为DMA写入的数据不一致)。

我的问题是:有没有办法在访问它之前检查内存指针(来自内核空间),而不会产生无效访问和/或内核崩溃?

1 个答案:

答案 0 :(得分:1)

在32位系统上,虚拟内存寻址以下列方式转移

0x00000000             0xc0000000  0xffffffff 
    |                        |          |
    +------------------------+----------+
    |  User                  |  Kernel  |
    |  space                 |  space   |
    +------------------------+----------+

所以,如果我没有错,你可以随时检查你的指针是否在以下范围内(内存不足)

0xc0000000 - 0xffffffff
3'221'225'472 - 4'294'967'295

但我不是Linux内核专家,所以可能有更好更安全的方法来实现这个目标