Как я могу получить доступ к памяти по известному физическому адресу внутри модуля ядра? - PullRequest
0 голосов
/ 18 ноября 2010

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

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

Когда модуль хочет отправить запрос, он должен поместить запросв буфер через физический адрес.Вопрос в том, как я могу получить доступ к буферу внутри модуля ядра через его физический адрес.

Я заметил, что есть get_user_pages, но не знаю, как его использовать, или, может быть, есть и другие лучшие методы?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 19 ноября 2010

Вам лучше сделать это наоборот - пусть ядро ​​ 1002 * выделит буфер, а затем разрешит программе userpace отобразить его в свое адресное пространство, используя mmap().

1 голос
/ 19 ноября 2010

Наконец я понял, как справиться с этой проблемой ...

Довольно просто, но может быть небезопасно.

используйте phys_to_virt, который вызывает __va (pa), чтобы получить виртуальный адрес в ядре, и я могу получить доступ к этому буферу. А поскольку буфер закреплен, это может гарантировать доступность физического местоположения.

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

...