LINUX.ORG.RU

Аналог mprotect в ядре.


0

0

В общем необходим ядерный сабж, для изменения атрибутов страниц памяти в ядре. Если я правильно понимаю, сискол из ядра вызывать нельзя. В заголовочном файле(mm.h) есть экспортируемая ядром функция:

extern int mprotect_fixup(struct vm_area_struct *vma, struct vm_area_struct **pprev, unsigned long start, unsigned long end, unsigned long newflags);
Но непонятны параметры vma и pprev.

Ответ на: комментарий от suzuki

>Чью память ты собрался корёжить?
Ничью, интересуюсь некоторыми техниками исключительно в образовательных целях.

Booster ★★ ()
Ответ на: комментарий от suzuki

>посмотри исходники рядом с mprotect_fixup - find_vma find_vma_prev и почитай что-нибудь вроде LDD/Роберта Лава, src/Documentation/vm/*
Спасибо, а сылочку на Лава не дадите? А то что-то не гуглится.

Booster ★★ ()

И всё-таки не очень понятно. Для какого адреса искать vma, для start? Тогда почему именно pprev? Или vma искать для end? И почему mprotect_fixup сама не может найти области? Или надо менять атрибуты как-то иначе?

Booster ★★ ()

>сискол из ядра вызывать нельзя

Вообще можно, это же обычная функция: sys_sync(), sys_fork().
Но если так писать, то другие разработчики будут обзываться
быдлокодером, и Линус перестанет принимать твои патчи :(

ttnl ★★★★★ ()
Ответ на: комментарий от suzuki

>Ты уже прочитал книжки? Вот это скорость! ;)
Прочитал только функции работы с регионами памяти. Но как-то мутно описано и mprotect_fixup не нашёл.

Booster ★★ ()

> сискол из ядра вызывать нельзя

можно

непонятны параметры vma


кхм... это vm_area_struct * ;) описывает memory area,
[start, end) там лежит

pprev


если *pprev != NULL, то это hint для vma_merge() ...
те указатель на vm_area_struct перед vma.

да, не знаю как обьяснить. делайте так:

vm_area_struct *vma = NULL;

mprotect_fixup(..., &prev, ...);

позде вызова в prev будет правильное значение.


а вообще, не надо этим helper'ом пользоваться.

idle ★★★★★ ()
Ответ на: комментарий от idle

>можно
В заголовочных файлах sys_mprotect отсутсвует, конечно можно самому объявить, но подумал это ахтунг. Сисколы безопасно вызывать и в ядре?

mprotect_fixup(..., &prev, ...);

позде вызова в prev будет правильное значение.


Не понимаю зачем в этой функции столько параметров, prev мне не нужно, нужно просто установить атрибут памяти.

а вообще, не надо этим helper'ом пользоваться.

А чем?

Booster ★★ ()
Ответ на: комментарий от Booster

> это ахтунг.

разумеется,

Сисколы безопасно вызывать и в ядре?


да. но не нужно. ну, за редким исключением.

Не понимаю зачем в этой функции столько параметров


читайте код ;) всяко полезнее книжек будет.

prev мне не нужно


так не пользуйтесь! я же написал, prev = NULL и
передавайте &prev. вот если caller знает правильное
значение prev != NULL, это может помочь vma_merge()

А чем?


а для чего??? как минимум, mprotect_fixup() должна
вызываться под mmap_sem.

если просто поиграться хотите, пользуйтесь sys_mprotect(),
проще всего будет.




idle ★★★★★ ()
Ответ на: комментарий от idle

>так не пользуйтесь! я же написал, prev = NULL и

передавайте &prev. вот если caller знает правильное

значение prev != NULL, это может помочь vma_merge()


Я не могу понять логику. Для чего понадобилось передавать два дополнительных параметра? По комментам не понять, по коду тем более.

Booster ★★ ()
Ответ на: комментарий от Booster

> Для чего понадобилось передавать два дополнительных параметра?

оптимизация же! ну смотрите, sys_mprotect() вызывает fixup()
в цикле, мы не хотим все время дергать find_vma/etc.

по коду тем более.


тогда начните с чего-нибудь попроще.

idle ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.