다음을 통해 공유


드라이버 스택

디바이스 드라이버로 전송되는 대부분의 요청은 I/O 요청 패킷(IRP)으로 패키지됩니다. 각 디바이스는 디바이스 노드로 표시되고 각 디바이스 노드에는 디바이스 스택이 있습니다. 자세한 내용은 디바이스 노드 및 디바이스 스택을 참조 하세요. 디바이스에 읽기, 쓰기 또는 제어 요청을 보내기 위해 I/O 관리자는 디바이스의 디바이스 노드를 찾은 다음 해당 노드의 디바이스 스택에 IRP를 보냅니다. I/O 요청을 처리하는 데 둘 이상의 디바이스 스택이 관련된 경우가 있습니다. 관련된 디바이스 스택 수에 관계없이 I/O 요청에 참여하는 드라이버의 전체 시퀀스를 요청에 대한 드라이버 스택이라고 합니다. 또한 드라이버 스택이라는 용어를 사용하여 특정 기술에 대한 계층화된 드라이버 집합을 참조합니다.

여러 디바이스 스택에서 처리되는 I/O 요청

경우에 따라 둘 이상의 디바이스 스택이 IRP 처리와 관련이 있습니다. 다음 다이어그램에서는 4개의 디바이스 스택이 단일 IRP 처리와 관련된 경우를 보여 줍니다.

각각 디바이스 스택이 있는 4개의 디바이스 노드 다이어그램

다이어그램의 각 번호 매기기 단계에서 IRP가 처리되는 방법은 다음과 같습니다.

  1. IRP는 Disk.sys 의해 생성됩니다. 이 드라이버는 내 USB 스토리지 디바이스 노드에 대한 디바이스 스택의 함수 드라이버입니다. Disk.sys 디바이스 스택 아래로 IRP를 전달하여 Usbstor.sys.

  2. Usbstor.sys 내 USB 스토리지 디바이스 노드의 PDO 드라이버 및 USB 대용량 스토리지 디바이스 노드의 FDO 드라이버입니다. 이 시점에서 IRP가 (PDO, Usbstor.sys) 쌍 또는 (FDO, Usbstor.sys) 쌍에 의해 소유되는지 여부를 결정하는 것은 중요하지 않습니다. IRP는 드라이버, Usbstor.sys 소유하며 드라이버는 PDO와 FDO 모두에 액세스할 수 있습니다.

  3. Usbstor.sys IRP 처리를 마치면 IRP를 전달하여 Usbhub.sys. Usbhub.sys USB 대용량 스토리지 디바이스 노드의 PDO 드라이버 및 USB 루트 허브 노드에 대한 FDO 드라이버입니다. IRP가 (PDO, Usbhub.sys) 쌍 또는 (FDO, Usbhub.sys) 쌍에 의해 소유되는지 여부를 결정하는 것은 중요하지 않습니다. IRP는 드라이버, Usbhub.sys 소유하며 드라이버는 PDO와 FDO 모두에 액세스할 수 있습니다.

  4. Usbhub.sys IRP 처리를 마치면 IRP를 (Usbuhci.sys, Usbport.sys) 쌍에 전달합니다.

    Usbuhci.sys 미니포트 드라이버이며 Usbport.sys 포트 드라이버입니다. (미니포트, 포트) 쌍은 단일 드라이버의 역할을 합니다. 이 경우 미니포트 드라이버와 포트 드라이버는 모두 Microsoft에서 작성합니다. (Usbuhci.sys, Usbport.sys) 쌍은 USB 루트 허브 노드에 대한 PDO 드라이버이며(Usbuhci.sys, Usbport.sys) 쌍은 USB 호스트 컨트롤러 노드에 대한 FDO 드라이버이기도 합니다. (Usbuhci.sys, Usbport.sys) 쌍은 호스트 컨트롤러 하드웨어와 실제 통신을 수행하며, 이 경우 실제 USB 스토리지 디바이스와 통신합니다.

