WINDOWS · KMDF · PCIe

같은 PCIe 카드 두 장

같은 드라이버를 쓴다고 해서 같은 장치 인스턴스인 것은 아닙니다. 패키지 매칭, 열거, 장치별 상태와 자원 소유권을 나눠 확인합니다.

VID/DID가 같아도 장치 노드는 다릅니다

동일 모델의 카드는 같은 INF 항목과 드라이버 바이너리에 매칭될 수 있습니다. 그렇다고 카드마다 별도 바이너리가 필요한 것은 아닙니다. PCI 식별자 문서에는 제조사·장치 ID 외에 SUBSYS와 REV 등을 포함한 ID 형식도 있습니다. VID/DID 두 값만 보고 전체 매칭 결과나 실제 장치의 정체성을 확정하지 않습니다.

device instance ID는 PnP 관리자가 시스템의 특정 장치 노드를 구별하기 위해 만드는 문자열입니다. 버스가 보고한 device ID, instance ID와 UniqueID 특성을 바탕으로 만들어집니다. 시스템을 다시 시작해도 식별자가 유지되어야 한다는 요구가, 카드를 다른 위치로 옮겨도 언제나 같은 물리 카드로 식별된다는 보장까지 뜻하지는 않습니다. 단순 열거 순번 i=0,1,...을 고정된 물리적 정체성으로 가정하지 않습니다.

같은 코드가 서로 다른 장치 상태를 관리합니다

WDF 개발 문서에 따르면 지원 대상 장치를 PnP 관리자가 알릴 때마다 EvtDriverDeviceAdd가 호출됩니다. 드라이버는 장치별 WDFDEVICE를 만들고 해당 장치의 문맥과 자원을 연결합니다. 한 카드의 변경 가능한 상태나 BAR 주소를 다른 카드의 값과 전역 변수 하나에 섞으면, 장치 ID가 정상이어도 요청이 잘못된 장치를 향할 수 있습니다.

두 인스턴스의 소유 관계를 구분한 자체 도식
  1. 공통 드라이버 코드

    두 장치가 같은 패키지를 사용할 수 있습니다.

  2. 장치 A의 WDFDEVICE

    A의 문맥 · 할당된 자원 · 요청과 전원 상태

  3. 장치 B의 WDFDEVICE

    B의 문맥 · 할당된 자원 · 요청과 전원 상태

이 그림은 자원을 나눠 맡는 책임을 보여 줄 뿐, DMA·인터럽트가 하드웨어에서 격리된다는 것을 입증하지는 않습니다. 장치 ID만 따로 있다고 IRQ, DMA 매핑, 전원 전환, 장치를 제거할 때의 정리가 자동으로 올바르게 이루어지는 것은 아닙니다. 공유 데이터가 필요하다면 어떤 장치가 소유하고 어떻게 동기화하는지도 별도로 설계합니다.

일반 PCIe 기능 드라이버가 자식 PDO를 다시 만들지는 않습니다

일반적인 물리 PCIe 장치는 Windows PCI 버스 드라이버 Pci.sys가 열거하고 PDO를 만듭니다. PnP 관리자는 각 PDO에 장치 노드를 연결하고, 기능 드라이버와 선택적인 필터 드라이버가 장치 스택을 구성합니다. 장치 노드와 스택이 이렇게 역할을 나눈다는 점을 먼저 확인합니다.

직접 버스 드라이버를 만들어 자식 장치를 노출해야 하는 설계라면 KMDF의 자식 PDO 생성 절차를 따릅니다. 같은 물리 카드가 여러 장 있다고 해서 이런 설계가 필요한 것은 아닙니다. device ID, instance ID, hardware ID를 지정하는 메서드의 역할도 구분합니다.

예를 들어 WdfPdoInitAssignInstanceID의 두 번째 인수는 PCUNICODE_STRING입니다. 문자열 리터럴을 직접 넘기는 코드를 완성된 KMDF 예시로 재사용하면 안 됩니다. 여기서는 빌드할 수 있는 드라이버 코드나 실제 자식 열거 구현을 제공하지 않습니다.

식별 결과와 자원 사용을 차례로 확인합니다

Windows 11 버전 21H2 이상에서는 다음 조회로 PCI 장치와 하드웨어·호환 ID를 살펴볼 수 있습니다. PnPUtil 문서에서 /enum-devices의 /bus·/deviceids 지원 버전을 확인했습니다.

pnputil /enum-devices /bus PCI /deviceids
  1. 두 장치가 별도 instance ID로 나타나는지 확인합니다.
  2. 각 장치의 패키지·INF 매칭과 장치 상태를 확인합니다.
  3. 드라이버의 장치별 문맥, BAR·인터럽트·DMA 자원이 해당 객체에 연결됐는지 비교합니다.
  4. 한 카드만 실패한다면 ID 충돌이라고 단정하지 말고, 전역 상태 혼용·제거·전원 전환 이력을 함께 조사합니다.

실제 드라이버 검증은 따로 해야 합니다

Manimehalai Selvaraj가 다시 공유한 카드를 다룬 기존 원고에서 출발해 Microsoft 문서와 대조하며 다시 정리했습니다. 원문 permalink와 첨부는 확인되지 않아 임의의 링크를 만들지 않았습니다. 위 명령을 직접 실행하거나 드라이버 설치·컴파일·카드 시험·인증 설정 변경을 하지는 않았습니다.

English summary. Driver-package matching and device-instance identity are different. Pci.sys normally enumerates physical PCI devices; a KMDF function driver owns per-device objects and state. Creating child PDOs is a bus-driver responsibility, not a universal fix for identical cards. Distinct IDs alone do not establish DMA, interrupt or lifetime correctness.