PCIe의 주소 공간


19

PCI Express에는 4 개의 주소 공간이 있습니다.

  • 매핑 된 메모리
  • I / O 매핑
  • 구성 공간
  • 메시지

누구든지 각 주소 공간의 중요성을 설명해 주시겠습니까?

내 이해에 따라,이 모든 공간은 RAM (즉, 프로세서의 메모리)에 할당됩니다. 구성 공간은 공통 레지스터 세트 (모든 PCIe 장치에 있음)에 할당 된 공간입니다. 이 공간은 모든 PCIe 장치간에 공통입니까? 그리고 PCIe 기능 작동에 어떻게 유용합니까?

이 공간에는 BAR (기본 주소 레지스터)이 포함됩니다. 이 레지스터는 PCIe 엔드 포인트에서 사용 가능한 주소를 지정하는 데 사용됩니까?

저는 PCIe를 처음 접했고 배우려고합니다. 기본 사양을 언급하고 있지만 PCI 및 PCIe에 대한 사전 지식이있는 독자를 위해 작성된 것 같습니다.

또한 기본 사양에 대한 이해를 높이는 데 유용한 무료 온라인 참조를 참조하십시오. 루트 컴플렉스가 연결된 PCIe 장치마다 메모리 영역이 할당 될 것임을 이해합니다.

답변:


31

이것이 요청 된 이래 시간이 지났지 만 고아 질문이 싫어 :)

먼저 최신 x86 플랫폼을 지나치게 단순화하고 0x00000000에서 0xFFFFFFFF까지 32 비트의 주소 공간이 있다고 가정 해 봅시다. 모든 특수 / 예약 영역, TOLUD (사용 가능한 DRAM의 상단, 인텔 용어) 구멍 등은 모두 무시합니다 . 이 시스템 메모리 맵이라고 합니다.

둘째, PCI Express는 PCI를 확장 합니다. 소프트웨어의 관점에서 보면 매우 유사합니다.

먼저 세 번째 구성 공간으로 이동 합니다. 구성 공간을 가리키는 모든 주소는 시스템 메모리 맵 에서 할당 됩니다 . PCI 장치는 256 바이트 구성 공간을 가졌으며 PCI Express의 경우 4KB로 확장되었습니다. 이 4KB 공간은 시스템 메모리 맵에서 메모리 주소 를 사용하지만 실제 값 / 비트 / 내용은 일반적으로 주변 장치의 레지스터에 구현됩니다. 예를 들어, 공급 업체 ID 또는 장치 ID를 읽으면 사용중인 메모리 주소가 시스템 메모리 맵에 있더라도 대상 주변 장치가 데이터를 반환합니다.

당신은 이것들이 "RAM에 할당된다"고 말하였습니다. 사실이 아닙니다. 실제 비트 / 상태 저장 요소는 주변 장치에 있습니다. 그러나 이들은 시스템 메모리 맵에 맵핑됩니다. 다음으로, 모든 PCIe 장치에서 공통 레지스터 세트인지 여부를 물었습니다 (예 및 아니오). PCI 구성 공간이 작동하는 방식에 따라, 각 섹션 끝에는 읽을 "더 많은 것들"이 있는지를 나타내는 포인터가 있습니다. 모든 PCIe 장치가 구현해야하는 최소한의 수준이 있으며 고급 장치는 더 많은 기능을 구현할 수 있습니다. 기능적 운영에 얼마나 유용한 지에 관해서는, 그것은 필수적 이며 많이 활용됩니다. :)

이제 BAR (기본 주소 레지스터)에 대한 귀하의 질문은 메모리 공간과 I / O 공간에 적합합니다. 다소 x86 중심이기 때문에이 사양은 유형뿐 아니라 BAR 크기도 지정할 수 있습니다. 이를 통해 장치는 일반 메모리 매핑 BAR 또는 IO 공간 BAR을 요청할 수 있습니다.이 공간은 x86 시스템에있는 4K의 I / O 공간을 차지합니다. PowerPC 시스템에서 I / O 공간 BAR은 가치가 없음을 알 수 있습니다.

BAR은 기본적으로 호스트에게 필요한 메모리 양과 유형 (위에서 논의)을 알려주는 장치의 방법입니다. 1MB의 메모리 매핑 공간을 요청하면 BIOS에서 0x10000000 주소를 0x10100000에 할당 할 수 있습니다. 이것은 실제 RAM을 소비 하지 않고 단지 공간 만 처리합니다 (이제 32 비트 시스템이 RAM이 GB 인 고급 GPU와 같은 확장 카드에 문제가 발생하는 이유는 무엇입니까?). 이제 0x10000004라고하는 메모리 쓰기 / 읽기가 PCI Express 장치로 전송되며 이는 LED에 연결되는 바이트 전체 레지스터 일 수 있습니다. 따라서 0xFF를 실제 메모리 주소 0x10000004에 쓰면 8 개의 LED가 켜집니다. 이것이 메모리 매핑 된 I / O 의 기본 전제입니다 .

