Есть Linux машина с PCI-66 интерфейсом на FPGA.
Загрузка ядра обнаружила устройство и в /proc созданы соответствующие PCI файлы и директории.
Из приложения (использовал как пример pciutils) читаю конфиг space.
Но не могу понять как мне работать с данными?
На PCI target создал 2 bar-а в memory - небольшой регистровый пул и окно для потокового чтения.
Ядро мапировало оба бара как задано и PCI настроило с method как proc
Как мне из userspace получить read/write в нужный бар?
Очевидно нужно писать еще один уровень драйвера?
Посколько в коде ядра нашел функции оперирующие с bars:
void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max)
iomap можно вызвать из userspace или он может быть только в модуле ядра или
модуль можно будет подгрузить через insmod ?
Все мои пробы кончались segmentation fault.
После чтения доков только окончательно запутался, поскольку нет понимания- как вообще правильно работать с устройствами из userspase.
Вижу что через файлы. Это понятно.
Насторожило что в pciutils КАЖДОЕ обращение закрывает/открывает дескриптор.
Это что так надо? или просто так сделано? Будут ли потери эффективности при потоковом обращении через файл таким способом?
После загрузки в proc на PCI уже имелся fd = 4. Полагаю открытый значит.
Или это "чужой", а надо заводить свой?
В общем одни вопросы, поскольку начинающий.
Подскажите кто-нибудь, или ссылку на литературу.
Как писать драйверы описано достаточно подробно, но далее у меня нет ясности, привык к хорошо документированым API, а тут полная каша, плюс еще большая часть доков а-ля 1999 год - а в OS принципиальные изменения.