2014-06-05 18 views
3

나는 리눅스 배포본하에 FPGA 용 pcie 드라이버 개발을 마쳤다. 모든 것이 잘 작동합니다. 하지만 FPGA의 PCI 엔드 포인트에서 기본 주소 레지스터가 기본 주소를 얻는 곳이 궁금합니다. PCIe Endpoint를 생성 할 때 BAR의 길이를 설정할 수 있었지만 그 이상은 설정할 수 없었습니다.기본 주소 레지스터는 어떻게 주소를 얻습니까?

PCIe 드라이버에서 pci_enable_device와 같은 표준 기능을 수행하지만 특별히 기본 주소는 설정하지 않습니다.

운영 체제가 시작할 때 기본 주소를 설정합니까? 또는 어떻게 작동합니까? 측면에서는 pcie pcie 장치가 연결된 경우 운영 체제가 정상적으로 어떤 초기화 작업을 수행하는지 알고 싶습니다. 드라이버가 언로드 되더라도 lspci에서 내 pci 장치를 볼 수 있습니다.

종류는 토마스 대부분의 소비자 수준의 컴퓨터에서

답변

0

는, BAR 할당은 BIOS에서 수행 할 것으로 보인다 간주한다.

핫 플러그 ​​가능 아키텍처에서이 작업을 수행해야하거나 적어도 OS에서 트리거해야한다고 가정합니다.

1

PCI 장치의 주소 할당은 일반적으로 BIOS 수준에서 수행됩니다. x86 플랫폼을 참조하겠습니다. 우리는 시스템 주소지도를 자세히 보면, 그것은 (다르마 완 Salihun에 의해 BIOS 디스 어셈블 인술에서 촬영 한 이미지)이 같은

주소 맵에 enter image description here

될 것이라고는지도 할 수있는 전용 공간이 PCI 메모리 영역. 동일한 내용을 /proc/iomem의 출력을 사용하여 복제 할 수 있습니다.

이 구현은 플랫폼에 따라 다르며 BIOS가 플랫폼을 "인식"하므로 PCI 슬롯 전용 주소를 따로 보관합니다. 장치가 슬롯에 꽂혀 있으면 BIOS가 장치의 펌웨어와 상호 작용하고 장치의 메모리 영역을 실제로 설정하므로 운영 체제가이를 사용할 수 있습니다.

이제 드라이버 부분으로갑니다. Linux에서 드라이버는 코어 레이어 (PCI 코어), 호스트 컨트롤러 드라이버 (PCI 컨트롤러/마스터) 및 클라이언트 드라이버 (PCI 장치)를 구성하는 'Linux 장치 모델'이라는 특정 표준을 따릅니다. PCI 장치 (클라이언트)가 슬롯에 연결되면 해당 호스트 컨트롤러는 연결에 대해 알고 있고 PCI 코어에 이에 대해 알리고 따라서 lspci의 출력에 나타납니다.

lspci은 호스트 컨트롤러로 식별되는 장치를 나타내며이 경우 드라이버에 연결되거나 연결되지 않을 수 있습니다. 코어는 시스템의 드라이버를 더 통과하여 일치하는 드라이버를 찾아이 장치에 연결합니다.

lspci의 출력에서 ​​장치를 보는 이유는 호스트 컨트롤러가 장치를 식별하고 PCI 코어에 알 렸기 때문입니다. 장치에 연결된 드라이버가 있더라도 상관 없습니다.