PCI 장치가 동일한 주소 공간을 공유하는 이유는 무엇입니까?

PCI 장치가 동일한 주소 공간을 공유하는 이유는 무엇입니까?

컴퓨터가 시작되면 BIOS 또는 운영 체제는 각 PCI 장치를 조사하여 원하는 주소 공간의 크기를 묻습니다. 그런 다음 적절한 공간을 할당하고 각 PCI 장치에 공간이 시작되는 위치를 알려주므로 PCI 장치는 해당 범위 내의 읽기 및 쓰기 요청에 응답할 수 있습니다.

내 질문은 왜 모든 장치에 동일한 주소 공간의 블록을 할당해야 하는가입니다. 각 장치에 고유한 주소 공간을 부여하는 것은 어떨까요?

인쇄 회로 기판에는 PCI 장치를 구별하는 "대역 외" 방법인 IDSEL 라인이 이미 있습니다. 이는 각 장치에 공간이 할당되기 전에 PCI 열거 중에 사용되는 것입니다. 그렇다면 열거 후 액세스에도 이를 사용하고 PCI 장치에 일부 디코딩 로직을 저장하는 것은 어떨까요? 그러면 좀 더 느려졌을까요?

답변1

일반적으로 그들은 그렇지 않습니다.필요동일한 주소 공간을 공유합니다. 장치의 주소 공간을 분리하는 것이 바로 IOMMU의 목적이며 다음과 같은 여러 가지 이유로 유용할 수 있습니다.

  • 가상 머신이 기본 드라이버를 사용하여 물리적 하드웨어에 직접 액세스할 수 있도록 안전하게 허용할 수 있습니다.
  • 이는 장치의 주소 지정 기능을 물리적 주소 공간에서 분리합니다. 즉, 물리적 메모리의 어느 곳에서나 첫 번째 4G 이상에서도 32비트 주소 지정 액세스 데이터만 수행할 수 있는 장치를 가질 수 있습니다.
  • 이를 통해 장치를 서로 더 철저하게 격리할 수 있으므로 시스템 보안이 크게 향상될 수 있습니다.

이것이 기본 동작이 아닌 이유와 IDSEL 라인이 이에 사용되지 않는 이유에 대해서는 PCI 디자인의 역사에 대한 지식이 많지 않기 때문에 실제로 말할 수 없습니다. 내 첫 번째 추측은 원래 ISA 카드용 드라이버를 PCI로 포팅하는 것이 더 쉽다는 것입니다(ISA는 평면 공유 주소 공간을 가정합니다). 또한 IOMMU는 설계하기 가장 쉬운 하드웨어가 아니며 최근에야 x86 플랫폼에서 널리 사용할 수 있게 되었습니다. (아직 보장되지는 않지만 많은 Intel 칩에는 아직 IOMMU가 없으며 많은 저가형 AMD 칩이 있습니다. 하지 마십시오).

PCI Express를 사용하면 장치 간에 주소 공간을 공유하는 데 실제로 이점이 있다는 점을 지적할 가치가 있습니다. 즉, 장치 간 전송을 수행할 수 있다는 점입니다(대부분의 플랫폼은 이를 제대로 지원하지 않지만). RDMA를 사용하는 대규모 그리드 설정에 매우 유용합니다(전송이 설정된 후에는 원격 시스템의 OS를 중재할 필요 없이 원격 장치에서 직접 데이터를 가져올 수 있습니다).

답변2

x86 시스템의 경우 CPU 자체는 일반 메모리 주소 공간과 IO 주소 공간이라는 두 가지 주소 공간에만 액세스할 수 있습니다. 다른 시스템에는 주소 공간이 하나만 있을 수 있습니다(예: ARM, powerpc 등). 이 두 주소 공간은 PCI 장치의 관점에서 구분됩니다. 각 주소 공간에 액세스하는 데 서로 다른 명령이 사용되며 브리지에는 각 주소 공간에 대해 별도의 구성 레지스터가 있습니다. 그러나 CPU는 이 두 주소 공간에만 액세스할 수 있으므로 연결된 모든 장치는 이 두 주소 공간에 매핑되어야 합니다. 따라서 이는 실제로 PCI의 제한이라기보다는 나머지 시스템 아키텍처의 제한입니다.

또한 PCI가 개발되었을 때 비교적 최근에 추가된 IOMMU 같은 것이 없었다는 점을 언급하고 싶습니다.

관련 정보