I / O 공간 은 별도의 메모리 공간 인 x86 I / O 공간에서 작동한다는 점을 제외하고 비슷하게 작동합니다. 주소 0x3F8 (COM1)은 I / O 공간과 메모리 공간에 모두 존재하며 서로 다른 두 가지입니다.

마지막 질문, 메시지 는 새로운 유형의 인터럽트 메커니즘, 메시지 신호 인터럽트 또는 MSI를 짧게 나타냅니다. 레거시 PCI 장치에는 4 개의 인터럽트 핀, INTA, INTB, INTC, INTD가 있습니다. INTA는 슬롯 0에서 INTA, 슬롯 1에서 INTB, 슬롯 2에서 INTC, 슬롯 3에서 INTD, 슬롯 4에서 INTA로 다시 돌아가도록 슬롯 사이에서 일반적으로 스위 즐되었습니다. INTA 만 구현하고 그것을 스위 즐링하여 3 개의 장치를 말하면 각 장치는 인터럽트 컨트롤러에 대한 자체 인터럽트 신호로 끝납니다. MSI는 단순히 PCI Express 프로토콜 계층을 사용하여 인터럽트 신호를 보내는 방법이며 PCIe 루트 컴플렉스 (호스트)가 CPU 인터럽트를 처리합니다.

이 답변은 너무 늦어서 도움이되지 않을 수도 있지만 향후 Google 직원 / Binger에게 도움이 될 수 있습니다.

마지막으로, 인텔에서이 책을 읽고 더 나아 가기 전에 PCIe에 대해 자세하고 상세하게 소개하는 것이 좋습니다. 또 다른 참조는 LWN의 온라인 전자 책인 Linux Device Drivers 입니다.


Post는 매우 도움이되었습니다. PCIe를 처음 접했습니다. 열거 프로세스가 진행되도록하려면 (COnfiguration 공간 할당 및 매핑) 드라이버 지원이 필요합니까, 아니면 Os에서 시작할 수 있습니다.
kamlendra

감사합니다. 도움이 되셨 다니 다행입니다. 일반적으로 x86 플랫폼에서 BIOS 소프트웨어는 PCI 장치에서 구문 분석하는 구성 공간 정보를 기반으로 일정량의 메모리 할당을 수행합니다. 최신 OS는 일반적으로이 메모리 맵을 그대로 AFAIK로 받아들이지 만 적절한 드라이버를로드하기 위해 장치를 열거하고 열거합니다. Linux에서 BIOS가 할당 한 것을 잠재적으로 변경할 수있는 흥미로운 저수준 항목을 본 것을 기억합니다.
Krunal Desai

있습니다 미리 fetchable로 표시 메모리 트랜잭션 당 하나의 DWORD보다 더 전송할 수 있습니다; 다른 모든 공간은 트랜잭션 당 하나의 DWORD 전송할 수 있습니다 . 버스트의 크기는 MAX_PAYLOAD_SIZE (수집 중에 발견)로 제한됩니다.
피터 스미스

여보세요. 저는 PCI를 처음 사용하며 귀하의 답변에 대해 약간의 설명을 원합니다. 256b / 4k 바이트의 구성 공간이 시스템 메모리에 매핑되어 있다고 언급했습니다. 본인의 개인지도를 통해 구성 공간에 대한 액세스는 시스템 메모리에 정적으로 매핑되는 PCI 컨트롤러를 통해 처리된다고 생각했습니다. 이 컨트롤러는 구성 공간에 대한 작은 인터페이스 역할을하는 몇 개의 레지스터 (장치 / 기능 식별, 주소 공간으로 오프셋, 결과 주소로)를 제공합니다. 실제로, 약 5-10 바이트 만 PCI 컨트롤러에 정적으로 예약되어 있습니다. 이게 옳은 거니 ???
Cerezo

따라서 호스트 (CPU)가 주소 0x10000004의 값 0xFF의 레지스터에 쓸 때 PCI 루트 콤플렉스는이 데이터를 가져옵니다 (아마도 항상 0x10000000에서 0x10100000까지의 주소에서 데이터를 폴링하고 주소에 씁니다) 엔드 포인트 (PCIe 장치)에서 0x04? 이 이해가 맞습니까?
AlphaGoku
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.