我正在尝试使用C语言,因此我一直茬研究
内核的系统调用表(在3.13.0-32-generic上).我在线找到了一个资源,该资源使用以下函数搜索系统调用表,并将其加载到LKM的内核中:
该功能有效.我能够使用咜返回的地址来操纵系统调用表.我不明白的是为什么此函数返回的地址与/boot/System.map-(KERNEL)中的地址不匹配
该函数显示的内容如下:
为什么两个地址不匹配据我了解,该模块在内核的地址空间中运行,因此系统调用表的地址应该相同.
这两个虚拟地址具有相同的物理地址.
我们知道虚拟地址空间ffff-ffffc7ffffffffff是所有物理内存的直接映射.当内核要访问所有物理内存时,它使用直接映射.这也是您用于搜索的内容.
至于上述问题中提到的地址:
他们两个都解析为相同的物理地址.
virt-> phys转换以这样的方式发生,即“直接”映射区域和“内核文本”映射区域中的对应地址解析为相同的物理地址.