我在Linux内核模块中,我用vmalloc()
分配了一些内存。我想让内存具有读,写和执行权限。干净,适当的方式是什么?基本上,这通常相当于调用mprotect()
,但在内核空间中。
如果我执行页面漫步,pgd_offset()
,pud_offset()
,pmd_offset()
,pte_offset_map()
,然后pte_mkwrite()
,我会在尝试时遇到错误它在2.6.39。此外,似乎如果我正在进行页面漫步,那它就是一个黑客,应该有一个更清洁,更合适的方法。
我的内核模块将是一个可加载的模块,因此我无法使用内部符号。
提前感谢您的指导。
答案 0 :(得分:0)
您是否尝试过直接调用do_mprotect()[对应于mprotect()的内核函数?
答案 1 :(得分:0)
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