Windows Driver

[Windows Driver] Device objects and device stacks

하루삼십만원 2020. 11. 13. 09:36
반응형

Device node가 무엇이고 device stack이 무엇인지 알아보자.

 

Device nodes and device stacks

 

Windows에서 device들은 Plug and Play(PnP) device tree에서 device node들에 의해 표현된다. 일반적으로 I/O requestdevice로 보낼 때, 많은 driver들이 request를 처리하는데 도움 준다. 각각의 driver들이 device object와 연결이 되어 있다. 그리고 device objects들은 stack에 배열이 된다. Driver들에 연결된 device objects의 순서를 device stack이라 한다. device node는 자체의 device stack을 가지고 있다.

 

Device nodes and the Plug and Play device tree

 

Windows Plug and Play device tree(줄여서 device tree)라고 불리는 tree 구조로 device들을 구성한다. 일반적으로 device treenodedevice나 복합(composite) device의 개별 기능을 나타낸다. 하지만 일부 nodesphysical device와 연관성이 없는 software component를 나타낸다.

 

Device tree에 있는 nodeDevice node라고 하고, Device treeroot noderoot device node라 부른다. 관례에 따라 root device nodedevice tree의 하단에 그려진다.

 

Device treePnP 환경에서 내재된(inherent) 부모/자식 관계를 나타낸다. Device tree에서 몇몇 node들은 child device들이 연결된 Bus들을 나타낸다. 예를 들면, PCI Bus nodemother board의 물리적인 PCI bus를 나타낸다. 시스템이 시작되는 중에, PnP managerPCI bus driver에게 PCI bus에 연결된 장치들을 열거하도록 요청한다. device들은 PCI Bus node은 하위 node들로 표시된다. Diagram에서 PCI Bus node(USB host controllers, audio controller, PCI express port를 포함하여) PCI Bus에 연결된 여러 device들을 위한 하위 node들을 갖고 있다.

 

PCI bus에 연결된 몇몇의 device는 그 자신이 bus가 되기도 한다. PnP manager는 마찬가지로 이 bus들에 연결된 device들을 열거하는 것을 각각의 bus들에 요청한다. 이전 diagram에서 Audio controlleraudio device가 연결되기 위한 bus임을 알 수 있다. 그리고 PCI Express portdisplay adapter가 연결된 bus이고 display adapter는 하나의 monitor가 연결된 bus이다.

 

Nodedevice 또는 bus를 나타내는 것으로 생각할지는 사용자 관점에 따라 다를 수 있다. 예를 들자면 display adapterscreen에 나타나는 frame들을 준비하는 핵심역할을 하는 device로 생각할 수 있다. 그러나 display adapter를 연결된 monitor들을 찾고 열거할 수 있는 bus로 생각할 수도 있다.

 

Device objectDEVICE_OBJECT 구조체의 객체이다. PnP device tree에 있는 각각의 device nodedevice objectsordered list를 가지고 있다. 그리고 각각의 device objectsdriver와 연관 되 있다. Device object들의 ordered list(연관된 driver들과 함께) device node를 위한 device stack이라고 불린다.

 

Device stack을 여러가지 방법으로 생각할 수 있다. 가장 공식적인 의미에서 device stack(device object, driver) 쌍의 ordered list이다. 하지만 특정 문맥에서는 device stackdevice objectsordered list라고 생각하는 것이 유용할 수 있다. 다른 맥락에서는 device stackdriver들의 ordered list라고 생각하는 것이 유용할 수 있다.

 

관례상 device stack은 상단과 하단이 있다. 첫번째 device objectdevice stack의 가장 하단에 생성된다. 마지막 device object는 생성 후 가장 상단에 연결된다.

 

다음 diagram에서 Proseware Gizmo device node3(device object, driver)을 포함한 device stack을 가지고 있다. 상단 device objectAfterThought.sys driver와 연결된 device object이다. 중간 device objectProseware.sys와 연결되어 있고, 하단 device objectPci.sys driver와 연결되어 있다. diagram중앙에 있는 PCI Bus node2(device object, driver)device stack을 가지고 있고 Pci.sysAcpi.sys와 각각 연결되어 있다.

 

How does a device stack get constructed?

 

