Функция 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()] напрямую?

Другие вопросы по тегам