Вариант 1 (прямой доступ через /sys/.../resource0)
Хорошо для тестирования, функционально нет ничего плохого, хотя не может делать ничего продвинутого и нет абстракции уровня драйверов. Я считаю этот метод неприглядным из-за того, как пользовательская программа взаимодействует с sysfs, но это может быть мое личное мнение.
Вариант 2 (с использованием uio_pci_generic)
Я не знаю, что делает uio_pci_generic, но, похоже, он добавляет немного функциональности, помимо разрешения вашей пользовательской программе доступа к устаревшим прерываниям pci. Это плохо, потому что в любом случае предпочтение отдается MSI.
Вариант 3 (настраиваемый драйвер uio)
Я не пробовал это, но подозреваю, что это небольшая трата времени по сравнению с вариантом 4
Вариант 4 (настраиваемый драйвер ядра )
Это действительно лучшее решение и единственный способ все делать правильно. Вам нужен драйвер, чтобы иметь возможность правильно обрабатывать такие вещи, как DMA и MSI, и иметь возможность предоставлять любую абстракцию через символьное устройство. Однако существует обширная документация о том, как писать драйверы для карт PCI в Интернете, а ядро обеспечивает большую поддержку для управления вещами.