6

我在一个 Linux 内核模块中,我分配了一些内存,比如vmalloc(). 我想让内存有读、写和执行权限。这样做的干净和适当的方法是什么?基本上,这通常等同于调用mprotect(),但在内核空间中。

如果我执行 page walk, pgd_offset(), pud_offset(), pmd_offset(), pte_offset_map(), 然后pte_mkwrite(), 我在 2.6.39 上尝试时遇到链接错误。此外,如果我在进行页面遍历,这似乎是一种 hack,应该有一种更清洁、更合适的方法。

我的内核模块将是一个可加载模块,因此我无法使用内部符号。

提前感谢您的指导。

4

2 回答 2

1

这个问题有一个很好的答案: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

于 2019-02-05T20:21:03.140 回答
0

您是否尝试过直接调用 do_mprotect() [对应于 mprotect() 的内核函数]?

于 2017-07-23T21:59:28.397 回答