查找可加载内核模块的内核地址

7
我正在尝试寻找我的可加载内核模块被insmod重新定位后的内核地址空间。
我知道使用-m,-O开关时,通过模块的视角只能看到符号表和可执行部分的地址,而不是它们被重新定位后的地址,因为这个重定位过程是在进行insmod时完成的。
有人可以告诉我如何找到一个模块在内核内存中重新定位的地址,即已加载模块所在的内核绑定地址吗?
谢谢!
注:请注意,我正在使用Redhat 2.4 Linux内核,其中/proc/modules列表不显示已加载模块的虚拟地址。

可能是重复的问题:如何获取使用insmod插入的内核模块的地址? - Ciro Santilli OurBigBook.com
2个回答

12

前往目录/sys/module/<module-name>/sections/.text-将显示代码加载的位置。 /sys/module/<module-name>/sections/.data将显示模块数据段的部分,.bss将显示模块的bss部分。


5
小贴士:您需要获得root权限才能使以下命令生效: cat /sys/module/module-name-here/sections/.* 否则它将显示数值0x0。 - kaiwan

9
你可以从 /proc/modules 文件中获取模块的核心部分指针(虚拟地址,不是物理内存地址,但可以转换为物理地址)和占用大小。例如,在我的Linux系统上该文件的一部分内容如下:
autofs4 29253 3 - Live 0xf9014000
hidp 23105 2 - Live 0xf900d000
rfcomm 42457 0 - Live 0xf8f84000

嗨@tian_yufeng,谢谢!但是我正在使用Redhat 2.4 Linux内核,在其中/proc/modules列表中不显示虚拟地址,如我在问题中编辑的那样。您知道如何在此2.4内核中获取已加载模块的内核地址吗? - freax
2.4内核有点过时了。我认为需要更改代码以支持您想要的功能。您能告诉我您内核的详细版本吗?这样我就可以下载一个来检查了。 - tian_yufeng
我正在使用Redhat 2.4.20-24.7内核。 已经通过“__this_module.next”指针找到了模块的地址,我相信这些是虚拟地址。 你能告诉我如何将这些虚拟地址转换为物理地址吗?谢谢! - freax
我认为在2.4.20版本中,可加载模块正在使用VMALLOC内存。因此,您可以尝试使用page_to_pfn(vmalloc_to_page(vmalloc_addr))将VMALLOC虚拟地址转换为物理页面,然后您就可以获得物理地址。 - tian_yufeng
@tian_yufeng,
  1. 你有一个C代码片段可以确定物理位置和尺寸大小吗?
  2. 内存是否是连续加载的?
- Ursa Major
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接