Как выделить физически непрерывный кусок памяти?

williamsmith61

NT. 128KB. Nonpaged.
Можно выделить в режиме ядра mmAllocateContiguousMemory, соответственно в адресном пространстве ядра, к которому доступа из пользовательского режима нету. А нужно.
Есть какие-нибудь трюки?

Alexander08

а зачем?

williamsmith61

для DMA.

Alexander08

что это?

Papazyan

Должна быть функция для замапливания в юзер пространство. На Юниксах есть, по крайней мере.

Alexander08

реально поясни зачем!

Papazyan

DMA нужен непрерывный кусок физической памяти. Вот и все объяснение.

williamsmith61

Что-то вроде есть, щас попробуем...
ЗЫ: Нашел алгоритм на сайте американского патентного бюро: http://www.freepatentsonline.com/6986016.html
Но это на крайний случай

williamsmith61

DMA-контроллер работает с физической памятью.
Что это такое пишут здесь: http://en.wikipedia.org/wiki/Direct_memory_access

psm-home

Выделить непрерывный кусок памяти в ядре. Потом с помощью объекта ядра Section поделиться этой радостью с user-mode процессом. Схема использования секции есть в документе User-Mode Interactions: Guidelines for Kernel-Mode Drivers в разделе Shared Memory -> Section Objects and Shared Views.

Dasar

DMA доступен из пользовательского режима?

Papazyan

DMA доступен из пользовательского режима?
DMA не имеет никакого отношения к режимам процессора. Если ты можешь пнуть регистр, который запускает обмен по DMA, то можно все.

Dasar

> DMA не имеет никакого отношения к режимам процессора. Если ты можешь пнуть регистр, который запускает обмен по DMA, то можно все.
а если в этот момент драйвер пнет этот же регистр в другую сторону?

kokoc88

а если в этот момент драйвер пнет этот же регистр в другую сторону?
cli

smit1

>а если в этот момент драйвер пнет этот же регистр в другую сторону?
Синхронизация доступа к железу тоже не имеет отношения к режимам процессора. Ничто не мешает двум потокам в одном драйвере друг другу нагадить, или двум разным драйверам, и что с того?

williamsmith61

Хороший документик. Как раз то что нужно. Спасибо.

smit1

>для DMA
Ваще для ентого официально вроде бы велят использовать MmMapIoSpace
ЗЫ Ваще задачи, я так понимаю, две: 1) выделить непрерывный кусок физической памяти в режиме ядра. 2) сделать его доступным в виртуальном пространстве какого-то процесса в юзер-моде
1) Копаем MmAllocateContiguousMemory / MmMapIoSpace
2) Например через IoAllocateMdl + MmBuildMdlForNonPagedPool + MmMapLockedPages (см. http://support.microsoft.com/kb/189327 , там ещё один извратный способ упомянут)
А ваще имхо самый простой путь - сделать драйвер с простеньким API, который будет сам девайс окучивать, и копировать нужные данные из/в пользовательского буфера.

smit1

>Выделить непрерывный кусок памяти в ядре. Потом с помощью объекта ядра Section поделиться этой радостью с user-mode процессом.
Я чото туплю, но чото я не понял, как можно секцию создать на уже выделенной памяти. Напиши поподробнее плиз.

psm-home

Как создать секцию на уже выделенной памяти я тоже хотел бы знать. В предыдущем постинге я имел в виду возможность выделить в драйвере кусок непрерывной физической памяти, а потом сделать ZwOpenSection/ZwMapViewOfSection на \Device\PhysicalMemory.
Оставить комментарий
Имя или ник:
Комментарий: