【发布时间】:2013-06-27 07:47:03
【问题描述】:
我怎么知道地址是否可读?
如果地址不可读或未映射,内核通常会以类似BUG: unable to handle kernel paging request at ffffffff80000018 的消息进行响应。
那么,是否有任何函数可以验证特定地址(或地址范围)是否可读?
【问题讨论】:
-
访问任何随机硬件的内存可能会炸毁计算机。你在想什么?
我怎么知道地址是否可读?
如果地址不可读或未映射,内核通常会以类似BUG: unable to handle kernel paging request at ffffffff80000018 的消息进行响应。
那么,是否有任何函数可以验证特定地址(或地址范围)是否可读?
【问题讨论】:
copy_from_user 和相关函数从一些不受信任的用户空间程序中获取地址;它们通过安装特殊的异常处理程序来防止无效地址。
(详情请参阅this answer。)
您也可以这样做,但这只能防止内核在页表中标记为无效的地址;访问某些随机设备的 MMIO 范围可能会产生不可预知的结果。
如果您想在某个 BIOS ROM 中搜索某些内容,请像任何其他 PCI 资源一样重新映射该内存。
如果您想在主内存中搜索某些内容,可以使用ioremap 或kmap 等函数来获取特定物理地址的有效虚拟地址。
【讨论】: