我怎么知道地址是否可读?
如果地址不可读或未映射,内核通常会以这样的消息响应BUG: unable to handle kernel paging request at ffffffff80000018
。
那么,是否有任何函数可以验证特定地址是否可读(或地址范围)?
和copy_from_user
相关函数从一些不受信任的用户空间程序中获取地址;它们通过安装特殊的异常处理程序来防止无效地址。(有关详细信息,请参阅此答案。)
你也可以这样做,但这只能防止内核在页表中标记为无效的地址;访问某些随机设备的 MMIO 范围可能会产生不可预知的结果。
如果您想在某个 BIOS ROM 中搜索某些内容,请像任何其他 PCI 资源一样重新映射该内存。
如果您想在主内存中搜索某些内容,您可以使用一些函数,例如ioremap
或kmap
获取特定物理地址的有效虚拟地址。