금요일, 7월 12, 2013

Device nodes and device stacks

Device nodes and device stacks

Windows에서 장치들은 Pnp Device tree의 Device node로 구성된다.
일반적으로 I/O Request이 Device로 보내졌을때, 몇몇 driver들이 해당 Request를 처리를 한다.
이들 driver들은 각각 device object와 연계되어 있어고 이 연계된 device object들은 Stack구조를 이루고 있다.
관련된 driver들이 속한 device object들의 나열을 device stack이라 부른다. 각 device node들은 각각의 device stack을 갖는다.
=> Device node는 device Stack을 갖으며, 이 Deice stack은 몇몇의 driver들로 구성된다.(device node => Device stack > Device object >= Driver)

device node들과 the Plug and Play device tree
Windows는 장치들을 the Plug and Play device tree(혹은 단순히 device tree라 부른다)라 불리우는 tree 구조로 구성한다.
일반적으로, Device tree에서 node는 장치 또는 복합 장치의 개별 기능(function)을 나타낸다.
하지만, 어떤 node들은 물리적 장치와 관련 없는 software들로 구성된다.

Device tree에서 Node는 device node라 불린다. Device tree에서 최상위 Node는  root device node라 부른다.
대게 root device node는 아래의 그림과 같이 device tree의 제일 아래에 그린다.



Device tree는 PnP환경하에서 부/자 관계로 표시된다.
Device tree에서 어떤 node는 그들과 연결된 하위 device들을 갖는 버스(Bus)들로 표시된다.
예를 들어,  PCI Bus node는 메인보드의 물리적 PCI Bus를 나타낸다.
시스템이 시작을 하면, PnP 메니저가 PCI bus에 연결된 장치들을 나열 하도록 PCI bus driver에 요청을 한다. 이러한 장치들은 PCI Bus node의 하위로 표시된다.
위의 그림에서 PCI Bus node는 USB Host controller, Audio controller, PCI Express port등 PCI Bus node와 연결된 많은 하위 노드를 갖는다.
PCI Bus에 연결된 어떤 장치들은 그 자체가 Bus다. PnP manager가 이들 버스에 그 버스와 연결된 장치들을 나열 하도록 요청한다.
위 그림에서 우리는 Audio controller가 Audio 장치들과 연결된 Bus임을 볼 수 있다.
우리는 PCI Express port가 Display adapter와 연결된 Bus임을 볼수 있다. 그리고 display dapter는 2개의 모니터(실제 모니터는 하나만 표시됨 이거 오류임)와 연결된 bus임을 볼 수 있다.
Node는 당신이 보는 시점에 따라 장치 일수도 있고 버스 일수도 있다.
예를들어 Display adapter를 화면에 표시되는 영상을 구성하는 핵심 기능으로서 장치라 생각 할수 있다.
하지만 당신은  연결된 모니터들을 나열하고 검출하는 능력(기능)으로서 Display adapter를 버스라 생각 할수도 있는 것이다.

Device Objects와 device stacks
Device Object는 DEVICE_OBJECT 구조체의 instance이다.
PnP device tree에서 각 device node는 device oject들을 갖을 수 있고, 이들 device object들은 각각  driver와 연관되어 진다.
당신은 device stack을 여러형태로 생각 할 수 잇다. 아주 일반적으로, device stack은 device object/driver들로 이루어 져있다.
그러나 특정 상황에서 그 Device object의 정렬 된 목록으로 Device stack을 생각하는 것이 더 효율 적일 것이다.
일반적으로 Device stack은 상하위 구조를 갖는다. 첫번째 device object는 Device stack의 바닥에 만들어지고, 나중에 만들어진(혹은 부착된) device object는 device stack의 최상위에 위치한다.
아래의 그림에서 Proseware Gizmo device node는 device object/driver등이 3개으로 구성된 device stack을 가지고 있다. 가장 위에 위치한 device object는 AfterThought.sys driver와 연결되어 있고,
가운데에 위치한 device object는 Proseware.sys driver와 연결되어 있으며, 최하위에 위치한 Device object는 Pci.sys driver와 연결되어 있다.
그림 중앙에 위치한 PCI BuS node는 device object/driver등이 하나는 Pci.sys와 다른 하나는 Acpi.sys와 연결되어져 있는 2개로 구성되어 있다.



