Как записать в режиме ядра в виртуальную память какого-либо процесса - PullRequest
0 голосов
/ 11 октября 2011

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

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

next = pick_next_task (rq);

с:

next = myNext;

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

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

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

1 Ответ

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