Как записать в режиме ядра в виртуальную память некоторого процесса

#module #linux-kernel #scheduled-tasks #scheduling #context-switch

#модуль #linux-ядро #запланированные задачи #планирование #переключение контекста

Вопрос:

Я хочу использовать свой модуль Unix для записи в память другого процесса (я хотел бы сделать это в режиме ядра и избежать интерфейса pthread).
Я должен использовать функции (например, do_mmap(..), do_unmmap(..), sys_mprotect (..) И т. Д.), Которые влияют на текущую память процесса, а не на процесс, на который я хотел бы повлиять.

Итак, я решил, что мне нужно найти способ переключить контекст на нужный мне процесс, чтобы сделать процесс, который я хочу, текущим. Я попытался скопировать реализацию schedule() с незначительным изменением: я заменил строку:

далее = pick_next_task(rq);

с:

следующий = myNext;

Моя проблема в том, что для расписания требуется так много структур и функций, которые я не могу включить, поэтому мне приходится их повторно внедрять. кажется, что это довольно плохо. У вас есть какие-либо предложения?

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

Кстати, я использую версию Linux «2.6.38-11-generic».

Комментарии:

1. Выполняется ли ваш код в контексте процесса или в контексте BH / прерывания?

Ответ №1:

  1. Используйте функцию get_user_pages(), чтобы получить страницы целевого процесса (точнее, его mm_struct)
  2. Сопоставьте нужные вам страницы с помощью kmap() или kmap_atomic() (в зависимости от контекста)
  3. Запись / чтение по адресу, возвращаемому отображением (с размером страницы).
  4. Уничтожьте сопоставление с помощью kunmap() или kunmap_atomic()