Linux内核中类似mprotect()的功能



我在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()的内核函数]?

最新更新