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

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

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

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

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

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

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

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

Windows Shared Source programs

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

Microsoft 에서는 윈도우 내부에 관심을 갖는 사람들을 위해 " Windows Shared Source programs " 제도를 운영하고 있다 . 프로그램 참여방법은 여러 가지가 있으나 , 개발자인 여러분들은 Microsoft MVP 가 되면 이 프로그램에 참여할 수 있으며 , Source code 를 볼 수 있는 권한을 얻을 수 있다 . 관심 있는 분들은 MVP 에 도전해 새로운 경험을 하기 바란다 .

•  컴퓨터 구조 및 CPU 아키텍처 : 운영체제 아키텍처를 이해하기 위해서는 컴퓨터 구조나 CPU 아키텍처의 이해가 필요하다 . 즉 , 넓은 의미로 운영체제도 CPU 및 컴퓨터 구조 기반 위에서 작동하는 프로그램이기 때문에 CPU 및 컴퓨터의 구조를 이해하는 것은 기본 중에 기본이다 .

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

•  API 프로그래밍 : 디바이스 드라이버는 누군가의 요청에 의해 기능을 하게 된다 . 사용자가 GUI 를 가진 애플리케이션을 통해 I/O 요청을 하면 디바이스 드라이버가 해당 작업을 하게 되고 , 결과는 다시 애플리케이션에게 전달하는 구조를 가진다 . 이런 구조이다 보니 디바이스 드라이버를 작성하는 것 뿐만 아니라 , 애플리케이션 구조에 대해서도 이해가 필요하다 . 그래서 , API 프로그래밍 내용은 기본적으로 알고 있어야 제대로 드라이버와 애플리케이션 사이의 통신 방법들을 이해할 수 있을 것이다 .

•  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 ) : 윈도우에서 네트워크 관련 드라이버를 개발할 때 사용되는 드라이버 모델로 네트워크 드라이버를 좀 더 모듈화 시켜서 쉽게 만들 수 있는 방법을 제공해준다 .


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

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

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

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

•  지원할 운영체제 : 제일 먼저 어떤 운영체제를 지원 할지를 결정해야 한다 . 그래야 지원하는 운영체제에 따른 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 등의 다양한 구성 요소들 사이에서 동작을 하다 보니 , 문제가 생겼을 때의 문제점을 파악하고 디버깅 , 테스트하는 작업들이 단순하게 끝나지 않는 경우들이 많다 . 그래서 , 개발 일정 계획을 만들 때도 실제 개발보다는 테스트 및 디버깅 시간을 더 많이 할애하고 진행을 하기도 한다 . 그래서 . 어려운 문제가 해결되었을 때는 " 고진감래 " 라는 사자성어가 피부에 와 닿을 것이다 .

이제 여러분들도 디바이스 드라이버라는 분야에 도전해보기 바란다 .

다음 컬럼에서는 마지막으로 윈도우 디바이스 드라이버 개발 환경을 설명하도록 하겠다 .

< 디바이스 드라이버 참고 사이트 >

Microsoft Hardware Developer Central ( http://www.microsoft.com/whdc/default.mspx )

디바이스 드라이버 개발자뿐만 아니라 하드웨어 개발자들에게도 필요한 MS 공식 기술 문서 및 자료들이 있는 사이트 . 드라이버 개발자라면 꼭 이 사이트를 방문해보기 바란다 .

OSR Online ( http://www.osronline.com )
OSR 개발 업체에서 만든 온라인 커뮤니티 사이트로 , 기술 자료 및 개발관련 Q&A 를 제공해 준다 . Microsoft 와 협력관계로 다양한 정보들을 제공하고 있다 .

라이버온라인 ( http://www.driveronline.org )
국내 디바이스 드라이버 및 시스템 프로그래밍 커뮤티니 사이트로 , 개발 관련 Q&A , 기술자료등을 제공한다 . 그리고 , 개발자 기술 향상을 위한 다양한 온 / 오프라인 세미나를 개최한다 .

USB org ( http://www.usb.org )
USB ( Universal Serial Bus ) H/W 인터페이스의 공식 위원회 사이트로 , USB 관련 스펙 문서 및 관련 기술 정보들을 제공하고 있다 . USB 인터페이스를 사용하는 H/W 를 개발 하신다면 한 번 방문해보시기 바랍니다 .

 Jan Axelson's Lakeview Research ( http://www.lvr.com )
USB Complete , Serial Port Complete 책의 저자 사이트로 , USB 및 Parallel, Serial 등 H/W Spec 및 관련 정보들을 제공하고 있다 .

위로 스크롤