Как выделить физически непрерывный кусок памяти?
а зачем?
для DMA.
что это?
Должна быть функция для замапливания в юзер пространство. На Юниксах есть, по крайней мере.
реально поясни зачем!
DMA нужен непрерывный кусок физической памяти. Вот и все объяснение.
ЗЫ: Нашел алгоритм на сайте американского патентного бюро: http://www.freepatentsonline.com/6986016.html
Но это на крайний случай
Что это такое пишут здесь: http://en.wikipedia.org/wiki/Direct_memory_access
User-Mode Interactions: Guidelines for Kernel-Mode Drivers в разделе Shared Memory -> Section Objects and Shared Views.
Выделить непрерывный кусок памяти в ядре. Потом с помощью объекта ядра Section поделиться этой радостью с user-mode процессом. Схема использования секции есть в документе
DMA доступен из пользовательского режима?
DMA доступен из пользовательского режима?DMA не имеет никакого отношения к режимам процессора. Если ты можешь пнуть регистр, который запускает обмен по DMA, то можно все.
а если в этот момент драйвер пнет этот же регистр в другую сторону?
а если в этот момент драйвер пнет этот же регистр в другую сторону?cli
Синхронизация доступа к железу тоже не имеет отношения к режимам процессора. Ничто не мешает двум потокам в одном драйвере друг другу нагадить, или двум разным драйверам, и что с того?
Хороший документик. Как раз то что нужно. Спасибо.
Ваще для ентого официально вроде бы велят использовать MmMapIoSpace
ЗЫ Ваще задачи, я так понимаю, две: 1) выделить непрерывный кусок физической памяти в режиме ядра. 2) сделать его доступным в виртуальном пространстве какого-то процесса в юзер-моде
1) Копаем MmAllocateContiguousMemory / MmMapIoSpace
2) Например через IoAllocateMdl + MmBuildMdlForNonPagedPool + MmMapLockedPages (см. http://support.microsoft.com/kb/189327 , там ещё один извратный способ упомянут)
А ваще имхо самый простой путь - сделать драйвер с простеньким API, который будет сам девайс окучивать, и копировать нужные данные из/в пользовательского буфера.
Я чото туплю, но чото я не понял, как можно секцию создать на уже выделенной памяти. Напиши поподробнее плиз.
Как создать секцию на уже выделенной памяти я тоже хотел бы знать. В предыдущем постинге я имел в виду возможность выделить в драйвере кусок непрерывной физической памяти, а потом сделать ZwOpenSection/ZwMapViewOfSection на \Device\PhysicalMemory.
Оставить комментарий
williamsmith61
NT. 128KB. Nonpaged.Можно выделить в режиме ядра mmAllocateContiguousMemory, соответственно в адресном пространстве ядра, к которому доступа из пользовательского режима нету. А нужно.
Есть какие-нибудь трюки?