Доброго времени суток!
Допустим есть некоторое PCI-устройство с памятью (видеокарта), и необходимо дать приложению из User-Space записать что-то в память этого устройства.
Если я правильно понял, то адресное пространство устройства в таком случае отображается на реальное адресное пространство ЦП. Диапазон адресов такого отображение можно увидеть с помощью /proc/iomem. Как я понимаю, отбражение выполняется системой (мб. железом или самим ядром) без участия драйвера непосредственно устройства, это так?
Далее по запросу соответствующий модуль должен сделать отображение из диапазона адресов устройства в виртуальное адресное пространство приложения User-Space, и делается это функцией do_mmap. Как правильно её вызвать и отранслировать адреса?
Правилен ли такой вызов: do_mmap(NULL, <адрес>, <размер>, <флаги защиты>, <флаги памяти>, <смещение>).
В этом вызове я не до конца понял, что имено означают пара значений <адрес> и <смещение>, и какой адрес вернет сама функция - в пространстве ядра или в пространстве вызвавщего процесса?
Как должен выглядеть вызов функции когда надо получить 10-ый мегабайт из устройства, если результат lspci: Memory at c0000000 (64-bit, prefetchable) [size=256M]
Или может я не в ту сторону смотрю и необходимо использовать remap_pfn_range?
Спасибо!