2016-01-29 3 views
0

В настоящее время я играю с драйвером ядра Windows, чтобы лучше понять внутренние элементы Windows. В качестве проекта Toy Project я написал драйвер ядра, роль которого заключается в распределении памяти, которая может быть разделена между процессом.Совместное использование буфера «4Go - PAGE_SIZE» из пространства ядра с пользовательским пространством в драйвере ядра Windows

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

После этого небольшого успеха я хотел создать большой буфер в пространстве ядра, и я ударил стену. MDL может управлять только до «4Go - PAGE_SIZE».

Моя первая идея состояла в том, чтобы создать несколько лей с помощью MmAllocatePagesForMdl, пока я не выполнить запрос размера, ЦЕПЬ лей с помощью Далее указатель, а затем возвращает указатель на пространстве пользователя, используя MmMapLockedPagesSpecifyCache. Но MmMapLockedPagesSpecifyCache не работает с цепным MDL, он отображает только в пространстве пользователя первый MDL.

До сих пор я не нашел способ вернуть более 4 ГБ непрерывной виртуальной памяти из пространства ядра в пространстве пользователя. Выделение в Kernel Space не является проблемой, так как я использую память, чтобы физическая память не была непрерывной, но я не могу найти, как сопоставить объекты в непрерывной виртуальной памяти, которые будут использоваться в пользовательском пространстве.

Как я отношусь к жадному, и это невозможно? Или я что-то упустил, чтобы сделать это?

Для информации это 64-разрядный драйвер и 64-разрядные приложения, поэтому здесь не должно быть 32-битных ограничений.

ответ

1

Так что, глядя повсюду, невозможно использовать MDL. Чтобы иметь более 4Go, я должен создать раздел в своем драйвере. Это эквивалент CreateFileMapping в пользовательском режиме. Но я не хотел полагаться на SharedMemory, так как у меня была некоторая блокировка во время распределения/сопоставления памяти.

А затем Алекс дал мне замечательный совет по адресу osr forum, чтобы решить мою первоначальную проблему; используйте CreateFileMapping с параметром SEC_LARGE_PAGES. Блокировка памяти исчезла, и я так же быстро, как и с моим драйвером, без всех проблем, которые могут быть вызваны такой разработкой.