【问题标题】:How to walk the Kernel's VMA?如何走内核的 VMA?
【发布时间】:2014-11-24 12:40:39
【问题描述】:

我正在编写一个内核模块来查找和解析进程的 VM_EXEC 页面。这可以通过遍历进程的虚拟内存来实现,类似于/proc/$PID/maps 所做的。但是,我也想将此扩展到 linux 内核本身,但我不知道从哪里开始。

如何枚举分配给内核的页面以及分配给当前运行的任何内核模块的页面?

【问题讨论】:

  • 也许这在 Stack Overflow 上会更好?
  • @Togger597 确实,编程问题在这里是题外话。

标签: linux kernel memory


【解决方案1】:

要遍历内核空间的 VMA,您需要使用 mm_struct 类型的变量 init_mm,就像您可能已经使用 task_struct active_mm 字段一样。

至于问题的第二部分,可以通过列出模块并查看module 结构的module_coreinit_text_sizecore_text_size 字段来区分内核代码和模块代码。

但我不确定您是否能够区分从内核模块分配的页面和从内核分配的页面,除非您为模块提供不同版本的 kmalloc(可能在链接阶段)。

【讨论】:

  • 关于第一部分,init_mm 有一个 .mmap 成员,但它似乎总是为 NULL。有没有其他方法可以获取内核内存的 VMA?
  • 嗯,我希望它会被使用。暂时不知道在哪里可以找到它。
猜你喜欢
  • 2012-09-28
  • 2021-09-05
  • 2018-02-23
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 1970-01-01
  • 2012-04-21
相关资源
最近更新 更多