Драйвер PCI для пространства пользователя Linux

Я пытаюсь написать драйвер устройства PCI, который работает в пространстве пользователя. Не моя идея, чего хочет клиент. Target - это встроенная плата Linux, в которой никогда не будет больше одного пользователя. Я опытный программист на C и знаю Linux, но не знаком с разработкой драйверов для Linux.

Это действительно драйвер устройства или просто библиотека? Нужно ли мне использовать типичные вызовы pci_register_driver и т. Д., Или я могу просто получить доступ к устройству, используя fopen и используя mmap и ioperm, чтобы добраться до него?

Прерывания будут сделаны с использованием модели MSI. Также необходимо обрабатывать передачи DMA. Устройство будет передавать много данных пользователю.

На эту тему не так много информации, LDD3 посвящает ей только пару страниц, и больше ничего я не смог найти здесь, на SO.

Заранее спасибо!

2 ответа

Решение

Если драйвер, обрабатывающий PCI-карту, отсутствует, доступ к ней можно получить с помощью ioperm (или iopl - в зависимости от адреса), если требуется только доступ к порту.

Использование DMA и прерываний определенно невозможно без драйвера режима ядра.

В Google я нашел текст о чем-то вроде "универсального драйвера режима ядра", который позволяет писать драйверы пользовательского режима (включая DMA и прерывания).

Вы должны спросить своего клиента, какие драйверы режима ядра для доступа к PCI-картам установлены на плате Linux.

В настоящее время существует правильный способ создания высокопроизводительных драйверов PCI для пользовательского пространства, который называется vfio. Документации не так много, но посмотрите документацию ядра http://lxr.free-electrons.com/source/Documentation/vfio.txt и файл заголовка /usr/include/linux.vfio.h. Он доступен начиная с Linux 3.6.

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