Linux 사용자 공간 PCI 드라이버 옵션? (uio_pci_generic)

Linux 사용자 공간 PCI 드라이버 옵션? (uio_pci_generic)

PCI 버스에 Xilinx FPGA PCIe 엔드포인트가 있습니다. Linux는 장치를 잘 인식하고 lspci의 모든 것이 완벽해 보입니다.

내 질문은 사용자 공간 PCI 액세스 옵션과 좋은 점과 나쁜 점에 관한 것입니다.

옵션 1: /sys/.../resource0을 통한 직접 액세스

(나는 지금까지 한 가지 일만 해냈습니다)

/sys/bus/pci/devices/XXXX:XX:XX.X/resource0을 열고 mmap이라고 말한 다음 mmap하고 읽기/쓰기를 할 수 있습니다. 먼저 권한을 수정하면 됩니다. 제 질문은 이것이 좋은 접근 방식인가요 아니면 나쁜 접근 방식인가요?입니다. 이것이 PCI 주소 공간에 액세스하는 데 선호되는 방법이 아닐 수도 있다고 생각하시나요?

옵션 2: uio_pci_generic 사용

이 드라이버가 실제로 연결할 수 있도록 FPGA를 성공적으로 구성했지만 인터럽트가 필요하다는 사실이 정말 짜증납니다. 이는 승인 인터럽트에 액세스하고 메모리 공간을 구성할 수 없는 것 같습니다. 이것은 나에게별로 유용하지 않은 것 같습니까? 내가 뭐 놓친 거 없니?

옵션 3: 나만의 UIO 드라이버 작성

어쩌면 이것이 합리적인 선택일까요? 이것이 얼마나 어려운지 잘 모르겠습니다. 이것의 가능한 장점 중 하나는 DMA에 액세스할 수 있어 작업 속도가 크게 빨라진다는 것입니다.

옵션 4: 완전한 맞춤형 Linux PCI 드라이버 작성

가능하다면 이 옵션은 피하고 싶습니다.

내 질문은 최선의 접근 방식이 무엇인지, 그리고 옵션 1의 구체적인 단점은 무엇인지입니다. 아니면 다른 방법을 고려해야 합니까?

(나는 데비안을 실행하고 있으며 커널은 3.14.15 rt로 패치되었습니다)

답변1

옵션 1(/sys/.../resource0을 통해 직접 액세스)

테스트에 적합하고 기능적으로 문제가 없지만 고급 작업을 수행할 수 없고 드라이버 계층 추상화가 없습니다. 나는 이 접근 방식이 사용자 프로그램이 sysfs와 상호 작용하는 방식을 짜증나게 한다고 생각하지만 그것은 아마도 내 개인적인 의견일 것입니다.

옵션 2(uio_pci_generic 사용)

uio_pci_generic이 무엇을 하는지는 모르지만 사용자 프로그램이 pci 레거시 인터럽트에 액세스하도록 허용하는 것 외에는 많은 기능을 추가하지 않는 것 같습니다. 어쨌든 MSI가 최고의 선택이기 때문에 그것은 나쁩니다.

옵션 3(사용자 정의 UIO 드라이버)

이건 해보진 않았지만 옵션 4에 비하면 좀 시간낭비인거 같아요

옵션 4(사용자 정의 커널 드라이버)

이것이 진정으로 최고의 솔루션이자 올바르게 수행할 수 있는 유일한 방법입니다. DMA 및 MSI와 같은 항목을 적절하게 처리하고 문자 장치에 대한 추상화를 원하는 만큼 제공할 수 있는 드라이버가 필요합니다. 그러나 PCI 카드 드라이버를 온라인으로 작성하는 방법에 대한 많은 문서가 있으며 커널은 관리를 위한 많은 지원을 제공합니다.

관련 정보