
WDF [윈도우를 위한 차세대 통합 드라이버 개발 모델]
- 원서명Developing Drivers with the Windows Driver Foundation (ISBN 9780735623743)
- 지은이Penny Orwick, Guy Smith, Carol Buchmiller, Annie Pearson
- 옮긴이김점갑, 최장욱
- ISBN : 9788960770294
- 45,000원
- 2008년 01월 07일 펴냄
- 페이퍼백 | 936쪽 | 188*255mm
- 시리즈 : 윈도우 시스템 프로그래밍
책 소개
차세대 통합 드라이버 모델, 윈도우 드라이버 파운데이션 WDF! 윈도우 드라이버 개발에 필요한 심층적이고도 전문적인 가이드북.
WDF 개발 팀이 직접 저술한 전문 가이드를 통해 견고한 드라이버를 개발해보자. 방대한 정보를 담고 있는 이 책으로 윈도우 개발 기술을 넓힘으로써 손쉽게 기본기를 뛰어넘을 수 있다.
최고의 프랙티스와 기법을 갖춘 지침을 얻을 수 있으며, 광범위한 코드 샘플을 통해 차세대 드라이버 모델의 난해함을 극복하고 드라이버 개발을 단순화할 수 있다.
[ 책 소개 ]
윈도우 드라이버 개발자라면 누구나 WDF로 단기간에 고품질의 드라이버를 개발할 수 있다.
수 년 동안 소프트웨어 개발자들이 마이크로소프트 윈도우 운영체제에서 동작하는 드라이버를 구현하는 것은 매우 도전적인 일이었다. 최근까지도 윈도우 드라이버 모델(WDM, Windows Driver Model)은 배우기가 힘들어 비교적 적은 그룹의 전문화된 개발자들만이 제한된 드라이버를 개발할 뿐이었다.
WDF는 안정된 윈도우 드라이버를 더 쉽게 구현하고 더 쉽게 배울 수 있는 드라이버 모델을 제공한다. WDF는 WDM을 대부분 대체하고 개발자가 운영체제의 복잡성보다는 제어해야 할 하드웨어의 요구 사항에만 집중하게 설계됐다. WDF는 이전에 커널 모드의 드라이버를 필요로 했던 주요 장치에 대해 유저 모드에서 동작하는 드라이버를 만들 수 있는 기능을 지원함으로써 시스템의 안정성을 향상시킨다.
WDF 프로그래밍 모델을 이용하면 대부분의 이벤트 처리는 WDF가 담당함으로써 개발자는 간단하지만 기능을 갖춘 드라이버를 단기간에 구현할 수 있다. 개발자는 이때부터 드라이버가 처리할 이벤트를 조금씩 늘려가면서 드라이버의 완전한 기능을 갖출 수 있다.
이 책은 윈도우 드라이버 개발에 관심 있거나 이전에 드라이버를 개발해 본 경험이 없는 소프트웨어 프로그래머에게 WDF를 소개하기 위해 설계됐다. 또한 WDF 구조를 설계하고 프레임워크를 만들고 프로그래머를 가이드할 예제 드라이버를 개발한 마이크로소프트 WDF 개발 팀의 파트너십 아래 작성됐다. WDF 구조와 프로그래밍 모델이라는 수준 높은 토론에서 시작하지만 이 책의 대부분은 예제를 통해 윈도우 드라이버 개발에 필요한 WDF 프레임워크를 소개할 수 있도록 실용적으로 고안됐다.
[ 이 책에서 다루는 내용 ]
● WDF을 사용한 커널 모드나 유저 모드 드라이버 개발
● 최소의 코드로써 플러그앤플레이와 전원 관리 지원이 가능한 드라이버 개발
● 견고한 I/O 핸들링 코드 구현
● 동기화와 병행성의 효과적인 관리
● 프로토콜과 시리얼 버스 기반의 디바이스에 대한 유저 모드 드라이버 개발
● USB 디바이스를 신속하게 개발하기 위한 프레임워크의 USB 기능 사용하기
● DMA 디바이스를 위한 커널 모드 드라이버 설계와 구현
● 소스 코드 분석과 정적 검증 툴을 이용한 드라이버 평가
● 드라이버 테스트와 디버그, 설치에 적용할 최고의 프랙티스 기법
[ 이 책의 대상 ]
윈도우 드라이버 구현에 흥미가 있으며, C 또는 C++ 언어를 사용하는 프로그래밍에 기초가 있는 개발자를 대상으로 한다.
■ WDF를 사용해 드라이버 구현 방법을 배우는 데 관심이 있는 드라이버 개발자: 경험이 있는 드라이버 개발자라면 새로운 모델에 쉽게 적응할 것이다. 하지만 WDF 유저 모드 드라이버는 COM 기반이라서 필요한 COM 프로그래밍에 대한 기본적인 소개를 한다.
■ 드라이버 개발을 시작하고자 하는 애플리케이션 개발자: WDF는 이전의 드라이버 모델(WDM)보다 쉽게 배울 수 있지만 애플리케이션은 드라이버, 특히 커널 모드 드라이버와는 많은 측면에서 매우 다르다. 윈도우 드라이버의 구조와 동작의 이해를 돕기 위해 기본적인 배경 정보를 제공한다. 이 배경 정보는 드라이버 개발에 대해 언급할 때 계속 사용된다.
■ 드라이버와 장치가 어떻게 연동하는지를 이해하고자 하는 하드웨어 엔지니어: WDF의 빠른 프로토타이핑(prototyping) 기능과 쉽게 배울 수 있는 기능을 통해 초기 하드웨어에서 구동할 드라이버를 만들어야 하는 엔지니어는 WDF 모델이 매우 유용하다는 것을 알 수 있을 것이다.
WDF에서 유저 모드 드라이버를 개발하려면 C++를 이해해야 하지만 커널 모드 드라이버는 항상 C로 작성된다. 두 언어 중에 하나라도 능숙하지 않다면 이 언어와 관련된 책을 참조해야 한다. C와 C++를 숙지하고 윈도우 프로그래밍에 익숙해졌다면 이 책은 WDF 드라이버를 시작하는 데 필요한 개념, 가이드라인, 프로그래밍 예제, 팁을 제공한다.
[ 이 책의 구성 ]
1부: 1부에서는 툴과 리소스, 윈도우 운영체제의 기본, 드라이버 개념, WDF 개론을 소개한다.
2부: WDF의 두 프레임워크는 매우 유사하지만 동일하지는 않다. 각 프레임워크는 장단점을 가진다. 2부에서는 프레임워크를 자세히 살펴볼 것이다.
3부: WDF 프레임워크의 구조와 구성 요소를 확실하게 이해했으므로 개발하는 동안 시간과 열정이 훨씬 많이 소비되는 윈도우 드라이버의 세부 사항을 살펴보자. 3부에서는 중요한 개념과 실제 상황에 대해 개괄적으로 소개한다.
4부: 사실상 커널 모드 드라이버는 윈도우 운영체제의 일부분이므로 유저 모드 드라이버와 관계없는 추가적인 복잡한 내용을 다루어야 한다. KMDF는 하드웨어 인터럽트와 다이렉트 메모리 액세스 같은 미묘한 사항을 다룰 필요도 있다. UMDF 드라이버의 경우 COM 오브젝트를 사용하고 구현하는 방법을 이해해야 한다. 4부에서는 이 주제를 심도 있게 살펴본다.
5부: 드라이버는 드라이버 개발을 위해 고안된 기술과 툴로써 빌드되고 테스트, 디버깅, 설치된다. 표준 툴뿐만 아니라 WDF는 견고한 WDF 드라이버를 쉽게 만들 수 있는 검증, 테스팅, 디버깅용 툴을 포함하고 있다.
[ 추천의 글 ]
마이크로소프트 윈도우의 핵심 커널 구성 요소를 소유하면 으레 뒤따르는 특권(또는 지저분한 일) 중의 하나는 그 구성 요소 내에서 발생하는 많은 운영체제 크래쉬를 분석해야 한다는 것이다. 필자는 I/O 매니저의 주인으로서 드라이버와 관련된 많은 문제를 디버깅할 기회가 있었고 이러한 크래쉬로부터 많은 것을 배웠다. 크래쉬 덤프를 디버깅하면서 패턴들이 나타나기 시작했다.
크래쉬를 야기하는 이런 문제를 완전히 이해하기 위해 저장 매체, 오디오, 디스플레이와 같은 다양한 장치 스택과 USB, 1394 같은 상호 연결체를 더 잘 이해해야 할 필요성을 절감했다. 그래서 윈도우 부서의 디바이스 팀 개발 리더와 드라이버 스택 검토를 시작했다. 많은 검토를 거친 후 기존 드라이버 모델이 너무나도 복잡하다는 결론을 내렸다. 마이크로소프트 사는 알맞은 추상화를 하지 않았고 드라이버 개발자에게 너무나도 많은 짐을 안겼다.
윈도우 드라이버 모델(WDM)은 14년 이상 개발에 사용되고 있다. WDM은 매우 유연하고 다양한 디바이스를 지원하지만 너무 로우레벨의 추상화를 제공한다. 윈도우 커널을 아주 깊이 이해하거나 커널 개발자들과 인연이 닿은 아주 극소수의 개발자만이 WDM을 사용했다. 현재 대부분 드라이버 개발자들은 WDM을 사용하지 않는 실정이다.
규칙이 너무 많아 이해하기도 어렵고 명확히 묘사하기도 매우 힘들었다. 플러그앤플레이와 전원 관리 지원과 같은 기본적 운영체제 기능은 윈도우 I/O 서브시스템과 잘 통합되지 않았는데, 그 이유는 플러그앤플레이 장치와 비 플러그앤플레이 장치를 동시에 수행시킬 수 있기를 원했기 때문이다. 이것은 결국 I/O 요청과 플러그앤플레이, 전원 이벤트를 동기화시켜야하는 커다란 짐을 드라이버로 떠넘기게 운영체제 설계를 몰고 갔음을 의미했다. 동기화 규칙은 복잡하고, 이해하기 어려우며, 잘 문서화돼 있지도 않다. 게다가 비동기, 취소 가능한 I/O는 초기의 운영체제(최초의 NT)부터 지원되게 설계됐지만 대부분의 드라이버는 이를 잘 처리하지 못했다.
이러한 결론이 직관적으로 명료해 보이지만 이를 검증하기 위해서는 외부 자료가 필요했다. 따라서 마이크로소프트 윈도우 XP에 온라인 크래쉬 분석(OCA)이 가능한 윈도우 에러 리포팅(WER)이라는 매우 뛰어난 기능을 포함시켰다. 윈도우가 예상치 않게 멈출 때 블루스크린상에 에러 메시지를 표시하고 시스템은 크래쉬에 대한 미니 덤프를 생성한다. 이 미니 덤프는 사용자가 크래쉬 자료를 마이크로소프트에게 보내기를 선택할 때 마이크로소프트에서 받을 수 있다. 크래쉬의 높은 빈도를 보고 드라이버 개발 방법에 대한 기본적인 변화가 필요하다는 것을 느꼈다.
드라이버 모델을 간단히 하기 위한 제안을 제시하고 우리가 발견한 사실을 입증하기 위해 조사를 한 후 여러 드라이버 개발자와 직접 마주 앉아 회의를 했다. 이러한 토론은 놀랄 만한 결론을 이끌어냈다. 대부분 드라이버 개발자는 우리의 드라이버 모델(특히 플러그앤플레이와 전원 관리, 비동기 요청의 취소)이 사용하기에 복잡하고 어렵다고 했다. 개발자들은 모두 좀 더 간단한 드라이버 모델을 선호했다. 게다가 우리가 전에 고려하지 못한 몇 가지 요구 사항도 추가했다.
첫째, 좀 더 간단한 드라이버 모델은 여러 운영체제 플랫폼에서 동작해야 한다. 하드웨어 업체들은 운영체제 버전에 관계없이 하나의 드라이버만을 작성하고 유지하기를 원했다. 최신 윈도우 버전에서만 동작하는 새로운 드라이버 모델은 수용될 수가 없었다.
둘째, 드라이버 개발자는 우리가 몇 가지 장치 클래스 특정 드라이버 모델에 사용했던 접근 방법인 소수의 API를 사용하는 데 제약을 받아서는 안 된다. 개발자는 기존 플랫폼의 드라이버 모델로부터 벗어날 수 있어야만 했다.
이러한 요구 사항을 가지고 WDF 작업을 시작했다. 목표는 모든 장치 클래스의 요구 사항을 만족시키는 차세대 드라이버 모델을 만드는 것이었다.
WDF의 경우 색다른 개발 방법론을 사용했다. 설계 초기부터 외부 드라이버 개발자를 참가시키는 설계 리뷰를 개최했다. 명세서를 만들어가면서 원탁회의(첫 번째는 2002년 11월)에 개발자들을 초대해 코딩을 시작하기도 전에 이미 많은 유용한 평가를 구했다. 이메일 계정을 지원하고 설계 선택을 위한 토론을 했던 토론 그룹을 지원했다. 다양한 내부와 외부의 얼리 어답터들이 드라이버를 작성하기 위해 우리의 프레임워크를 사용했고 매우 유용한 피드백을 주었다. 또한 WinHEC과 개발자 뉴스 그룹을 통해 많은 피드백을 찾고 구했다.
현재 WDF의 최종적 개발 모습은 여러 번의 반복 과정을 거쳐 이뤄졌다. 개발 기간 동안 얻어낸 피드백에 근거해 동기화 로직뿐만 아니라 플러그앤플레이와 전원 관리 구현을 수정했다. 특히 플러그앤플레이와 전원 관리 구현을 위해 상태도(state machines)를 사용하도록 재설계했다. 이것은 동작을 명확하게 하는 데 도움이 됐고 결과적으로 I/O와 플러그앤플레이 관계를 쉽게 이해하게 했다. WDF 드라이버를 개발함에 따라 플러그앤플레이와 전원 관리에 연관된 규칙을 발견하고 이 규칙을 상태도에 통합했다. WDF를 사용하는 가장 큰 장점은 모든 드라이버는 자동으로 잘 검증되고 잘 구조화된 플러그앤플레이와 전원 관리가 구현된 복사본을 가진다는 것이다.
우리는 OCA 자료를 보고 좀 더 확실한 방법으로 크래쉬 문제를 대처하기로 했다. OCA 자료는 예기치 않은 시스템 종료의 85%가 윈도우 커널 구성 요소가 아니라 드라이버에 의해 야기됨을 나타냈다. 분석을 통해 많은 장치 클래스(특히 USB와 블루투스, 1394 연결체) 드라이버가 커널 모드에 있을 필요가 없음을 알았다. 드라이버를 유저 모드로 옮기는 것은 이점이 많았다. 예를 들면 유저 모드 드라이버 크래쉬는 완전히 분리될 수 있고 시스템은 리부팅없이 복구될 수 있다. 유저 모드 프로그래밍 환경은 커널 모드보다 아주 간단하다. 유저 모드에서 개발자는 많은 툴을 가지고 풍부한 언어를 사용해 코드를 작성한다. WDF의 중요한 발전은 유저 모드와 커널 모드에서 동일한 드라이버 모델을 제공하는 것이다. 드라이버 모델 단순화는 시스템 크래쉬를 야기하는 많은 문제와 일맥상통하지만 버퍼 오버런, 초기화되지 않은 변수, 잘못된 시스템 루틴 사용(요청을 여러 번 완료시키기) 같은 문제를 언급하지는 않는다. 정적 분석 툴 분야의 마이크로소프트 리서치(MSR) 결과에 위에서 열거한 복잡한 문제가 언급돼 있다. MSR은 드라이버 모델 규칙을 이해할 수 있고 정형적으로 소스 코드를 분석할 수 있는 기초적인 툴을 개발했다. 이 두 가지 아이디어를 WDF의 한 부분이 된 툴에 넣기로 결정했다. 이것이 정적 드라이버 베리파이어(Verifier)와 드라이버 프리패스트(Prefast)이다.
윈도우 비스타 출시로 드라이버 개발자는 WDK를 통해 WDF 버전 1.0과 정적 툴을 사용할 수 있다. WDF와 정적 툴은 드라이버 개발 플랫폼에 훌륭한 기반을 제공한다. 윈도우 비스타 초기 출시본은 다양한 디바이스 클래스를 아우르는 17개의 KMDF 드라이버를 포함한다. 유저 모드에서 마이크로소프트 Sideshow와 윈도우 휴대용 미디어 기술은 UMDF 드라이버를 지원한다. 마이크로소프트는 현재와 미래의 장치 클래스 요구를 충족시킬 이 기반을 계속 확고히 할 것이다.
이 책은 WDF 프레임워크와 정적 툴의 핵심 사항을 포착하고 WDF와 연관된 모든 정보를 이용할 수 있는 최초의 유일한 창구이다. 이 책을 통해 드라이버 개발자(초급자일지라도)는 도움을 얻어 WDF로 빠르게 나아갈 수 있다. WDF를 통해 이전의 드라이버 모델보다 훨씬 단시간 내에 양질의 드라이버를 개발할 수 있다.
WDF 개발 팀이 직접 저술한 전문 가이드를 통해 견고한 드라이버를 개발해보자. 방대한 정보를 담고 있는 이 책으로 윈도우 개발 기술을 넓힘으로써 손쉽게 기본기를 뛰어넘을 수 있다.
최고의 프랙티스와 기법을 갖춘 지침을 얻을 수 있으며, 광범위한 코드 샘플을 통해 차세대 드라이버 모델의 난해함을 극복하고 드라이버 개발을 단순화할 수 있다.
[ 책 소개 ]
윈도우 드라이버 개발자라면 누구나 WDF로 단기간에 고품질의 드라이버를 개발할 수 있다.
- Nar Ganapathy, 마이크로소프트 사 윈도우 디바이스 익스피리언스 그룹 아키텍트
수 년 동안 소프트웨어 개발자들이 마이크로소프트 윈도우 운영체제에서 동작하는 드라이버를 구현하는 것은 매우 도전적인 일이었다. 최근까지도 윈도우 드라이버 모델(WDM, Windows Driver Model)은 배우기가 힘들어 비교적 적은 그룹의 전문화된 개발자들만이 제한된 드라이버를 개발할 뿐이었다.
WDF는 안정된 윈도우 드라이버를 더 쉽게 구현하고 더 쉽게 배울 수 있는 드라이버 모델을 제공한다. WDF는 WDM을 대부분 대체하고 개발자가 운영체제의 복잡성보다는 제어해야 할 하드웨어의 요구 사항에만 집중하게 설계됐다. WDF는 이전에 커널 모드의 드라이버를 필요로 했던 주요 장치에 대해 유저 모드에서 동작하는 드라이버를 만들 수 있는 기능을 지원함으로써 시스템의 안정성을 향상시킨다.
WDF 프로그래밍 모델을 이용하면 대부분의 이벤트 처리는 WDF가 담당함으로써 개발자는 간단하지만 기능을 갖춘 드라이버를 단기간에 구현할 수 있다. 개발자는 이때부터 드라이버가 처리할 이벤트를 조금씩 늘려가면서 드라이버의 완전한 기능을 갖출 수 있다.
이 책은 윈도우 드라이버 개발에 관심 있거나 이전에 드라이버를 개발해 본 경험이 없는 소프트웨어 프로그래머에게 WDF를 소개하기 위해 설계됐다. 또한 WDF 구조를 설계하고 프레임워크를 만들고 프로그래머를 가이드할 예제 드라이버를 개발한 마이크로소프트 WDF 개발 팀의 파트너십 아래 작성됐다. WDF 구조와 프로그래밍 모델이라는 수준 높은 토론에서 시작하지만 이 책의 대부분은 예제를 통해 윈도우 드라이버 개발에 필요한 WDF 프레임워크를 소개할 수 있도록 실용적으로 고안됐다.
[ 이 책에서 다루는 내용 ]
● WDF을 사용한 커널 모드나 유저 모드 드라이버 개발
● 최소의 코드로써 플러그앤플레이와 전원 관리 지원이 가능한 드라이버 개발
● 견고한 I/O 핸들링 코드 구현
● 동기화와 병행성의 효과적인 관리
● 프로토콜과 시리얼 버스 기반의 디바이스에 대한 유저 모드 드라이버 개발
● USB 디바이스를 신속하게 개발하기 위한 프레임워크의 USB 기능 사용하기
● DMA 디바이스를 위한 커널 모드 드라이버 설계와 구현
● 소스 코드 분석과 정적 검증 툴을 이용한 드라이버 평가
● 드라이버 테스트와 디버그, 설치에 적용할 최고의 프랙티스 기법
[ 이 책의 대상 ]
윈도우 드라이버 구현에 흥미가 있으며, C 또는 C++ 언어를 사용하는 프로그래밍에 기초가 있는 개발자를 대상으로 한다.
■ WDF를 사용해 드라이버 구현 방법을 배우는 데 관심이 있는 드라이버 개발자: 경험이 있는 드라이버 개발자라면 새로운 모델에 쉽게 적응할 것이다. 하지만 WDF 유저 모드 드라이버는 COM 기반이라서 필요한 COM 프로그래밍에 대한 기본적인 소개를 한다.
■ 드라이버 개발을 시작하고자 하는 애플리케이션 개발자: WDF는 이전의 드라이버 모델(WDM)보다 쉽게 배울 수 있지만 애플리케이션은 드라이버, 특히 커널 모드 드라이버와는 많은 측면에서 매우 다르다. 윈도우 드라이버의 구조와 동작의 이해를 돕기 위해 기본적인 배경 정보를 제공한다. 이 배경 정보는 드라이버 개발에 대해 언급할 때 계속 사용된다.
■ 드라이버와 장치가 어떻게 연동하는지를 이해하고자 하는 하드웨어 엔지니어: WDF의 빠른 프로토타이핑(prototyping) 기능과 쉽게 배울 수 있는 기능을 통해 초기 하드웨어에서 구동할 드라이버를 만들어야 하는 엔지니어는 WDF 모델이 매우 유용하다는 것을 알 수 있을 것이다.
WDF에서 유저 모드 드라이버를 개발하려면 C++를 이해해야 하지만 커널 모드 드라이버는 항상 C로 작성된다. 두 언어 중에 하나라도 능숙하지 않다면 이 언어와 관련된 책을 참조해야 한다. C와 C++를 숙지하고 윈도우 프로그래밍에 익숙해졌다면 이 책은 WDF 드라이버를 시작하는 데 필요한 개념, 가이드라인, 프로그래밍 예제, 팁을 제공한다.
[ 이 책의 구성 ]
1부: 1부에서는 툴과 리소스, 윈도우 운영체제의 기본, 드라이버 개념, WDF 개론을 소개한다.
2부: WDF의 두 프레임워크는 매우 유사하지만 동일하지는 않다. 각 프레임워크는 장단점을 가진다. 2부에서는 프레임워크를 자세히 살펴볼 것이다.
3부: WDF 프레임워크의 구조와 구성 요소를 확실하게 이해했으므로 개발하는 동안 시간과 열정이 훨씬 많이 소비되는 윈도우 드라이버의 세부 사항을 살펴보자. 3부에서는 중요한 개념과 실제 상황에 대해 개괄적으로 소개한다.
4부: 사실상 커널 모드 드라이버는 윈도우 운영체제의 일부분이므로 유저 모드 드라이버와 관계없는 추가적인 복잡한 내용을 다루어야 한다. KMDF는 하드웨어 인터럽트와 다이렉트 메모리 액세스 같은 미묘한 사항을 다룰 필요도 있다. UMDF 드라이버의 경우 COM 오브젝트를 사용하고 구현하는 방법을 이해해야 한다. 4부에서는 이 주제를 심도 있게 살펴본다.
5부: 드라이버는 드라이버 개발을 위해 고안된 기술과 툴로써 빌드되고 테스트, 디버깅, 설치된다. 표준 툴뿐만 아니라 WDF는 견고한 WDF 드라이버를 쉽게 만들 수 있는 검증, 테스팅, 디버깅용 툴을 포함하고 있다.
[ 추천의 글 ]
마이크로소프트 윈도우의 핵심 커널 구성 요소를 소유하면 으레 뒤따르는 특권(또는 지저분한 일) 중의 하나는 그 구성 요소 내에서 발생하는 많은 운영체제 크래쉬를 분석해야 한다는 것이다. 필자는 I/O 매니저의 주인으로서 드라이버와 관련된 많은 문제를 디버깅할 기회가 있었고 이러한 크래쉬로부터 많은 것을 배웠다. 크래쉬 덤프를 디버깅하면서 패턴들이 나타나기 시작했다.
크래쉬를 야기하는 이런 문제를 완전히 이해하기 위해 저장 매체, 오디오, 디스플레이와 같은 다양한 장치 스택과 USB, 1394 같은 상호 연결체를 더 잘 이해해야 할 필요성을 절감했다. 그래서 윈도우 부서의 디바이스 팀 개발 리더와 드라이버 스택 검토를 시작했다. 많은 검토를 거친 후 기존 드라이버 모델이 너무나도 복잡하다는 결론을 내렸다. 마이크로소프트 사는 알맞은 추상화를 하지 않았고 드라이버 개발자에게 너무나도 많은 짐을 안겼다.
윈도우 드라이버 모델(WDM)은 14년 이상 개발에 사용되고 있다. WDM은 매우 유연하고 다양한 디바이스를 지원하지만 너무 로우레벨의 추상화를 제공한다. 윈도우 커널을 아주 깊이 이해하거나 커널 개발자들과 인연이 닿은 아주 극소수의 개발자만이 WDM을 사용했다. 현재 대부분 드라이버 개발자들은 WDM을 사용하지 않는 실정이다.
규칙이 너무 많아 이해하기도 어렵고 명확히 묘사하기도 매우 힘들었다. 플러그앤플레이와 전원 관리 지원과 같은 기본적 운영체제 기능은 윈도우 I/O 서브시스템과 잘 통합되지 않았는데, 그 이유는 플러그앤플레이 장치와 비 플러그앤플레이 장치를 동시에 수행시킬 수 있기를 원했기 때문이다. 이것은 결국 I/O 요청과 플러그앤플레이, 전원 이벤트를 동기화시켜야하는 커다란 짐을 드라이버로 떠넘기게 운영체제 설계를 몰고 갔음을 의미했다. 동기화 규칙은 복잡하고, 이해하기 어려우며, 잘 문서화돼 있지도 않다. 게다가 비동기, 취소 가능한 I/O는 초기의 운영체제(최초의 NT)부터 지원되게 설계됐지만 대부분의 드라이버는 이를 잘 처리하지 못했다.
이러한 결론이 직관적으로 명료해 보이지만 이를 검증하기 위해서는 외부 자료가 필요했다. 따라서 마이크로소프트 윈도우 XP에 온라인 크래쉬 분석(OCA)이 가능한 윈도우 에러 리포팅(WER)이라는 매우 뛰어난 기능을 포함시켰다. 윈도우가 예상치 않게 멈출 때 블루스크린상에 에러 메시지를 표시하고 시스템은 크래쉬에 대한 미니 덤프를 생성한다. 이 미니 덤프는 사용자가 크래쉬 자료를 마이크로소프트에게 보내기를 선택할 때 마이크로소프트에서 받을 수 있다. 크래쉬의 높은 빈도를 보고 드라이버 개발 방법에 대한 기본적인 변화가 필요하다는 것을 느꼈다.
드라이버 모델을 간단히 하기 위한 제안을 제시하고 우리가 발견한 사실을 입증하기 위해 조사를 한 후 여러 드라이버 개발자와 직접 마주 앉아 회의를 했다. 이러한 토론은 놀랄 만한 결론을 이끌어냈다. 대부분 드라이버 개발자는 우리의 드라이버 모델(특히 플러그앤플레이와 전원 관리, 비동기 요청의 취소)이 사용하기에 복잡하고 어렵다고 했다. 개발자들은 모두 좀 더 간단한 드라이버 모델을 선호했다. 게다가 우리가 전에 고려하지 못한 몇 가지 요구 사항도 추가했다.
첫째, 좀 더 간단한 드라이버 모델은 여러 운영체제 플랫폼에서 동작해야 한다. 하드웨어 업체들은 운영체제 버전에 관계없이 하나의 드라이버만을 작성하고 유지하기를 원했다. 최신 윈도우 버전에서만 동작하는 새로운 드라이버 모델은 수용될 수가 없었다.
둘째, 드라이버 개발자는 우리가 몇 가지 장치 클래스 특정 드라이버 모델에 사용했던 접근 방법인 소수의 API를 사용하는 데 제약을 받아서는 안 된다. 개발자는 기존 플랫폼의 드라이버 모델로부터 벗어날 수 있어야만 했다.
이러한 요구 사항을 가지고 WDF 작업을 시작했다. 목표는 모든 장치 클래스의 요구 사항을 만족시키는 차세대 드라이버 모델을 만드는 것이었다.
WDF의 경우 색다른 개발 방법론을 사용했다. 설계 초기부터 외부 드라이버 개발자를 참가시키는 설계 리뷰를 개최했다. 명세서를 만들어가면서 원탁회의(첫 번째는 2002년 11월)에 개발자들을 초대해 코딩을 시작하기도 전에 이미 많은 유용한 평가를 구했다. 이메일 계정을 지원하고 설계 선택을 위한 토론을 했던 토론 그룹을 지원했다. 다양한 내부와 외부의 얼리 어답터들이 드라이버를 작성하기 위해 우리의 프레임워크를 사용했고 매우 유용한 피드백을 주었다. 또한 WinHEC과 개발자 뉴스 그룹을 통해 많은 피드백을 찾고 구했다.
현재 WDF의 최종적 개발 모습은 여러 번의 반복 과정을 거쳐 이뤄졌다. 개발 기간 동안 얻어낸 피드백에 근거해 동기화 로직뿐만 아니라 플러그앤플레이와 전원 관리 구현을 수정했다. 특히 플러그앤플레이와 전원 관리 구현을 위해 상태도(state machines)를 사용하도록 재설계했다. 이것은 동작을 명확하게 하는 데 도움이 됐고 결과적으로 I/O와 플러그앤플레이 관계를 쉽게 이해하게 했다. WDF 드라이버를 개발함에 따라 플러그앤플레이와 전원 관리에 연관된 규칙을 발견하고 이 규칙을 상태도에 통합했다. WDF를 사용하는 가장 큰 장점은 모든 드라이버는 자동으로 잘 검증되고 잘 구조화된 플러그앤플레이와 전원 관리가 구현된 복사본을 가진다는 것이다.
우리는 OCA 자료를 보고 좀 더 확실한 방법으로 크래쉬 문제를 대처하기로 했다. OCA 자료는 예기치 않은 시스템 종료의 85%가 윈도우 커널 구성 요소가 아니라 드라이버에 의해 야기됨을 나타냈다. 분석을 통해 많은 장치 클래스(특히 USB와 블루투스, 1394 연결체) 드라이버가 커널 모드에 있을 필요가 없음을 알았다. 드라이버를 유저 모드로 옮기는 것은 이점이 많았다. 예를 들면 유저 모드 드라이버 크래쉬는 완전히 분리될 수 있고 시스템은 리부팅없이 복구될 수 있다. 유저 모드 프로그래밍 환경은 커널 모드보다 아주 간단하다. 유저 모드에서 개발자는 많은 툴을 가지고 풍부한 언어를 사용해 코드를 작성한다. WDF의 중요한 발전은 유저 모드와 커널 모드에서 동일한 드라이버 모델을 제공하는 것이다. 드라이버 모델 단순화는 시스템 크래쉬를 야기하는 많은 문제와 일맥상통하지만 버퍼 오버런, 초기화되지 않은 변수, 잘못된 시스템 루틴 사용(요청을 여러 번 완료시키기) 같은 문제를 언급하지는 않는다. 정적 분석 툴 분야의 마이크로소프트 리서치(MSR) 결과에 위에서 열거한 복잡한 문제가 언급돼 있다. MSR은 드라이버 모델 규칙을 이해할 수 있고 정형적으로 소스 코드를 분석할 수 있는 기초적인 툴을 개발했다. 이 두 가지 아이디어를 WDF의 한 부분이 된 툴에 넣기로 결정했다. 이것이 정적 드라이버 베리파이어(Verifier)와 드라이버 프리패스트(Prefast)이다.
윈도우 비스타 출시로 드라이버 개발자는 WDK를 통해 WDF 버전 1.0과 정적 툴을 사용할 수 있다. WDF와 정적 툴은 드라이버 개발 플랫폼에 훌륭한 기반을 제공한다. 윈도우 비스타 초기 출시본은 다양한 디바이스 클래스를 아우르는 17개의 KMDF 드라이버를 포함한다. 유저 모드에서 마이크로소프트 Sideshow와 윈도우 휴대용 미디어 기술은 UMDF 드라이버를 지원한다. 마이크로소프트는 현재와 미래의 장치 클래스 요구를 충족시킬 이 기반을 계속 확고히 할 것이다.
이 책은 WDF 프레임워크와 정적 툴의 핵심 사항을 포착하고 WDF와 연관된 모든 정보를 이용할 수 있는 최초의 유일한 창구이다. 이 책을 통해 드라이버 개발자(초급자일지라도)는 도움을 얻어 WDF로 빠르게 나아갈 수 있다. WDF를 통해 이전의 드라이버 모델보다 훨씬 단시간 내에 양질의 드라이버를 개발할 수 있다.
Nar Ganapathy
마이크로소프트 사 윈도우 디바이스 익스피리언스 그룹 아키텍트
마이크로소프트 사 윈도우 디바이스 익스피리언스 그룹 아키텍트