'bus'에 해당되는 글 1건

  1. 2009.09.07 PnP device의 인식 과정

Pnp(Plug and Play)를 지원하는 device는 내가 어떠한 device인지를 bus 측에 전달하도록 구성되어 있습니다. 운영체제에서는 이를 이용해서 새로 시스템에 부착된 device가 있는지 확인하고 새로 추가된 device id에 적절한 driver가 있는지 찾고 설치할 수 있도록 합니다.

PnP device가 있기 이전에는 먼저 하드웨어를 시스템에 부착한 뒤에 항상 해당 device에 대한 드라이버 및 필요한 모듈을 직접 설치했습니다. PnP 기술의 도입으로 부착된 device에 대한 identification이 가능해졌고 이를 통해서 해당 device에 적절한 driver 파일을 이미 가지고 있으면 이를 이용하고 아니면 웹 상에서 드라이버 파일을 찾거나 하는 기능도 가능해졌습니다. 즉, 사용자 입장에서는 device을 설치하는 과정이 보다 쉬워지게 되었습니다.

특히 최근에는 대부분의 device들이 USB 형태로 제작되는데 이를 통해서 대용량의 데이터를 빠르게 전송할 수 있기도 하고, USB 자체적으로 hot plugin/out을 지원하므로 운영체제의 재부팅 없이 언제든 device를 추가하고 제거 가능합니다.

그렇다면 이러한 PnP device는 어떠한 과정을 거쳐서 새로운 device가 추가되었음을 확인하고 관련 설치작업을 진행하게 되는 것일까요? 오늘은 이러한 절차에 대해서 알아보도록 하겠습니다.

다음은 전반적인 PnP device의 설치 과정을 도식화한 것입니다.

ms791103.instdev(en-us,MSDN.10).png

1. 사용자가 새로운 device를 시스템에 추가합니다.

2. 추가된 device가 있음을 해당 bus에서 인식하고, bus driver는 bus로부터 새로운 장치가 추가되었다는 hot-plug notification을 받습니다. bus driver는 이러한 사실을 PnP Manager에게 IoInvalidateDeviceRelations API를 호출함으로써 알립니다.

PnP manager는 IRP_MJ_PNP/IRP_MN_QERY_DEVICE_RELATIONS IRP를 해당 bus에 요청해서 새로운 PDO list를 얻습니다.

3. Kernel mode PnP manager는 User mode PnP manager에게 새로운 device가 추가되었음을 알립니다. User mode PnP manager는 설치 과정을 진행합니다.

4. User mode PnP manager는 device 설치를 위해서 newdev.dll을 rundll32.exe를 이용해서 새로운 프로세스를 생성합니다.

5. 생성된 프로세스에서 SetupAPI와 CfgMgr API를 호출함으로써 해당 장치에 대해 설치 가능한 driver 리스트를 만듭니다. 만약 해당 device에 대해서 사용 가능한 driver가 있으면 이를 이용하고, 없으면 device manager 상에서 unknown으로 표시합니다.

6. Class installer와 co-installers가 DIF 요청을 처리하게 설치 과정에 참여할 수 있습니다. 설치에 해당 device의 INF 파일의 Version 섹션에서 제공하는 Class와 ClassGUID를 이용해서 어떠한 device setup class를 사용할 지를 결정합니다.

7. 드라이버를 로드하고 해당 device를 start 시키기 위해 다시 제어를 kernel mode PnP manager로 전달합니다.

8. Kenrel mode PnP manager는 해당 function driver 및 기타 필요한 filter driver를 로드하고, 각 driver에 대해서 AddDevice routine을 호출합니다. 필요한 경우 IRP_MN_START_DEVICE를 device driver에 전달해서 해당 device를 start 시킵니다.

9. (optional)DIF_NEWDEVICEWIZARD_FINISHINSTALL 요청을 보내서 Install 완료 페이지를 보여주는 등의 작업을 진행할 수 있습니다.

10. 모든 작업이 완료되었으면 DIF_FINISHINSTALL_ACTION을 보냅니다.

*참고문헌

'Programming' 카테고리의 다른 글

Virtual PC를 이용한 Kernel debugging  (0) 2009.09.09
Device Stack와 Driver loading 순서  (0) 2009.09.07
Wow64 - Registry Redirection  (0) 2009.09.01
Wow64에 대해서  (0) 2009.09.01
Symbol file에 대해서  (0) 2009.08.05
Posted by noenemy
,