Я работаю над проприетарным драйвером устройства. Драйвер реализован в виде модуля ядра. Затем этот модуль соединяется с процессом пользовательского пространства.
Важно, чтобы каждый раз, когда устройство генерирует прерывание, драйвер обновлял набор счетчиков непосредственно в адресном пространстве процесса пользовательского пространства из верхней половины обработчика прерывания. Драйвер знает PID и task_struct пользовательского процесса, а также виртуальный адрес, по которому находятся счетчики в контексте пользовательского процесса. Однако у меня возникли проблемы с выяснением того, как код, работающий в контексте прерывания, может использовать контекст mm пользовательского процесса и записывать в него. Подытожу, что мне нужно сделать:
Получить адрес физической страницы и смещение, соответствующее виртуальному адресу счетчиков в контексте пользовательского процесса.
Настройте сопоставления в таблице страниц и запишите на физическую страницу, соответствующую счетчику.
Для этого я пробовал следующее:
Попробуйте использовать контекст mm пользовательской задачи, как показано ниже:
use_mm(tsk->mm); /* write to counters. */ unuse_mm(tsk->mm);
Это, по-видимому, приводит к зависанию всей системы.
Дождитесь прерывания, когда наш пользовательский процесс был процессом
current
. Затем используйтеcopy_to_user()
.
Я не большой специалист по программированию ядра. Если есть хороший способ сделать это, пожалуйста, сообщите и заранее спасибо.