【问题标题】:Finding the kernel address of a loadable kernel module查找可加载内核模块的内核地址
【发布时间】:2013-03-10 10:35:01
【问题描述】:

我正在尝试查找我的可加载内核模块被 insmod 重定位的内核地址空间。

我了解到,通过在安装模块时使用 -m,-O 开关,我们只能从模块的角度看到符号表和可执行文件的部分地址,而不是它们的重定位地址, 因为这个重定位过程是在我们做 insmod 的时候进行的。

谁能告诉如何在内核内存中找到模块的重定位地址,即加载的模块所在的内核绑定的地址?

谢谢!

P.S 请注意,我使用的是 Redhat 2.4 Linux 内核,其中 /proc/modules 列表不显示加载模块的虚拟地址。

【问题讨论】:

标签: linux linux-kernel kernel embedded-linux kernel-module


【解决方案1】:

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

【讨论】:

  • 一个快速提示:你需要 root 才能让 cat /sys/module/module-name-here/sections/.* 东西工作..(否则它只显示值 0x0)。
【解决方案2】:

您可以从/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内核中加载模块的内核地址吗?
  • 2.4 内核有点过时了。我认为需要更改代码以支持您想要的功能。你能告诉我你的内核的详细版本吗?所以我可以下载一个来检查一下。
  • 我正在使用 Redhat 2.4.20-24.7 内核 使用我认为是虚拟的“__this_module.next”指针找到了模块的地址。您能告诉我如何将这些虚拟地址转换为物理地址吗?谢谢!
  • 我认为在 2.4.20 中,可加载模块正在使用 VMALLOC 内存。所以可以尝试使用page_to_pfn(vmalloc_to_page(vmalloc_addr))将VMALLOC虚拟地址转换为物理页,就可以得到物理地址了。
  • 感谢您的建议。将尝试并回复您!我想问你如何验证这个内核是否使用VMALLOC进行虚拟内存分配?因为我做了一个“人”vmalloc 和 vmalloc_to_page 但找不到任何手册页告诉他们的细节
猜你喜欢
  • 1970-01-01
  • 2021-08-17
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
  • 2016-02-08
  • 2012-08-20
  • 2016-01-05
相关资源
最近更新 更多