Сопоставление виртуального адреса пространства ядра с виртуальным адресом пространства пользователя в драйвере Windows 10

Я пишу драйвер режима ядра в Windows 10 (64-разрядная версия), основная цель которого - чтение из DMA, и мне было интересно, вместо копирования блоков памяти из пространства ядра в буферы, выделенные в пользовательском пространстве, Я мог бы каким-то образом предоставить адрес в пользовательском пространстве (конечно, не физический адрес) и сэкономить на операции копирования памяти.

Возможно что-то вроде этого:

  1. Выделение блока непрерывной физической памяти (и отображение физического адреса на виртуальный адрес в пространстве ядра).

  2. Отображение виртуального адреса в пространстве ядра на виртуальный адрес в пользовательском пространстве.

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

Спасибо за ваше время!


person Jones    schedule 08.08.2017    source источник
comment
Почему бы не позволить ядру с самого начала работать с буфером пользовательского пространства?   -  person Eugene Sh.    schedule 08.08.2017
comment
Насколько я понимаю, если я выделяю буфер в пользовательском пространстве, нет гарантии, что он будет непрерывным в физической памяти (только в виртуальной памяти текущего процесса), и мне нужно показать адрес устройства, расположенного в слот PCIe, из которого он может начать непрерывную запись.   -  person Jones    schedule 08.08.2017
comment
возможно, это будет полезно: stackoverflow .com / questions / 7089735 /, хотя на первый взгляд кажется, что это всего лишь файлы.   -  person yano    schedule 08.08.2017
comment
Попросите пользовательский процесс дать вашему драйверу ядра виртуальный адрес пользовательского пространства [и длину]. Ваш драйвер может / должен решить, может ли он обходить промежуточные буферы [или нет]. Драйвер может приостановить процесс, заблокировать страницы, определить физические адреса пространства ввода-вывода и сгенерировать операцию разброса / сбора данных DMA [возможно, используя MMU ввода-вывода]. Ключевым моментом является то, что драйвер [вероятно] лучше подходит для обработки всего этого. У вас может быть запрос пользовательского процесса, чтобы драйвер выполнил выделение буфера [из непрерывной памяти] и передал его обратно процессу.   -  person Craig Estey    schedule 08.08.2017
comment
не будет ли у вас многопроцессных конфликтов в одном пространстве ядра, если вам удастся раскрыть его (без копирования)?   -  person Serge    schedule 08.08.2017


Ответы (1)


Для вашего (2), как насчет MmMapLockedPagesSpecifyCache () с AccessMode = UserMode. Обратите внимание на важное предостережение: «Подпрограмма возвращает адрес пользователя, действительный в контексте процесса, в котором запущен драйвер», поэтому вам необходимо убедиться, что драйвер работает в процессе приложения пользовательского режима, когда вы выполняете отображение, то есть выполнение отображения в коде драйвера, который непосредственно обрабатывает вызов из кода пользовательского режима, например DeviceIoControl (). Также обратите внимание, что для использования этой функции вам необходимо предоставить MDL, описывающий физические страницы, и эти страницы должны быть заблокированы.

person asynchronos    schedule 09.08.2017
comment
И будьте осторожны с блокировкой страниц, иначе в вашем драйвере будет ошибка утечки памяти. Всегда раздражает необходимость перезагружать Windows, потому что какой-то драйвер заблокировал половину оперативной памяти. - person Zan Lynx; 09.08.2017