윈도우 디바이스 드라이버 개발환경 구축


디바이스 드라이버가 처음이신 분들이라면 , 아직 개념 및 용어 이해에 어려움이 있었을 것으로 본다 . 그것은 아마도 실제 개발을 해보지 않은 상태에서 이론적인 내용만 가지고 이해하려다 보니 어려웠을 것으로 보인다 . 그래서 , 이번 컬럼에서는 디바이스 드라이버를 실습해 볼 수 있는 개발 환경 구축에 대한 내용을 다뤄 보도록 하겠다 . 글의 내용은 윈도우 디바이스 드라이버 개발에 필요한 개발 툴 소개 , 개발 환경 구축 , 실제 컴파일 예 순서로 내용을 살펴보겠다


1.
윈도우 디바이스 드라이버 개발 툴 소개

Driver Development Kit ( DDK )
( http://www.microsoft.com/whdc/DevTools/ddk/default.mspx )
:
윈도우 디바이스 드라이버를 하기 위해 필수적인 준비해야 하는 툴로 , 드라이버 개발에 필요한 컴파일러 , 라이브러리 , 헤더 파일 이외에 도움말 문서 , 샘플 코드 , 그리고 유용한 유틸리티 등이 함께 제공된다 . DDK Windows 버전마다 출시가 되고 , 현재 Vista 가 출시된 이후로는 WDK 로 통합되었다 . DDK 버전 중에 2003 SP1 DDK 는 웹을 통해 무료로 다운로드 받을 수 있고 , 다른 버전들은 MSDN 을 통해 구할 수 있다 .


Windows Driver Kit (WDK)
( http://www.microsoft.com/whdc/DevTools/WDK/aboutWDK.mspx )
: WDK
는 기존 DDK 의 업그레이드 된 버전으로 , Windows Vista 출시에 맞춰서 나왔다 . WDK 구성 요소를 보면 기존 DDK 내용에 WDF 모델 , IFS Kit, 검증 툴 , 배포 기능 , 윈도우 로고 인증 테스트 툴 등이 추가되었다 . 하나의 툴로 개발 , 테스트 , 인증 , 디버깅을 통합하려는 목적으로 만들어졌다 . 하지만 , 용량이 커져서 설치하는데 시간이 좀 걸리는 불편함이 있다 . 현재 WDK 는 웹을 통해 무료로 다운로드 받을 수 있다 .


Windows Logo Kit ( WLK )
( http://www.microsoft.com/whdc/DevTools/WDK/aboutWDK.mspx )
(
http://www.microsoft.com/whdc/winlogo/default.mspx )
:
윈도우 로고 인증을 위한 테스트 툴들을 묶어놓은 키드이다 . ( Driver Test Manager : DTM 등등 ). 원래는 WDK 에 포함되었으나 , 사용자들의 요구로 인해 별도의 키트로 분리되었다 . 만약 여러분이 윈도우 로고 인증을 받고자 한다면 , WLK 를 설치해 테스트 결과를 가지고 윈도우 로고 프로그램을 진행하면 된다 .


Installable File System (IFS) Kit
( http://www.microsoft.com/whdc/DevTools/IFSKit/default.mspx )
:
윈도우 커널 모드 파일시스템과 파일 시스템 필터 드라이버 모델을 개발할 수 있는 키트이다 . 파일시스템 관련 샘플 소스 및 다양한 문서들을 제공하고 있다 .


WinDbg
( http://www.microsoft.com/whdc/DevTools/Debugging/default.mspx )
:
윈도우 커널 및 디바이스 드라이버 그리고 , 애플리케이션을 디버깅할 수 있는 디버거 이다 . Microsoft 에서 무료로 배포되며 , 강력한 윈도우 커널 디버깅 기능을 제공해준다 . 기존에 Soft-ICE 라는 디버거가 있을 때는 WinDbg Soft-ICE 가 윈도우 커널 디버거의 양대산맥 이었으나 , 2006 년 이후로 Soft-ICE 가 단종되는 바람에 , WinDbg 가 최강의 디버거가 되었다 .

WinDbg 를 이용한 디버깅 방법은 2 대의 PC ( 디버깅 당하는 PC , 디버깅 하는 PC ) 가 필요하고 , remote 로 연결 해 디버깅을 하게 된다 . 처음에는 PC 2 개가 필요하고 , 설정과정도 여러 단계를 거쳐야 해서 복잡하게 느껴질 수 있지만 , 설정만 잘 해 놓으면 , 그 다음부터는 디버깅 하는 데 크게 어려움이 없을 것이다 .

참고적으로 , WinDbg Windows 9x( 95/98/ME ) 계열은 지원하지 않는다 . 그래서 Windows 9x 계열은 아직도 Soft-ICE 를 사용해야 하는 상황이다 . 이유는 Microsoft 에서 Windows 9x 계열을 지원하는 제대로 된 디버거 가 없기 때문이다 . 그래서 필자도 Windows 9x 계열을 디버깅할 때는 Soft-ICE 를 사용하고 있다 .

위와 같은 개발 툴을 이해했으면 이제 툴들을 준비하자 .

필수적으로 준비할 툴들은 WDK ( or DDK ), WinDbg 툴이 될 것이다 . 그리고 소스 편집을 위한 소스에디터 정도만 있으면 드라이버 개발에 필요한 환경은 준비되었다고 볼 수 있다 .
그럼 , 이제 본격적으로 개발 툴 설치 및 실제 개발 환경에 대해서 알아보기로 하겠다 .

 

Microsoft 에서는 윈도우 버전에 따른 추천하는 driver kit, test kit 종류들을 제시하고 있다 .
(
http://www.microsoft.com/whdc/driver/foundation/WhichDDK.mspx )


If you write drivers for…

Use this driver kit

Use this test kit

Microsoft Windows Vista
( x86, x64, AMD64 )

Windows Vista WDK

Windows Logo Kit 1.0c

Microsoft Windows 2003 SP1
( x86, x64, AMD64 )

Windows Vista WDK

Windows Logo Kit 1.0c

Windows XP 64bit Edition 2003
( Itanium only )

Windows Vista WDK

Windows Logo Kit 1.0c

Windows XP 64bit Edition

Windows Vista WDK

Windows Logo Kit 1.0c

Windows XP family
( including Service Pack 2 )

Windows Vista WDK

Windows Logo Kit 1.0c

Windows 2000 family

Windows Vista WDK

Windows Logo Kit 1.0c


위의 표에서 보듯이 대부분의 윈도우 버전에서 WDK 를 사용해 드라이버를 개발하도록 권장하고 있다 . 이것은 WDK DDK 보다 새 버전의 컴파일러 및 라이브러리 지원 그리고 기타 내용들이 최신내용으로 업데이트 되었기 때문이다 . 그렇다고 예전 DDK 를 사용해 드라이버를 개발 못 하는 건 아니다 . 만약 , 지금 시점에서 처음 디바이스 드라이버 개발을 시작한다면 WDK 를 사용하길 바란다 .

 

2. WDK 설치 및 컴파일  

1) WDK 다운로드 및 설치 ( http://www.microsoft.com/whdc/DevTools/WDK/WDKpkg.mspx )
- Connect
사이트 로그인
- WDK
프로그램 등록
- WDK
다운로드 받
다운로드 받은 파일은 ISO 파일이므로 Virtual CD 디스크를 생성하거나 , CD 로 구운 후에 설치 작업을 하면 된다 .

•  디바이스 드라이버 빌드
우선 , 디바이스 드라이버를 만들기 필요한 파일 내용들을 살펴보고 , 빌드 순서에 따라 드라이버를 만들어보자


구분

내용

Sources 파일

드라이버 컴파일 설정 내용이 들어있는 파일이다 . 내용은 스크립트 형태로 만들고 , 드라이버 생성될 파일이름 , 생성 폴더 위치 , 컴파일 할 파일 목록 등의 내용이 들어간다 .
(
http://msdn2.microsoft.com/en-us/library/ms792417.aspx )

MAKEFILE 파일

드라이버 컴파일 때 사용되는 파일이지만 개발자가 이 파일에 내용을 수정할 일은 없다 . 다른 샘플 소스의 내용을 복사해서 사용해도 무방하다 .
(
http://msdn2.microsoft.com/en-us/library/ms791617.aspx )

디바이스 드라이버 소스
파일 ( *.c, *.h )

디바이스 드라이버에 실제 소스에 해당되는 파일들이다 .

Resource File ( *.rc )

드라이버 버전 정보가 들어갈 리소스 파일이다 .


- Build
순서

(1) 디바이스 드라이버 관련 파일 생성
파일을 만드는 방법은 특정 툴을 사용해 파일을 만드는 것이 아니라 , 여러분이 사용하는 편집기를 통해 위의 표에 있는 파일들을 작성하시면 됩니다 .

(2) WDK ( or DDK ) 빌드 환경 선택
WDK
툴에서는 두 가지 형태의 다양한 O/S, CPU 구조에 따른 빌드 환경을 제공한다 . 디바이스 드라이버를 어떤 형태로 만들지에 따라 빌드 환경이 선택되는데 크게 2 가지 환경으로 나눠 볼 수 있다 .

 Checked ( Debug ) 빌드 환경
: 개발자용으로 드라이버를 만들 때 사용하는 환경이고 , 컴파일 할 때 드라이버에 디버깅 정보가 추가되어진다 .


 Free ( Release )
빌드 환경

: Checked
빌드와 반대로 실제 사용자들에게 배포할 때 사용되는 빌드 환경으로 , 개발 후 최종 버전을 만들 때 이용한다 .

여러분이 개발하려는 형태에 따라 2 가지 빌드 환경 중에 한 가지를 선택하시면 된다 .

그리고 , 좀 있다가 실제 빌드 환경 화면 내용을 보겠지만 , WDK 에서는 제공되는 빌드 환경은 Visual Studio 같은 화려한 GUI 통합 개발 환경을 제공하지 않는다 . 대신 간단한 Command 창이 생성되고 , UNIX LINUX 처럼 text 모드로 명령들을 입력하는 형태이다 .

기존 GUI 개발 환경에 익숙한 개발자 분들은 불편하게 느껴질지 모르겠다 . 그래서이런 불편함을 해결하고자 Visual Studio IDE 개발 환경과 연동해서 빌드 하는 방법을 사용하고 있다 .
(
http://blog.naver.com/process3.do?Redirect=Log&logNo=20031377259 )
하지만 , 이번 컬럼 에서는 IDE 연동 환경이 아닌 기본적인 WDK 빌드 환경을 이용하겠다 .

 

(3) Build 프로그램 실행

빌드 환경을 선택하신 후에 , 디바이스 드라이버 소스가 있는 폴더로 이동한다 . 그리고 , WDK build.exe 프로그램을 실행시켜 빌드를 하게 된다 . 빌드 과정에서 컴파일 및 링킹 과정이 이루어지고 디바이스 드라이버 파일이 sources 파일에 명시된 폴더에 생성이 된다 . 만약 컴파일이나 링킹 과정에서 에러가 나오면 error 로그 내용을 분석해 수정을 하면 된다 .

참고사항으로 , build.exe 프로그램은 여러가지 옵션을 제공하고 있으니 , 필요에 따라 옵션을 선택해 빌드를 해도 된다 .

아래 그림은 이 과정을 WDK 예제 소스를 가지고 실행한 화면입니다 .



3.
디버깅 환경 구축

마지막으로 , 디버깅 환경 구축에 대해 알아보자 .간단히 환경에 대해서 설명을 하자면 , 윈도우 드라이버 디버깅 환경은 그림처럼 , Host Target 에 해당하는 PC cable remote 로 연결하고 , WinDbg 를 설치하고 설명하면 디버깅 환경 구축은 끝나게 된다 .

구분

Host ( Debugger )

Target ( Debuggee )

목적

디버깅하는 PC

디버깅 당하는 PC 디버깅할 디바이스 드라이버가 작동

작업

WinDbg 설치

Debug Mode 로 작동하도록 셋팅


그럼 , 실제 구축방법은 어떻게 되는지 하나하나 내용을 살펴보자 .

1) 사전 준비사항

a) 케이블
2
대의 PC 를 연결하기 위한 케이블을 준비해야 한다 . 현재 WinDbg 에서 지원하는 Interface Serial, 1394, USB Null Modem Serial Cable 또는 1394 Cable 사용자의 환경에 따라 Null Modem Serial Cable 또는 1394 Cable 를 준비하면 된다 .

b) WinDbg
WHDC
사이트를 통해 최신 WinDbg 버전을 다운받아 Host 컴퓨터에 설치한다 . http://www.microsoft.com/whdc/devtools/debugging/default.mspx


2) WinDbg
설정

WinDbg 설정 관련해서는 제가 직접 설명하는 것보다 , 자세히 설명된 사이트를 소개하겠다 . 참고 사이트들의 내용을 보고 , WinDbg 셋팅을 하시면 디버깅 환경 구축은 끝나게 된다 . http://blogs.technet.com/sankim/archive/2007/08/20/remote-live-debugger.aspx http://snoya.ye.ro/driver/windbg/windbg.html http://www.driveronline.org/bbs/view.asp?tb=cjhnim&GotoPage=1&s_bulu=memo&s_key=vista&no=19 http://www.driveronline.org/bbs/view.asp?tb=tipbbs&GotoPage=1&s_bulu=title&s_key=virtual&no=42 http://www.codeproject.com/debug/windbg_part1.asp



다음 시간에는 실제 디바이스 드라이버의 개념들에 대한 이론적인 내용들 및 실습 내용으로
찾아뵙도록 하겠습니다
.

출처: http://www.driveronline.org/bbs/view.asp?tb=begin&GotoPage=1&s_bulu=&s_key=&no=6
   (디바이스 드라이버 개발자 커뮤니티  - subsub)



윈도우즈 디바이스 드라이버 개발 방법

디바이스 드라이버 개발을 처음 시작하시는 분들이 가장 많이 하시는 질문은 디바이스 드라이버를 개발하려면 무엇을 어떻게 공부해야 하나요 ? ” 라는 것이다 .

일반 애플리케이션 프로그램 개발을 시작하는 경우에는 자료도 많고 , 주변에 개발자들도 많아서 공부 방법이나 자료들을 쉽게 접할 수 있는데 , 디바이스 드라이버 분야는 개발자들이 많은 분야도 아니고 , 자료도 쉽게 찾을 수도 없다 보니 입문자들에게는 어디서부터 어떻게 시작해야 할지 막막해 한다 . 간혹, 디바이스 드라이버에 열정이 있으신 분들중에는 홀로 무수한 나날을 디버깅과 테스트를 통해 개발의 고수가 되는 경우도 있다.

하지만 , 일반 개발자들은 아직도 디바이스 드라이버 개발을 위해 어떻게 준비를 해야 할지 어려워하는게 현실이다. 그래서 이런 컬럼 에서는 필자가 그 동안 경험하고 느낀 것을 토대로 초보자들도 쉽게 접근할 수 있는  개발 방법들을 소개하려고 한다 .

우선 , 디바이스 드라이버 개발 방법의 내용을 언급하기 전에 여러분이 한 가지 알아두어야 할 사항이 있다 . 이전 1 부 컬럼 에서도 언급했듯이 디바이스 드라이버와 운영체제는 서로 밀접한 관계를 맺고 있다 . 그래서 이번 컬럼에서 다루는 윈도우 디바이스 드라이버 개발 방법이 다른 운영체제들에도 동일하게 적용되지 않을 수도 있다는 것을 참고해서 글의 내용을 이해했으면 한다 .

1. 무엇을 공부해야 하나 ?
응용프로그램 , 웹 프로그래밍 , 게임 등의 프로그램들처럼 디바이스 드라이버도 소프트웨어의 한 종류로 볼 수 있다 . 그래서 일반적인 대학교의 컴퓨터 학과들에서 배우는 알고리즘 , 운영체제 , 프로그래밍 언어 , 자료구조 , 컴파일러 등등의 다양한 지식들을 기본적으로 알고 있는 것은 디바이스 드라이버를 공부하는데 하는데 많은 도움이 된다 .

하지만 , 이런 기본적인 내용들 이외에 디바이스 드라이버를 개발하기 위해서 좀 더 알아야 할 지식들이 있다 . 그 내용들에 대해서 간략히 살펴보도록 하자 .

운영체제 아키텍처 : 다른 프로그램들도 마찬가지겠지만 , 프로그램이 동작하는 기반이 되는 운영체제를 이해하지 않고서는 제대로 된 프로그램을 개발 할 수가 없다 . 그 중에서도 디바이스 드라이버는 운영체제의 커널에서 동작 하므로, 운영체제 구조 및 개념들 ( 메모리 관리 , 스케줄링 , I/O 요청의 흐름 , 동기화 등등 ) 을 제대로 이해해야 개발하는데 문제가 없게 있게 된다 . 하지만 , 윈도우는 리눅스와 같은 Open Source 운영체제가 아니고, 내부 구조가  블랙박스처럼 베일에 싸여 있다보니,  O/S 내부 내용을 공부 하려해도 항상 정확한 자료들을 가지고 아니어서 이해하는데 많은 어려움이 있다. 그래서, 이런 경우엔  직접 디버깅을 통해 알아내야 하는데이런 부분은 윈도우 운영체제를 이해하는데 어렵게 하는 부분이 되고 있다.


Windows Shared Source programs

( http://www.microsoft.com/resources/sharedsource/Licensing/default.mspx )

Microsoft 에서는 윈도우 소스코드를 공유하는Windows Shared Source programs ” 제도를 운영하고 있다 . 이 프로그램에 참여방법은 여러 가지 방법이 있는데그 중에 Microsoft MVP 자격으로 참여해 볼 수 있는 형태가 있다관심 있는 분들은 MVP 에 도전해 보길 바란다.  


•  컴퓨터 구조 및 CPU 아키텍처 : 운영체제 아키텍처를 이해하기 위해서는 먼저 컴퓨터 구조나 CPU 아키텍처의 이해가 필요하다 . , 넓은 의미로 운영체제도 CPU 및 컴퓨터 구조 기반 위에서 작동하는 프로그램이기 때문에 CPU 및 컴퓨터의 구조를 이해하는 것은 기본 중에 기본이다 . 그래서 기본적인 CPU 동작원리라던지 컴퓨터의 내부 구조에 대한 지식은 운영체제 및 드라이버를 이해하는데 필요하다.

•  C/C++ 언어 : 많이 질문하시는 내용 중에디바이스 드라이버는 어떤 언어로 개발하나요 ? ” 가 있다 . 윈도우 디바이스 드라이버 개발 시에는 C/C++ 언어 정도를 이해한다면 개발하는데 무리는 없다 . 그리고 , 가끔 디버깅 (Debugging) 이나 리버스 엔지니어링 (Reverse Engineering) 이 필요한 경우에 어셈블리 언어 (Assembly) 의 지식이 필요하다. 그렇다고 어셈블리 언어를 완벽한 이해해야 하는것은 아니다대신 남의 코드를 디버깅하는 경우 소스 코드가 어셈블리 코드로 보여 내용을 보고 분석할 줄 알아야 하는데 이때 간단히 코드를 보고 이해할 수 있을 정도의 지식이면 된다.

•  API
프로그래밍 : 디바이스 드라이버는 누군가의 요청에 의해 기능을 하게 된다 . 사용자가 GUI 를 가진 애플리케이션을 통해 I/O 요청을 하면 디바이스 드라이버가 해당 작업을 하게 되고 , 결과는 다시 애플리케이션에게 전달되는 구조를 가진다.  이처럼 디바이스 드라이버는 애플리케이션과 항상 상호작용을 한다
.
그래서, API 프로그래밍을 공부할때는 단순 API 사용법의 내용이 아닌 디바이스 드라이버와 애플리케이션 사이의 통신 및 전체 I/O 구조에 대한 내용을 중심으로 공부하길 바라며 이 부분은 추후에 드라이버를 공부하는데도 많은 도움이 된다
.

•  H/W
지식 : 디바이스 드라이버는 소프트웨어와 하드웨어 사이에 중간의 다리역할을 하는 프로그램이라 볼 수 있다 . 이러다 보니 디바이스 드라이버를 작성하기 위해서는 소프트웨어 지식 뿐만 아니라 , 하드웨어적인 지식도 필요로 하게 된다그렇다고 H/W 스펙의 전기적인 내용이나 물리적인 회로등의 이해를 요구하는 것은 아니다대신기본적인 H/W 스펙 문서에 나와있는 용어라던지 통신 프로토콜등에 대해 먼저 이해하기 바라며드라이버에서 사용되는 H/W 관련 개념들도 같이 공부하길 바란다.  

•  디바이스 드라이버 모델 : 윈도우에서는 디바이스 드라이버를 어떤 방식으로 개발하라는 드라이버 모델들을 제시하고 있으며 모델들을 이용해 드라이버를 좀 더 쉽게 개발할 수 있게 해준다. 현재 윈도우에서 제공하는 드라이버 모델은 10 가지 이상의 방법들을 제시하고 있고 , 개발하려는 장치 및 드라이버 종류에 따라 추천하는 드라이버 모델들이 존재하고 있다 . 하지만 , 이런 다양한 드라이버 모델은 개발자들이 드라이버 종류에 따라 각각 새로운 모델들을 익히기 위해 시간과 노력을 배로 들게 하는 단점이 있다 . 그래서 Microsoft 에서는 이런 어려움을 해결하기 위해 새로운 드라이버 모델을 계속 발전시키고 , 통합하는 과정을 진행하고 있다 .

아래 표는 현재까지의 윈도우 운영체제의 종류에 따른 지원하는 드라이버 모델이다 .

Windows 종류

Driver Model

Windows 95/98/ME

VxD, WDM ( Windows 98/ME 에 해당 )

Windows NT

NT Kernel Mode Driver

Windows 2000/XP/2003/VISTA

NT Kernel Mode Driver, WDM, WDF


아래 표는 Microsoft 에서 디바이스 및 드라이버 종류에 따라 권장하는 드라이버 모델에 대한 설명이다
 . ( http://www.microsoft.com/whdc/driver/foundation/DrvRoadmap.mspx# )

Device/Driver Class

Recommended Driver Model

1394 device

Depends on device class : KMDF or WDM

Auxiliary display (SideShow)

Windows Portable Devices (WPD),
which is UMDF-based

Bluetooth L2CAP

Depends on device class : KMDF or device-class-specific model such as AVStream

Bluetooth Radio Frequency Communication (RFCOMM)

UMDF

Cell phone, PDA, portable media player

WPD, which is UMDF-baased

Digital camera

Depends on device characterisitics :
Media Transfer Protocol (MTP)/UMDF or WIA

Display adapter

Windows Display Driver Model

File system filter

FS mini-filter

Generic filter driver

KMDF

Human input device (HID)

UMDF (except for mouse and keyboard) or KMDF

Keyboard/Mouse filter

KMDF

Modem, cable modem

KMDF, WDM, or NDIS-WDM

Network Transport Driver Interface (TDI) client

KMDF

Network-connected device

UMDF

Other

Depends on device class and characteristics : UMSF, KMDF, or WDM

Printer

UniDrv, PScript, XPS

Scanner

WIA

Secure digital (SD)

Depends on device class : KMDF or WDM

Serial and parallel devices (legacy)

UMDF or KMDF

Smart card device

WDM

USB device

Depends on device class : UMDF, KMDF, or WDM

Video capture

AVStream

 

Port/Adapter Class

Recommended Driver Model

Audio adapter

AVStream, PortCls

HID miniport

Microsoft-supplied or KMDF

Network adapter

NDIS-WDM

Network adapter (USB)

NDIS-KMDF

PC card

Microsoft-supplied or KMDF

PCI

Microsoft-supplied or KMDF

Serial, parallel port

Microsoft-supplied or KMDF

Storage adapter (SCSI and ATA)

Scsiport, Storport, ATA port

USB adapter

Microsoft-supplied or KMDF

 

VxD ( Virtual Device Driver ) : Windows 95/88/ME 에서 사용되는 드라이버 모델로 디바이스 드라이버를 가상화시킨다는 개념을 적용해 드라이버를 만든다 . 확장자는 vxd 로 만들어진다 .


NT Kernel Mode Driver
: Windows NT 용 드라이버를 만들기 위한 드라이버 모델로 드라이버 개발을


WDM ( Windows Driver Model )
: 윈도우 디바이스 드라이버를 어떻게 만들어야 한다는 하나의 스펙이라고 볼 수 있다 . 하나의 드라이버 바이너리 파일을 가지고 다양한 윈도우 에서 사용 할 수 있는 드라이버를 만들기 위한 목적으로 만들어졌으며 , 현재 Windows 98/ME/2000/XP/2003/Vista 에서 사용할 수 있다 . 기본적인 개념은 NT Kernel Mode Driver 구조를 바탕으로 만들어 졌으며 , PnP, Power 관리 , WMI 등을 지원한다 .


WDF ( Windows Driver Foundation )
: Windows Vista 가 출시되면서 만들어진 드라이버모델로 WDM 모델에서 발전된 형태이다 . 윈도우 API 프로그래밍을 WDM 에 비유하면 , MFC WDF 해당한다고 볼 수 있다 . WDF 는 크게 두 가지 종류로 나뉘는데 , KMDF ( Kernel-Mode Driver Framework ) UMDF ( User-Mode Driver Framework ) 가 그에 해당된다 .


NDIS ( Network Driver Interface Specification )
: 윈도우에서 네트워크 관련 드라이버를 개발할 때 사용되는 드라이버 모델로 네트워크 드라이버를 좀 더 모듈화 시켜서 쉽게 만들 수 있는 방법을 제공해준다 .

그럼, 현 시점에서는 이렇게 "다양한 드라이버 모델중에 어떤 모델을 공부해야 하나?" 생각이 들것이다.
필자 생각에는 먼저 WDM 드라이버 모델을 공부하라고 말하고 싶다. 이유는 여러분들이 처음 애플리케이션 만들때를 생각해 보면처음엔 쉽게 개발을 하기 위해 라이브러리들이 많이 지원되는 MFC 나 비주얼 베이직, 델파이 등을 이용해 프로그램들을 만들었을 것이다. 하지만 이것의 내부 구조 및 원리들을 이해하기 위해서는 API 를 다시 공부 했어야 했다. 이것은 기본적인 원리를 이해하지 못하고는  발전된 개념들을 이해하기 어렵기 때문이다. 그래서 드라이버 모델에서도 API 와 같은 WDM 를 우선적으로 공부하면 드라이버의 기본적인 개념이나 구조를 이해하는데 많은 도움이 될 것이기 때문이다. 그리고나서, 필요에 따라 WDF 를 공부한다던지, 해당 Device Class에 따른 드라이버 모델들을 공부하는 방법을 권한다
.

2.
어떻게 공부해야 하나 ?

프로그래밍을 배울 때 듣는 속담 중 하나가백문이 불여일견 , 백견이 불여일타라고 했다 . 그 만큼 실제 책으로 공부하고 눈으로 보는 것 보다는 직접 코딩을 하면서 프로그램을 작성하는 것이 백배 더 효과적이라고 한다 .

디바이스 드라이버도 이런 공부 방법대로 많이 만들어보는 것이 제일 중요하다고 생각한다 . 필자도 처음에는 디바이스 드라이버를 책으로만 볼 때는 무슨 내용들을 말고 있는지 , 어떻게 드라이버가 작동 되는지 이해가 잘 되지 않았지만 , 이것저것 개발을 하면서 조금씩 이해를 한 경험이 있다 .

그러나 , 처음 드라이버를 만들려고 해도 뭔가 이론적인 바탕이 있어야 하는데 이런 부분은 혼자 공부하기에는 어려운 부분이 많다 . 그래서 여러 명이서 스터디 그룹을 만들어 같이 공부하면서 서로 공부한 것들을 공유하는 방법을 생각해 볼 수 있을 것이다 . 그리고 , 개발자 저변은 넓지 않은 분야이다 보니 자료들을 찾아보는데도 한계가 있다 . 그렇기 때문에 다양한 세미나 및 개발자 모임 등에는 적극적으로 참여해서 정보를 얻어야 한다 . 그 다음에는 관심 있는 프로그램이나 분야 중에 디바이스 드라이버가 사용되는 것을 선정해 직접 만들어보면서 실제 이론 내용을 적용해 보는 형태로 공부를 하면 많은 도움이 될 것이다 .

그럼 , 여러분들이 개발하기 전에 몇 가지 고려해야 할 사항들을 소개하겠다 .

• 
지원할 운영체제 : 제일 먼저 어떤 운영체제를 지원 할지를 결정해야 한다 . 그래야 지원하는 운영체제에 따른 H/W 지원 유무및 드라이버 모델이 정해지고 , 경우에 따라서는 디바이스 드라이버를 운영체제에서 기본적으로 지원하고 있어서 디바이스 드라이버 개발을 별도로 하지 않아도 되는 경우들이 있다 . 그렇기 때문에 우선 지원할 운영체제를 무엇으로 할지 선택해야 한다 .

•  Device Driver Class : 개발하려는 디바이스 드라이버가 지원하는 장치 종류 및 드라이버가 어떤 종류인지 선택 해야 한다 . 다시 설명하면 , 장치관리자에 올라가는 장치 목록에 어떤 장치로 보이게 할 것인지를 선택해야 한다는 말이다 . 어떤 장치 종류이냐에 따라 앞에서도 언급한 드라이버 모델이 결정되어서 개발 방향이 결정이 되기 때문에 이 부분도 중요하게 결정되어야 한다 .

•  Windows Logo 인증 : 여러분들은 장치를 구매했을 때 박스나 PC Windows Logo 스티커가 있는 걸 보거나 , 드라이버 설치시에 경고창이 나타나는 것을 본 경험이 있을 것이다 . Logo 의 의미는 Microsoft Windows 운영체제에서 하드웨어와 소프트웨어가 안정적으로 동작할 수 있도록 하드웨어와 소프트웨어의 완벽한 호환성에 관한 명확한 기준을 제공하고 있으며 , Microsoft WHQL 에서는 제시한 기준에 적합한지를 시험해서 기준에 적합하면 Windows Logo 인증 마크를 사용할 수 있는 권한을 부여하는 제도 이다 . 이런 인증 제도는 비즈니스적인 측면과 관련된 부분이긴 하지만 , 여러분의 H/W 및 디바이스 드라이버 품질을 검증해 보길 원한다면 한번 인증을 진행해 보는 것도 좋은 방법이 될 거라 본다 . 대신 별도의 인증 비용이 들어가니 이점은 참고하기 바란다 .
(
http://www.microsoft.com/whdc/winlogo/default.mspx )

디바이스 드라이버를 개발하기 위해 필요한 지식 및 방법에 대한 내용을 필자의 경험을 토대로 간략히 살펴봤다 . 공부에는 왕도가 없다라는 말이 있다 . 디바이스 드라이버를 공부하는 것도 특별한 비법이 있거나 빨리 실력이 느는 방법이 따로 있는것은 아니다특히나 드라이버나 시스템 프로그래밍쪽은 다른 분야보다 공부한 만큼 바로 바로 결과가 나오지 않아 쉽게 포기를 하기도 하는 분야다.  이럴수록 여러분들은 차근차근 기본기부터 다진다는 생각으로 공부을 했으면 한다
끝으로, 한 가지  부탁을 하자면인내와 끈기를 가지고 문제 해결를 끝까지 해결하려는 자세를 가졌으면 한다디바이스 드라이버를 개발하면서 느낀것은 쉽게 해결되는 문제가 없다는 것이다운영체제와 애플리케이션 , H/W 등의 다양한 구성 요소들 사이에서 동작을 하다 보니, 문제점을 파악하고 디버깅하고  테스트하는 과정은 정말 어려움 고난의 과정이다. 그래서 처음 생각과 달리 디버깅이나 테스트에서 많이들 힘들어하고 어려워한다. 하지만, 이런 과정은 여러분들이 고수로 가게 해주는 밑바탕이 될 것이며, 드라이버 개발을 재미를 느끼게 해주는 기폭제가 될것이라 본다
.   

그럼, 이제 디바이스 드라이버 개발을 어렵게 느끼지 말고 바로 지금 공부를 시작해보자

 출처: http://www.driveronline.org/bbs/view.asp?tb=begin&GotoPage=1&s_bulu=&s_key=&no=5
   (디바이스 드라이버 개발자 커뮤니티, 저자: subsub)

앞으로 직장에서 내가 주된 업무가 WDM이라고 한다. 생소하기만하다. 언능언능 알아야가야겠다. 기초부터 차근차근 다져야겠다.

디바이스 드라이버란 ?

 요즘에 PC 를 구입하게 되면 사용자들은 특별한 작업 없이 바로 컴퓨터를 사용할 수 있다. 예전에 필자가 처음 조립식 IBM PC 를 구매했던 시절에는 PC 와 주변 기기 (모뎀, 사운드 카드, VGA 카드 등등)를 사면 처음에 꼭 해야 할 일이 있었다.
 
주변 장치 별로 같이 포함되어 오는 플로피 디스크 또는 CD 에 들어있는 프로그램들을 설치하는 작업이다. 그 당시에 나는 이 프로그램들이 뭔지 모르고 설명서에 있는 대로 설치하고, 장치들을 연결해 사용했다가끔 PC 를 포맷할 경우에는 이 작업을 다시 해야 하는데, 이 때 플로피디스크나 CD 를 잃어버려 같은 기종의 주변기기를 사용하는 친구에게 프로그램을 복사해오거나, PC 통신 등을 통해 필요한 프로그램들을 어렵게 구하던 추억이 생각나기도 한다
.
 
그 후에, 필자는 그때 설치한 프로그램이 디바이스 드라이버라는 것을 알게 되었고, 현재는 그것에 재미를 느껴서 디바이스 드라이버 개발자가 되었다

 
이번 컬럼에서는 이렇게 사용자들에게는 존재감이 크게 느껴지는 프로그램은 아니지만, 중요한 역할을 담당하는 디바이스 드라이버에 대해서 알아보려고 한다.

먼저, 디바이스 드라이버 (Device Driver)’ 의 의미부터 알아보자. 단어 자체의 의미로만 해석하면, 장치 제어자 (운영자) 라고 해석이 된다그리고, 좀 더 의미를 분석해보면 운영체제로부터의 입출력 명령에 따라 주변기기 사이의 입출력 제어라는 의미를 가진다따라서, 애플리케이션에서 주변기기를 제어하기 위해서는 디바이스 드라이버를 통해 제어를 해야 하고, 각각의 디바이스 드라이버는 기기의 종류 및 인터페이스에 맞게 동작을 제어하게 된다. 또한, 실제 장치를 제어할 목적이 아닌 운영체제에서 지원되지 않는 서비스를 확장하기 위한 용도로도 디바이스 드라이버를 만들어 사용하기도 한다. , 기존 API 를 통해서는 커널에 대한 작업이 불가능 하므로, 이런 작업을 위해 별도의 디바이스 드라이버를 만들어서 API 를 새로 만들기도 한다.
운영체제가 윈도우냐, 리눅스냐, MAC OS X 이냐, 유닉스냐에 따라 운영체제의 내부 커널구조나 동작 방식 등이 달라지게 된다. 이에 따라 디바이스 드라이버도 다른 구조를 가지게 되며, 개발시에도 서로 다른 방법으로 개발을 하게 된다
.

윈도우가 설치된 PC 에서 작업을 하는 도중에 갑자기 화면이 파란색이 되면서 PC가 재부팅 되는 경우가 있다. 이럴 경우, 대부분의 사용자는 이 블루스크린의 원인을 윈도우 운영체제를 만든 마이크로소프트사가 발생시킨다고 생각한다. 하지만, 마이크로소프트사에서 발표한 블루스크린에 대한 분석결과를 보면문제발생의 70 ~ 80 % IHV (Independent Hardware Vendor)또는 ISV (Independent Software Vendor)가 만든 디바이스 드라이버의 문제 때문이라고 한다. 그래서, 마이크로소프트사는 이런 디바이스 드라이버 이슈를 사전에 방지하기 위해 Windows Logo 인증이라는 인증 제도를 두고, 디바이스 드라이버 및 하드웨어에 대한 사전 검증 시스템 재공하고 있다
.
 
또한, 아래 윈도우 운영체제의 아키텍처에서 보듯이 디바이스 드라이버와 운영체제는 서로 밀접한 관계를 가지고 있고, 커널모드 환경에서 작동 한다. , 커널모드 환경은 운영체제의 커널 및 드라이버가 동작되는 환경으로 이 환경에서 잘못된 동작을 하게 되면, 전체 시스템에 영향을 주기 때문에 디바이스 드라이버는 신중히 작성 되어져야 한다.
 
 
디바이스 드라이버의 실체는 파일로 존재 내용을 확인할 수 있는데, 윈도우 환경 (윈도우NT/2000/2003/VISTA 계열) 이라면 windows 설치폴더\system32\drivers 폴더에서 드라이버 파일을 접할 수 있을 것이다

지금까지는 디바이스 드라이버의 개념에 대해서 알아봤다. 그럼 실제 이 디바이스 드라이버가 어떤 분야들에 쓰이는지 알아보도록 하자
.

디바이스 드라이버는 기반 기술이 되는 분야로 이 기술을 응용해 다양한 분야에 활용 되고 있다.

1. H/W 제조사
 주변기기를 만드는 제조사들은 사용자가 사용할 수 있도록 해당 기기를 제어하는 디바이스 드라이버를 필수적으로 제작해야 한다. 그래서, 하드웨어 제조사들은 이런 디바이스 드라이버 개발을 중요하게 다루고 있다. 그러나 요즘은 디바이스 드라이버 개발을 하지 않아도 되는 장치들이 있다. 대표적인 예가 USB 이동식 디스크다. USB 이동식 디스크를 PC 에 연결하면 특별한 드라이버 설치 없이도 바로 인식되면서 디스크처럼 사용할 수 있다. 이것은 USB 이동식 디스크가 장치 스펙에 맞게 만들어지고, 해당 USB 이동식 디스크 드라이버 ( USB Mass storage driver ) 가 운영체제에 포함되어져서 사용자의 특별한 드라이버 설치 없이도 장치사용이 가능하도록 되었기 때문이다. 하지만, 부가 기능들을 위해서는 디바이스 드라이버의 추가적인 개발이 필요한 경우도 있다.

2. 보안 분야
최근 보안 분야의 이슈인 금융권 사이트에서 사용되는 키보드 보안이나 회사의 정보 유출 방지를 위한 매체 제어 (CD-RW, USB 이동식 디스크 등) 보안, 그리고, 게임 보안에 이르기까지 다양한 보안 분야들에서 이미 디바이스 드라이버 기술이 사용되고 있다. 해킹기술이 점점 응용프로그램 레벨에서 커널모드 레벨로 내려오고, 장치를 통한 정보유출들이 많아지면서 보안 프로그램도 점점 디바이스 드라이버 기술를 사용해야 할 필요성이 생기게 되었다. 하지만, 잘못된 보안 프로그램의 오동작 및 보안 프로그램들간의 드라이버 충돌로 인해 문제가 생기기도 한다. 그래서 이런 보안 관련 디바이스 드라이버 개발시에는 세심한 주의가 필요하다.

3. 응용 프로그램
일반 응용 프로그램에서도 디바이스 드라이버 기술이 사용된 예는 많다. 가상 CD-ROM , 가상 프린터 등의 프로그램에서는 겉으로 보기에는 드라이버 기술이 사용되지 않는 것처럼 보이지만, 실제 내부적으로는 일반적인 응용 프로그램 수준에서 구현되기 어려운 부분에 대해서 디바이스 드라이버 기술을 응용해 구현들을 하고 있다. 특히 기존에 없는 기능들을 구현할 경우에는 디바이스 드라이버 기술을 이용해 기존 운영체제의 API 서비스를 확장하는 용도로도 사용되기도 한다.

이처럼 디바이스 드라이버가 사용되는 분야는 다양하고, 앞으로도 무궁무진 할 것이다. 디바이스 드라이버 분야가 일반 애플리케이션이나 게임처럼 눈에 쉽게 결과가 드러나지 않다 보니 아직까지 일반 사용자들뿐만 아니라, 개발자들에게도 어렵게 느껴지는게 사실이며, 아직까지 개발자 저변도 넓지 않지 않는 상황이다.
하지만 기반 기술이 되는 디바이스 드라이버 분야는 없어서는 안될 중요한 기술이고, 앞으로 기술의 가치는 더욱 더 빛날 것이다. 그리고, 개발자들에게는 디바이스 드라이버 기술를 알게 되면 다른 개발분야들에도 많은 도움이 될거라 본다


출처: http://www.driveronline.org/bbs/view.asp?tb=begin&GotoPage=1&s_bulu=&s_key=&no=4
       (디바이스 드라이버 개발자 커뮤니티)

+ Recent posts