Device Stack와 Driver loading 순서
지난 번에 설명한 바 있지만 device driver에는 여러 종류가 있습니다. 이를 크게 분류하면 다음과 같습니다.
- Bus driver - 특정 bus에 attach된 device들을 enumeration 하고 이를 관리
- Function driver - 특정 device의 동작에 대한 기능을 제공
- Filter driver – Bus 또는 Function driver의 상/하위에 위치하여 기능을 확장하거나 동작을 모니터링 하는 데 사용
그리고 각 device에 대해서 운영체제는 DEVICE_OBJECT라는 구조체 형태로 이를 관리합니다. driver의 type에 따라서 다음과 같이 각각 다른 device object로 이를 표현합니다.
- PDO – Physical Device Object. Bus driver가 사용하는 device object
- FDO – Function Device Object. Function driver가 사용하는 device object
- FiDO – Filter Device Object. Filter driver가 사용하는 device object
예를 들어 device 들은 다음과 같은 layer를 구성하여 존재하게 됩니다.
FiDO FiDO FiDO
↑ ↑ ↑
FDO FDO FDO
↑ ↑ ↑
FiDO FiDO FiDO
↑ ↑ ↑
PDO PDO PDO
↑ ↑ ↑
FiDO
↑
FDO
↑
FiDO
↑
PDO
그렇다면 이렇게 layer를 구성하는 device driver들은 어떠한 순서로 loading이 될까요? 여기서 driver의 loading이란 가상 메모리에 drvier file의 image가 맵핑 되는 것을 의미합니다. 이는 시스템에 의해서 각 driver의 AddDevice가 호출되는 순서와 관련이 있습니다. 시스템이 AddService를 호출하는 순서는 다음과 같습니다.
Device Lower Filters
–> Class lower filters
–> Function drivers
–> Device Upper Filters
–> Class Upper Filters
각 AddDevice 함수들은 DEVICE_OBJECT 구조체를 만들고 해당 PDO의 root stack에 링크 시킵니다. 즉, 실제 메모리에 로딩되는 순서보다는 AddDevice가 호출되면서 PDO 내에 stack에 링크되는 순서에 의해서 device stack이 구성되도록 구현되어 있습니다.