我在Linux内核模块中,使用vmalloc()
分配一些内存。我想让内存具有读取、写入和执行权限。做到这一点的干净和适当的方法是什么?基本上,这通常相当于调用mprotect()
,但在内核空间中。
如果我进行页面漫游,pgd_offset()
、pud_offset()
、pmd_offset()
、pte_offset_map()
,然后是pte_mkwrite()
,那么在2.6.39上尝试时会遇到链接错误。此外,如果我在进行页面浏览,这似乎是一种黑客行为,应该有一种更干净、更合适的方法。
我的内核模块将是一个可加载的模块,所以内部符号对我来说不可用
提前感谢您的指导。
这里有一个很好的答案:https://unix.stackexchange.com/questions/450557/is-there-any-function-analogous-to-mprotect-in-the-linux-kernel.
asm-generic/set_memory.h:int set_memory_ro(unsigned long addr, int numpages);
asm-generic/set_memory.h:int set_memory_rw(unsigned long addr, int numpages);
asm-generic/set_memory.h:int set_memory_x(unsigned long addr, int numpages);
asm-generic/set_memory.h:int set_memory_nx(unsigned long addr, int numpages);
它们的定义如下:https://elixir.bootlin.com/linux/v4.3/source/arch/x86/include/asm/cacheflush.h#L47
您是否尝试过直接调用do_mprotect()[对应于mprotect()的内核函数]?