Driver에는 포괄적인 의미를 담고 있고 정말 정교한 정의를 내리긴 힘들다. 하지만, 기초적인 관점에서 Driver를 정의 하자면 Driver는 운영체제와 Device를 통신하게 하는 software component라 말할 수 있다. 예를 들어 Device로부터 특정data를 읽어와야 하는 Application이 필요가 있다고 가정하자. Application은 운영체제에 의해 수행되는 function을 호출하고 운영체제는 Driver에 의해 수행되는 function를 호출할 것이다. Device를 제작하고 제조한 곳과 동일한 회사에서 제작된 Driver는 data를 얻기 위해 device hardware와 어떻게 통신을 할지 이미 알고 있다. Driver가 device로부터 data를 얻으면 운영체제에게 돌려주고 운영체제는 data를 application에게 전달한다.
Expanding the definition
위에서의 Driver에 대한 설명은 여러가지로 단순화된 것이다.
● 모든 Driver들이 device를 만든 회사와 동일한 곳에서 제작되는 것은 아니다. 많은 경우 장치는 공개된 hardware 표준에 따라 설계된다. 이 말은 Microsoft에서 driver를 만들고 다른 device 제작자들은 driver를 제공하지 않을 수도 있다는 의미다.
● 모든 Driver들이 device와 직접적으로 통신하는 것은 아니다. 특정 I/O request(device에서 data를 읽는 것 같은) 경우처럼, stack에 쌓인 여러 driver들이 하나의 request 처리에 참여하는 경우가 많다. Stack을 시각화하는 일반적인 방법은 diagram에 표시된 것처럼 맨 위에 첫 번째 participant가 있고, 맨 아래에 마지막 participant가 있는 것이다. Stack에 있는 일부 driver들은 request의 format을 변환하면서 request 전달에 참여할 수 있다. 이러한 driver는 device와 직접적으로 통신하고 있지 않고, request를 manipulate(조작) 한 후 stack에서 더 낮은 위치에 있는 Driver에게 request를 전달한다. stack에서 device와 직접적으로 통신하는 하나의 driver를 function driver라고 한다. 보조 처리를 수행하는 driver를 filter driver라고 한다.
● 몇몇의 filter driver는 I/O request를 관찰하고 정보를 기록하지만 능동적으로 참여하지는 않는다. 예를 들어, 특정 filter driver는 다른 filter들이 정상적으로 I/O request를 처리하는지를 확인하는 verifier처럼 동작한다.
그래서 우리는 Driver가 운영체제와 device의 communication을 관찰하거나 참여하는 모든 software component라고 확장해서 정의할 수 있다.
Software drivers
우리의 확장된 정의는 거의 정확하지만, hardware device와 전혀 연관되어 있지 않은 driver들도 존재하기 때문에 아직 까지 완전하지 않다. 예를 들어, 우리가 kenel mode에서 실행 중인 code만이 접근 가능한 핵심 운영 체제 데이터 구조에 접근해야 하는 tool을 작성해야 한다고 가정하자. 우리는 2개의 component로 tool을 나눠야 한다. 하나는 User mode에서 실행되며 user interface를 제공한다. 다른 하나는 kernel mode에서 동작하며 핵심 운영체제 데이터 구조에 접근한다. User mode에서 실행되는 component를 application이라고 부르고 kernel mode에서 동작하는 component를 Software Driver라고 한다. Software driver는 hardware device와 연결되어 있지 않다.
Additional notes
Software driver는 항상 kernel mode에서 동작한다. Software driver를 사용하는 주요 이유가 kernel mode에서만 가능한 protected data에 접근하기 위함 이기 때문이다. 그러나 device driver들은 항상 kernel mode data와 resources에 접근이 필요한 것은 아니다.
아직 언급 안 한 driver category에는 Bus driver도 있다. Bus driver들을 이해하기 위해서는 device nodes와 device tree를 이해해야 한다.
지금까지 우리의 설명은 function driver의 정의를 단순화했다. 아까 function driver가 stack에서 device와 직접적으로 통신하는 driver라고 했다. PCI(Peripheral Component Interconnect) bus로 직접 연결되는 장치의 경우 해당 사항이 적용된다. PCI device를 위한 function driver는 device의 port와 memory resources에 매핑 된 주소를 얻는다. 그 주소를 이용해 function driver가 device와 직접적으로 통신한다. 그러나 대부분의 경우 device가 PCI bus에 직접적으로 연결되지 않는다. 대신 device는 PCI bus에 연결된 host bus adapter에 연결한다. 예를 들면 USB toaster는 USB host controller라고 불리는 host bus adapter에 연결된다. 그리고 이 Host bus adapter는 PCI bus에 연결되어 있다. USB toaster와 USB host controller는 둘 다 function driver를 가지고 있다. Toaster를 위한 function driver는 USB host controller를 위한 function driver에 request를 보냄으로써 간접적으로 toaster와 통신을 한다. USB host controller를 위한 function driver는 toaster와 통신을 하기 위해 USB host controller hardware와 직접적으로 통신을 한다.
docs.microsoft.com/en-us/windows-hardware/drivers/gettingstarted/what-is-a-driver-
'Windows Driver' 카테고리의 다른 글
[Windows Driver] Choosing a driver model (0) | 2020.11.14 |
---|---|
[Windows Driver] Device objects and device stacks (0) | 2020.11.13 |
[Windows Driver] User mode and kernel mode (0) | 2020.11.12 |
[Windows Driver] ‘Build.exe’ tool is replaced to ‘MSBuild.exe’ for Windows Driver build (0) | 2020.11.10 |