#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:
- Используйте функцию get_user_pages(), чтобы получить страницы целевого процесса (точнее, его mm_struct)
- Сопоставьте нужные вам страницы с помощью
kmap()
илиkmap_atomic()
(в зависимости от контекста) - Запись / чтение по адресу, возвращаемому отображением (с размером страницы).
- Уничтожьте сопоставление с помощью
kunmap()
илиkunmap_atomic()