PCI 디바이스 구성 공간에 액세스

PCI(주변 장치 구성 요소 상호 연결) 디바이스에 대한 일부 작업은 디바이스의 함수 드라이버용으로 예약되어 있습니다. 예를 들어 이러한 작업에는 버스의 디바이스별 구성 공간에 액세스하고 DMA(직접 메모리 액세스) 컨트롤러를 프로그래밍하는 작업이 포함됩니다. Microsoft는 다음 두 가지 방법으로 PCI 디바이스의 구성 공간에 액세스하기 위한 시스템 지원을 제공합니다.

참고

Windows 10 버전 2004부터 디바이스에 SDEV(Secure Devices) ACPI 테이블과 가상화 기반 보안이 사용하도록 설정된 경우 PCI 디바이스 구성 공간에 액세스하기 위한 지원되지 않는 메서드에 제한이 적용됩니다. 드라이버 또는 프로세스가 위에 나열되지 않은 메서드를 사용하여 PCI 디바이스 구성 공간을 읽거나 조작하려고 하면 액세스가 차단되고 시스템 버그 검사 발생합니다.

Windows XP 및 Windows Server 2003 이상 운영 체제는 PCI Local Bus 사양에 정의된 구성 공간 헤더와 기능 연결된 목록의 모든 기능을 단독으로 제어할 수 있습니다. 드라이버는 이러한 레지스터를 수정하려고 시도해서는 안 됩니다.

그러나 드라이버는 IRP_MN_WRITE_CONFIG 요청 또는 BUS_INTERFACE_STANDARD SetBusData 메서드를 사용하여 공급업체에서 정의한 헤더 또는 기능 목록에 속하지 않는 구성 공간에 쓸 수 있습니다. 드라이버는 IRP_MN_READ_CONFIG 요청 또는 BUS_INTERFACE_STANDARD GetBusData 메서드를 사용하여 디바이스의 기능을 읽을 수도 있습니다. IRP_MN_READ_CONFIG 또는 IRP_MN_WRITE_CONFIG 사용하려면 드라이버가 PASSIVE_LEVEL 실행 중이어야 합니다. 드라이버에서 쿼리할 수 있는 기능 및 해당 구조의 목록은 PCI 구조 섹션을 참조하세요.

드라이버는 IRP_MN_READ_CONFIG 요청 또는 BUS_INTERFACE_STANDARD GetBusData 메서드를 사용하여 확장된 PCI 디바이스 구성 공간(즉, 256바이트 이상의 구성 데이터)에서 읽을 수 있습니다. 마찬가지로 드라이버는 IRP_MN_WRITE_CONFIG 요청 또는 BUS_INTERFACE_STANDARD SetBusData 메서드를 사용하여 확장된 PCI 디바이스 구성 공간에 쓸 수 있습니다. 디바이스에 확장된 구성 공간이 없거나 플랫폼에서 디바이스의 확장된 구성 공간에 대한 경로를 정의하지 않는 경우 읽기 요청은 0xFFFF 반환하고 쓰기 요청은 영향을 주지 않습니다. 작업이 성공했는지 확인하기 위해 드라이버는 읽거나 쓴 바이트 수를 검사할 수 있습니다.

PCI Express 및 PCI-X 모드 2는 256바이트보다 큰 확장된 PCI 디바이스 구성 공간을 지원합니다. 드라이버는 적절한 하드웨어 및 BIOS 지원을 통해서만 이 구성 공간을 읽고 쓸 수 있습니다. ACPI BIOS 내에서 루트 버스에는 PNP0A08 또는 PNP0A03 PNP ID가 있어야 합니다. PNP ID가 PNP0A03 루트 버스의 경우 함수 4가 있는 _DSM 메서드는 현재 모드가 PCI-X 모드 2임을 나타내야 합니다. 모든 브리지 및 디바이스는 PCI Express이거나 PCI-X 모드 2에서 작동해야 합니다.

또한 시스템은 메모리 매핑 구성 공간 액세스를 지원해야 합니다. 시스템 BIOS/펌웨어에서 MCFG 테이블을 정의합니다. Windows Vista 및 Windows Server 2008 이상 운영 체제는 메모리 매핑 구성 공간 액세스를 자동으로 지원합니다.

경고

HalGetBusDataByOffsetHalSetBusDataByOffset 은 이전 버전과의 호환성을 위해 제공되지만 위의 두 메서드를 사용할 수 없는 경우에만 사용해야 합니다.

추가 정보

디바이스 구성 공간에 액세스