시스템이 시작될 때, PnP manager는 각각의 bus들에게 bus에 연결된 하위 device들을 열거해 달라고 요청한다. 예를 들어 PnP managerPCI bus driver(Pci.sys)에게 PCI bus에 연결된 device들을 열거해 달라고 요청한다. 이 요청에 응답하기 위해, Pci.sysPCI bus에 연결되어 있는 각각의 device들을 위한 device object를 생성한다. 각각의 device object들을 Physical device object(PDO)라고 한다. Pci.sysPDO 집합을 만든 직후 device treediagram처럼 표시된다.

 

PnP manager는 각각의 새로 생성된 PDOdevice node에 연결한다. 그리고 어떤 drivernode를 위한 device stack의 일부가 되야 하는지를 결정하기 위해 registry를 확인한다. Device stack은 하나의 function driver만 가져야 하고 선택적으로 하나 이상의 filter driver를 가질 수 있다. Function driverdevice stackmain driverread, write device control request들을 담당하고 있다. Filter driverread, write device control request를 처리하는 데 보조적인 역할을 한다. 각각의 function driverfilter driverload될 때, 그것들은 device object를 생성하고 device stack에 붙는다. Function driver에 의해 생성된 device objectFunctional device object(FDO)라 한다. Filter driver에 의해 생성된 device objectfilter device object(Filter DO)라 한다. Device treediagram에서 이렇게 보일 것이다.

 

Diagram을 보면 한 node에서는 filter driverfunction driver의 위에 있고, 다른 한 node 에서는 filter driverfunction driver의 아래 위치해 있음을 알 수 있다. Device stack에서 Filter driverFunction driver의 위에 있을 때 upper filter driver라고 하고 아래 있을 때를 lower filter driver라 한다.

 

PDO는 항상 device stack에서 하위 device object이다. 이는 device stack이 구성되는 방식에서 비롯된다. PDO는 처음으로 생성이 되고, 추가적인 device object들은 기존 stack의 상단에 붙게 된다.

 

Note. Device를 위한 driver들이 설치될 대, installer는 어떤 driverfunction driver이고 어떤 driverfilter driver인지 판단하기 위해 information file(INF)을 사용한다. 일반적으로 INF fileMicrosoft hardware vendor에서 제공된다. Devicedriver들을 설치한 후, PnP managerregistry를 확인하여 devicefunction driver들과 filter driver들을 결정할 수 있다.

 

Bus drivers

 

앞의 diagram에서 driver Pci.sys2가지 역할을 하는 것을 볼 수 있다. 먼저, Pci.sysPCI Bus device node에 있는 FDO와 연결된다. 실제로 PCI Bus device node에서 FDO를 생성했다. 그래서 Pci.sysPCI bus를 위한 function driver이다. 두 번째로, Pci.sysPCI Bus node의 하위에 있는 PDO와 연결된다. 하위 device들을 위한 PDO들을 생성한다는 것을 기억해라. Device를 위한 PDO를 생성하는 drivernode를 위한 bus driver로 불린다.

참조 포인트가 PCI bus라면 Pci.sysfunction driver. 그러나 참조 포인트가 Proseware Gizmo device라면, Pci.sysbus driver이다. 이런 이중 역할은 PnP device tree에서 일반적이다. Busfunction driver를 하는 driverBus의 하위 device를 위한 Bus driver 역할도 한다.

 

User-mode device stacks

 

지금까지 kernel mode device stack에 대해 얘기했다. , stack에 있는 driver들은 kernel mode에서 동작한다. Device object들은 (kernel mode에서 실행 중인 code에서만 사용할 수 있는 주소 공간인) 시스템 공간에 매핑 된다.

경우에 따라서, devicekernel mode device stack외에 user mode device stack이 있는 경우도 있다. User-mode driver는 종종 User-Mode Driver Framework(UMDF)를 기반으로 한다. UMDFWindows Driver Framework에의해 제공되는 driver model중 하나이다. UMDF에서 driveruser model DLL이다. Device object들은 IWDFDevice interface를 구현하는 COM object들이다. UMDF device stack에서 device objectWDF device object(WDF DO)라 한다. 다음 diagramUSB-FX-2 device를 위한 Kernel mode device stackuser-mode device stackdevice node를 보여준다. User modekernel mode stack들의 driver들은 USB-FX-2 device를 향한 I/O request에 참여한다.

 

https://docs.microsoft.com/en-us/windows-hardware/drivers/gettingstarted/device-nodes-and-device-stacks

 

반응형