Функция mprotect() в ядре Linux
Я нахожусь в модуле ядра Linux, и я выделяю некоторую память, скажем, vmalloc()
, Я хочу, чтобы память имела права на чтение, запись и выполнение. Как правильно и правильно это сделать? По сути, это обычно эквивалент вызова mprotect()
, но в пространстве ядра.
Если я пойду на страницу, pgd_offset()
, pud_offset()
, pmd_offset()
, pte_offset_map()
, а потом pte_mkwrite()
, Я сталкиваюсь с ошибками связывания, когда я пробовал это на 2.6.39. Кроме того, кажется, что если я делаю просмотр страницы, это взлом, и должен быть более чистый и более подходящий метод.
Мой модуль ядра будет загружаемым, поэтому внутренние символы для меня недоступны.
Заранее спасибо за ваше руководство.
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
Вы пробовали, вызывая do_mprotect() [функцию ядра, соответствующую mprotect()] напрямую?