드라이버 스택
Driver stacks(원본 Microsoft Learn 링크)
아래는 위 문서의 번역이다.
디바이스 드라이버로 전송되는 대부분의 요청은 I/O 요청 패킷(I/O request packets)(IRP)으로 패키징된다. 각 디바이스는 디바이스 노드로 표현되며, 각 디바이스 노드는 디바이스 스택을 가진다. 자세한 내용은 디바이스 노드와 디바이스 스택(Device nodes and device stacks)을 참조한다. 디바이스에 읽기, 쓰기 또는 제어 요청을 보내기 위해, I/O 매니저는 해당 디바이스의 디바이스 노드를 찾은 후 그 노드의 디바이스 스택으로 IRP를 보낸다. 때로는 둘 이상의 디바이스 스택이 I/O 요청 처리에 관여하기도 한다. 관여하는 디바이스 스택의 수와 관계없이, I/O 요청에 참여하는 드라이버들의 전체 시퀀스를 해당 요청의 드라이버 스택(driver stack) 이라고 한다. 또한 드라이버 스택 이라는 용어는 특정 기술을 위한 계층화된 드라이버 집합을 가리킬 때도 사용한다.
여러 디바이스 스택이 처리하는 I/O 요청
경우에 따라 둘 이상의 디바이스 스택이 IRP 처리에 관여한다. 다음 다이어그램은 단일 IRP를 처리하는 데 네 개의 디바이스 스택이 관여하는 경우를 보여준다.
다이어그램의 각 번호 단계에서 IRP가 어떻게 처리되는지는 다음과 같다.
- IRP는 My USB Storage Device 노드의 디바이스 스택에서 기능 드라이버 역할을 하는 Disk.sys에 의해 생성된다. Disk.sys는 IRP를 디바이스 스택 아래의 Usbstor.sys로 전달한다.
- Usbstor.sys는 My USB Storage Device 노드의 PDO 드라이버이면서 USB Mass Storage Device 노드의 FDO 드라이버라는 점에 유의한다. 이 시점에서 IRP가 (PDO, Usbstor.sys) 쌍에 속하는지 (FDO, Usbstor.sys) 쌍에 속하는지 결정하는 것은 중요하지 않다. IRP는 드라이버인 Usbstor.sys가 소유하며, 드라이버는 PDO와 FDO 모두에 접근할 수 있다.
- Usbstor.sys가 IRP 처리를 마치면 IRP를 Usbhub.sys로 전달한다. Usbhub.sys는 USB Mass Storage Device 노드의 PDO 드라이버이면서 USB Root Hub 노드의 FDO 드라이버이다. IRP가 (PDO, Usbhub.sys) 쌍에 속하는지 (FDO, Usbhub.sys) 쌍에 속하는지 결정하는 것은 중요하지 않다. IRP는 드라이버인 Usbhub.sys가 소유하며, 드라이버는 PDO와 FDO 모두에 접근할 수 있다.
Usbhub.sys가 IRP 처리를 마치면 IRP를 (Usbuhci.sys, Usbport.sys) 쌍에 전달한다.
Usbuhci.sys는 미니포트 드라이버이고, Usbport.sys는 포트 드라이버이다. (미니포트, 포트) 쌍은 단일 드라이버의 역할을 한다. 이 경우 미니포트 드라이버와 포트 드라이버 모두 Microsoft에서 작성한다. (Usbuhci.sys, Usbport.sys) 쌍은 USB Root Hub 노드의 PDO 드라이버이며, 또한 USB Host Controller 노드의 FDO 드라이버이기도 하다. (Usbuhci.sys, Usbport.sys) 쌍은 호스트 컨트롤러 하드웨어와 실제로 통신하며, 이 하드웨어는 다시 물리적 USB 저장 디바이스와 통신한다.
I/O 요청의 드라이버 스택
앞의 다이어그램에서 설명한 I/O 요청에 참여한 네 드라이버의 시퀀스를 살펴보자. 디바이스 노드와 개별 디바이스 스택이 아닌 드라이버 자체에 초점을 맞춰 시퀀스를 다른 관점에서 볼 수 있다. 다음 다이어그램은 드라이버를 위에서 아래 순서대로 보여준다. Disk.sys는 하나의 디바이스 객체와 연관되지만, 나머지 세 드라이버는 각각 두 개의 디바이스 객체와 연관된다는 점에 유의한다.
I/O 요청에 참여하는 드라이버들의 시퀀스를 I/O 요청의 드라이버 스택(driver stack for the I/O request) 이라고 한다. I/O 요청의 드라이버 스택을 그릴 때는, 드라이버들이 요청에 참여하는 순서대로 위에서 아래로 그린다.
I/O 요청의 드라이버 스택은 디바이스 노드의 디바이스 스택과는 상당히 다르다는 점에 유의한다. 또한 I/O 요청의 드라이버 스택이 반드시 디바이스 트리의 한 분기 내에 머물러야 하는 것은 아니라는 점에도 유의한다.
기술 드라이버 스택
앞의 다이어그램에 나온 I/O 요청의 드라이버 스택을 살펴보자. 각 드라이버에 친숙한 이름을 부여하고 다이어그램을 약간 변형하면, Windows 드라이버 키트(WDK) 문서에 등장하는 많은 블록 다이어그램과 유사한 형태가 된다.
다이어그램에서 드라이버 스택은 세 개의 섹션으로 나뉜다. 각 섹션이 특정 기술이나 운영체제의 특정 컴포넌트 또는 부분에 속한다고 생각할 수 있다. 예를 들어 드라이버 스택 최상단의 첫 번째 섹션은 Volume Manager에, 두 번째 섹션은 운영체제의 저장소 컴포넌트에, 세 번째 섹션은 운영체제의 핵심 USB 부분에 속한다고 말할 수 있다.
세 번째 섹션의 드라이버들을 살펴보자. 이 드라이버들은 다양한 종류의 USB 요청과 USB 하드웨어를 처리하기 위해 Microsoft가 제공하는 더 큰 핵심 USB 드라이버 집합의 부분 집합이다. 다음 다이어그램은 핵심 USB 블록 다이어그램 전체가 어떤 모습일지 보여준다.
특정 기술이나 운영체제의 특정 컴포넌트 또는 부분에 대한 모든 드라이버를 보여주는 블록 다이어그램을 기술 드라이버 스택(technology driver stack) 이라고 한다. 일반적으로 기술 드라이버 스택은 USB Core 드라이버 스택, Storage 스택, 1394 드라이버 스택, Audio 드라이버 스택과 같은 이름으로 불린다.
Note
이 문서의 USB 코어 블록 다이어그램은 USB 1.0과 2.0의 기술 드라이버 스택을 나타내는 여러 방법 중 하나를 보여준다. USB 1.0, 2.0, 3.0 드라이버 스택의 공식 다이어그램은 USB Driver Stack Architecture를 참조한다.



