Я знаю, что функции copy_to_user
/copy_from_user
, get_user
/put_user
предназначены для этой цели.Как получить доступ к памяти пользовательского пространства из ядра Linux?
Вопрос в том, что, учитывая адрес/указатель пространства пользователя, как я могу получить доступ к данным, указанным по адресу из ядра в целом?
Я могу представить, что сначала я должен убедиться, что содержащая страница должна находиться в физической памяти (а не на диске).
Каков следующий шаг? Могу ли я использовать *p
, где p
- это указатель, указывающий на некоторые данные о пространстве пользователя, непосредственно для обращения к данным?
Или мне нужно сначала вызвать kmap
для сопоставления содержащего физического кадра страницы с виртуальным адресным пространством ядра? Зачем?
Хорошая точка и логика кода хороши. Но я предполагаю, что есть хеш-таблица или подобная структура данных, которая, учитывая виртуальный адрес, помогает быстро найти физическую страницу. Существует недостаток: kaddr = __va (paddr); Эта строка работает только тогда, когда paddr находится в низкой памяти, не так ли? – Infinite
paddr означает физический адрес, поэтому он всегда существовал в памяти. kaddr означает адрес ядра. В ядре Linux define: '#define __va (x) ((void *) ((unsigned long) (x) + PAGE_OFFSET)). Отображение памяти адреса ядра не является сложным, просто PAGE_OFFSET. (Должно быть 0xC0000000 в режиме x86). Существует другой способ получить адрес. Приложение «Пользовательское пространство» может получить доступ к адресу ядра с/proc//pagemap, чтобы получить информацию о странице. Если вы можете получить PFN, он также может получить адрес ядра. –
richliu