我正在编写一个内核模块,用于查找和分析进程的VM_EXEC页面。这可以通过走过程的虚拟内存来实现,类似于/proc/$PID/maps
所做的那样。不过,我也想把它扩展到linux内核本身,但我不知道从哪里开始。如何走内核的VMA?
我该如何枚举哪些页面分配给内核以及哪些页面分配给当前正在运行的任何内核模块?
我正在编写一个内核模块,用于查找和分析进程的VM_EXEC页面。这可以通过走过程的虚拟内存来实现,类似于/proc/$PID/maps
所做的那样。不过,我也想把它扩展到linux内核本身,但我不知道从哪里开始。如何走内核的VMA?
我该如何枚举哪些页面分配给内核以及哪些页面分配给当前正在运行的任何内核模块?
要走内核空间的VMA,您需要使用mm_struct
类型的init_mm
变量,其方式与task_struct active_mm
字段可能已在处理的相同。
至于它可以通过列出的模块和看字段module_core
,init_text_size
和module
结构的core_text_size
是可能的内核代码和代码模块区分的问题的第二部分。
但我不知道,你将能够从一个内核模块分配的页面以及那些从内核分配的,除非你提供不同版本的kmalloc的模块来区分(可能在链接阶段。)
关于第一部分,'init_mm'有一个'.mmap'成员,但它似乎总是NULL。有没有其他方法可以获得内核内存的VMA? – MarkP 2014-10-06 15:56:14
嗯我会期望它被使用。暂时还不知道你在哪里可以找到它。 – 2014-10-06 16:11:36
也许这会更好的堆栈溢出? – Torger597 2014-09-29 21:08:15
@ Torger597确实,编程问题在这里是无关紧要的。 – Gilles 2014-09-29 23:15:38