I/O 요청에 대한 드라이버 스택

이전 다이어그램에 설명된 I/O 요청에 참여한 4개의 드라이버 시퀀스를 고려합니다. 디바이스 노드 및 개별 디바이스 스택이 아닌 드라이버에 집중하여 시퀀스의 또 다른 보기를 얻을 수 있습니다. 다음 다이어그램은 드라이버의 순서를 위에서 아래로 보여 주는 다이어그램입니다. Disk.sys 하나의 디바이스 개체와 연결되지만 다른 세 드라이버 각각은 두 개의 디바이스 개체와 연결됩니다.

fdo와 연결된 상위 드라이버와 pdo 및 fdo와 연결된 다른 세 드라이버를 보여 주는 드라이버 스택의 다이어그램

I/O 요청에 참여하는 드라이버 시퀀스를 I/O 요청에 대한 드라이버 스택이라고 합니다. I/O 요청에 대한 드라이버 스택을 설명하기 위해 드라이버가 요청에 참여하는 순서대로 위에서 아래로 드라이버를 그립니다.

I/O 요청에 대한 드라이버 스택은 디바이스 노드의 디바이스 스택과 매우 다릅니다. 또한 I/O 요청에 대한 드라이버 스택이 반드시 디바이스 트리의 한 분기에 남아 있는 것은 아닙니다.

기술 드라이버 스택

앞의 다이어그램에 표시된 I/O 요청에 대한 드라이버 스택을 고려합니다. 각 드라이버에 친숙한 이름을 지정하고 다이어그램을 약간 변경하는 경우 WDK(Windows 드라이버 키트) 설명서에 표시되는 많은 것과 유사한 블록 다이어그램이 있습니다.

드라이버에 대한 친숙한 이름을 보여 주는 드라이버 스택의 다이어그램: 디스크 클래스 드라이버 다음에 USB 스토리지 포트 드라이버, USB 허브 드라이버 및(usb 2 미니포트, usb 포트) 드라이버가 옵니다.

다이어그램에서 드라이버 스택은 세 개의 섹션으로 나뉩니다. 각 섹션은 특정 기술 또는 운영 체제의 특정 구성 요소 또는 부분에 속하는 것으로 간주할 수 있습니다. 예를 들어 드라이버 스택 맨 위에 있는 첫 번째 섹션이 볼륨 관리자에 속하고, 두 번째 섹션이 운영 체제의 스토리지 구성 요소에 속하며, 세 번째 섹션이 운영 체제의 핵심 USB 부분에 속한다고 말할 수 있습니다.

세 번째 섹션의 드라이버를 고려합니다. 이러한 드라이버는 Microsoft에서 다양한 종류의 USB 요청 및 USB 하드웨어를 처리하기 위해 제공하는 더 큰 핵심 USB 드라이버 집합의 하위 집합입니다. 다음 다이어그램은 전체 USB 코어 블록 다이어그램의 모양을 보여줍니다.

가능한 usb 코어 블록에 대한 기술 드라이버 스택을 보여 주는 다이어그램.

특정 기술 또는 운영 체제의 특정 구성 요소 또는 부분에 대한 모든 드라이버를 보여 주는 블록 다이어그램을 기술 드라이버 스택이라고 합니다. 일반적으로 기술 드라이버 스택에는 USB 코어 드라이버 스택, 스토리지 스택, 1394 드라이버 스택 및 오디오 드라이버 스택과 같은 이름이 지정됩니다.

참고: 이 문서의 USB 코어 블록 다이어그램은 USB 1.0 및 2.0에 대한 기술 드라이버 스택을 설명하는 몇 가지 가능한 방법 중 하나를 보여 줍니다. USB 1.0, 2.0 및 3.0 드라이버 스택의 공식 다이어그램은 USB 드라이버 스택 아키텍처를 참조 하세요.

디바이스 노드 및 디바이스 스택

미니 드라이버 및 드라이버 쌍

모든 드라이버 개발자를 위한 개념