Совместное использование более чем буфера "4Go - PAGE_SIZE" из пространства ядра с пространством пользователя в драйвере ядра Windows

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

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

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

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

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

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

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

1 ответ

Решение

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

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

Другие вопросы по тегам