Device stack이 어떻게 만들어질까
시스템이 시작을 하면 PnP Manager는  버스와 연결된 하위 장치들을 나열 도록 각 각 Bus Driver에 요청을 한다. 예를 들어 PnP Manager는  PCI버스에 연결된 장치들을 나열 하도록 PCI Bus driver(Pci.sys)에 요청을 한다. 이러한 요청의 결과로, Pci.sys는 PCI Bus와 연결된 각 장치들의 Device Object를 생성한다. 이 장치 Object들은 각각 Physical Device Object(PDO)라 불린다. 다시말해, Pci.sys는 아래의 그림에서 볼는 바와 같이 PDO들의 집합을 생성한다.



 PnP manager는 새로이 만들어진 PDO(physical Device Object)를 연결하고 어떤 driver가 그 Node의 device stack에 필요지 결정하기위해 Registry를 검색한다.
그 Device stack은 필히 하나의 Function driver와 선택적으로 하나 혹은 그이상의 filter driver를 갖을 수 있다. Function driver는 device stack의 main driver이고 device control 요청 및 Read/Write를 처리해야한다.
이 function/filter driver가 Load됨으로서 device stack을 만들고 device object들을 생성한다. function driver가 생성한 device object는 FDO(functional device object)라 불리우고, filter driver가 생성한 device object는 Filter DO)filter device Object가 불린다.
Device tree는 아래 그림과 같다.



그림에서 보는 봐와같이 하나의 node는 function driver위에 filter driver가 있다. 그리고 다른 node안에는 filter driver가 function driver 아래에 있다.
device stack에서 function driver위에 있는 filter driver는 upper filter driver가 하고, function driver 밑에 있는 filter driver는 lower filter driver가 한다.

PDO는 항상 device stack에서 가장 아래에 존재하는 device object이다. 이것은 device stack의 생성의 결과다. PDO는 가장 처음 생성되고 추가적인 device들은 stack의 위쪽에 추가된다.
(PDO는 항상 device stack의 가장 아래에 존재하고 나머지 device object(Driver)들은 그위에 추가된다. 그리고 그 위에 다른 device들이 앞서 본봐와 같은 구조로 추가적으로 생성된다. 라고 의역해본다.)

Note
장치를 위한 driver가 install될때  installer는 어떤 driver가 function driver인지 filter인지 결정하기 위해 INF file의 정보를 이용한다.
일반적으로 INF file은 Micro$oft 혹은 Hardware vendor들에 의해 제공된다. 장치 driver가 install된후 PnP Manager는 Registry 검색을 통하여 장치의 filter/function driver를 결정 한다.

Bus Drivers
위의 그림에서, 당신은 Pci.sts driver의 두가지 역할을 볼 수 있다. 하나는 PCI Bus device node의 FDO와 결합되어져 있다. 사실 PCI Bus drivce node에서 FDO로 생성된다. 따라서 Pci.sys는 PCI Bus의 function driver이다.
두번째로, Pci.sys는 PCI Bus node에 연결된 하위 Device의 PDO와 결합되어져 있다. 즉, 하위 device를 위한 PDO로서 생성되어질때 호출 된다. Device node의 PDO로서 생성된 driver는 그 node의 Bus dirver로서 불리운다.
당신의 보는 관점이 PCI Bus라면 , Pci.sys는 Functino driver일것이지만, 당신이 보는 관점이 Proseware Gizmo device라면 Pci.sys는 Bus dirver이다. Pnp Device tree에서 이러한 두가지 역할은 일반적이다.
드라이버는 Bus에서 function driver의 역할을 수행할 뿐만 아니라. Bus의 하위 장치의 Bus driver역할을 수행한다.

User-mode deivce stacks
위에서 우리는 kernel-mode device stack에 대하여 언급하였다. 즉, kernel-mode에서 실행되는 스택에 존재 하는 driver나 device object들은 커널 모드에서 실행되는 코드에게만 유요한 시스템 영역에 메핑된다.
kernel-mode와 user-mode의 차이에 관한 정보는 User mode and Kenel mode를 참조하라.
어쩔땐, 장치들은 kernel-mode stack과 더블어 user-mode device stack을 갖기도 한다. user-mode driver는 windows driver framework에서 제공하는 driver의 한 종류인 (UMFM)User-Mode Driver Framework를 기반으로 한다.
UMDF에서 이 driver들은 user-mode DLL이다. 그리고 device object들은 IWDFDevice interface를 구현한 COM Object이다. UMDF device stack에 있는 device object는 WDF device object(WDF DO)라 부른다.
아래의 그림은 USB-FX-2 장치를 위한 user-mode device 와 kernel-mode device 및 device node를 보여주고 있다. user-mode 및 kernel-mode stack에 존재하는 driver들은 USB-FX-2 장치의 I/O요청에 모두 참여가 가능하다.




댓글 없음: