модуль ядра при вызове из одного процесса пишет на страницу из другого процесса

Я пишу модуль ядра, который должен вызываться процессом p1 для перезаписи страницы данных, принадлежащей целевому процессу p2.

Во-первых, внутри модуля ядра и при ответе на событие записи в файловую систему proc, выданное p1. Я использовал идентификатор целевого процесса (p2) для поиска структуры задачи последнего (p2_task).

Для поиска конкретной страницы я использовал get_user_pages(), явно вызывая ее (p2_task->mm). Затем я вызвал kmap() на странице, возвращенной предыдущей функцией. Как только я получил указатель, я использовал типичные функции памяти (memset()) для записи в эту память. Наконец позвонил kunmap().

Однако, как только процесс снова запускается, я вижу, что то, что я сделал, не повлияло на целевой процесс p2.

Я не уверен, что я сделал неправильно. Кто-нибудь может помочь?

Подозреваю, что почему-то нельзя писать в память, принадлежащую процессу p2, отвечая на запрос, исходящий от p2. Так как здесь мы находимся в другом контексте.

Так ли это, если нет, что еще я могу проверить. Если это проблема, то можно ли как-то это обойти?


person hebbo    schedule 01.02.2013    source источник
comment
Насколько я понимаю, kmap() возвращает виртуальный адрес (в низкой памяти) для физической страницы. То есть, если физическая страница уже имеет виртуальный адрес в пространстве ядра, kmap() возвращает его. В противном случае он переназначает ту же физическую страницу на виртуальный адрес в пространстве ядра, а затем возвращает этот новый виртуальный адрес. Таким образом, новая физическая страница не требуется. Также обратите внимание, что новый виртуальный адрес создается в пространстве ядра, а не в p2.   -  person hebbo    schedule 02.02.2013
comment
все делается из пространства ядра.   -  person hebbo    schedule 04.02.2013
comment
Извините, я думал, вы хотите, чтобы p1 перезаписывал p2. Теперь я вижу, вы упоминаете p1 только для того, чтобы сказать, что он был вызван из другого пользовательского контекста. См. makelinux.net/ldd3/chp-15-sect-3, который делает то, что вы описали выше. Единственное отличие, которое я вижу, это захват/освобождение mmap_sem и вызов SetPageDirty().   -  person artless noise    schedule 06.02.2013
comment
Как вы освобождаете выделенные через get_user_pages страницы после kunmap?   -  person Ilya Matveychikov    schedule 11.04.2013
comment
Я столкнулся с той же проблемой. Удалось ли вам найти решение этой проблемы?   -  person S. Salman    schedule 13.01.2017


Ответы (2)


Может быть, страница, на которую вы пытаетесь писать, доступна только для чтения? В архитектуре Intel вы можете установить защиту от записи, см. http://badishi.com/kernel-writing-to-read-only-memory/

person zoska    schedule 04.08.2013

Для меня это похоже на проблему с TLB, из-за чего p2 имеет виртуальный адрес данных, кэшированных на оборудовании. Читал/записывал ли p2 страницу в своем адресном пространстве до того, как p1 изменит значение?

Попробуйте вызвать это в p1 после изменения значения: flush_tlb_page(struct vm_area_struct * vma, unsigned long address)

person Brian Kocoloski    schedule 27.06.2014