'디바이스 드라이버'에 해당되는 글 2건

  1. 2009.05.12 디바이스 드라이버 개발환경 구축
  2. 2009.05.12 디바이스 드라이버의 소개 및 응용 분야
WDM/WDM Tip2009.05.12 15:12

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 가지 환경으로 나눠 볼 수 있다 .

hecked ( 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

아직은 개발자들에게 생소한 디바이스 드라이버 분야에 많은 분들이 함께 했으면 하는 바람에 글을 시작했는데 벌써 3 회 연재가 끝나다니 아쉽다 . 3 회라는 짧은 횟수를 통해 디바이스 드라이버 분야를 소개하다 보니 , 다양하고 자세한 설명을 못 해드린 것 같아 마음에 걸린다 . 하지만 , 이번 컬럼을 통해 생소한 디바이스 드라이버 분야에 조금이라도 관심을 가지게 되었다면 기쁘게 생각한다 .

앞으로 국내에도 기반기술 쪽에 많은 분들이 참여했으면 하는 바램이 있고 , 다음에 또 컬럼을 쓸 기회가 주어진다면 못 다한 내용을 써보겠다 .

추후 더 자세한 내용을 알고 싶다면 , 국내 드라이버 및 시스템 프로그래밍 전문 커뮤니티인 드라이버온라인 ( www.driveronline.org ) 을 방문하시면 많은 도움을 받을 수 있을 것이다 .

 



출처 : http://imdev.devpia.com/column_detail.jsp?seq=7
Posted by 쫑경
WDM/WDM Tip2009.05.12 15:10
요즘에 PC 를 구입하게 되면 사용자들은 특별한 작업 없이 바로 컴퓨터를 사용할 수 있다 . 예전에 필자가 처음 조립식 IBM PC 를 구매했던 시절에는 PC 와 주변 기기 ( 모뎀 , 사운드 카드 , VGA 카드 등등 ) 를 사면 처음에 꼭 해야 할 일이 있었다 .

주변 장치 별로 같이 포함되어 오는 플로피 디스크 또는 CD 에 들어있는 프로그램들을 설치하는 작업이다 . 그 당시는 나는 이 프로그램들이 뭔지 모르고 , 단지 설명서에 있는 대로 설치해서 장치들을 연결하고 사용했었다 . 만약 , 장치를 다시 설치하려는데 그 프로그램이 있는 플로피 디스크나 CD 가 없어지는 날에는 기종이 같은 친구의 집에 가서 복사해오거나 , PC 통신 등을 이용해 구하려고 고생했던 기억이 있다 . 그 후에 , 필자는 컴퓨터를 전공하게 되었고 , 프로그래밍을 배우면서 , 그 때 내가 설치한 프로그램이 디바이스 드라이버라는 것을 알게 되었고 , 지금은 그 프로그램을 개발하는 일까지 하게 되었다 .

이번 컬럼 에서는 이렇게 사용자들에게는 눈에 잘 띄지 않지만 , 중요한 역할을 담당하는 디바이스 드라이버에 대해서 알아보려고 한다 . 총 3 회에 걸쳐서 디바이스 드라이버가 무엇이며 , 이것이 어떤 분야에 쓰이며 , 개발은 어떻게 하는지를 여러분들에게 소개하려고 한다 .


우선 , ‘ 디바이스 드라이버 (Device Driver) ' 단어의 의미부터 알아보면 , 단어 자체의 의미로 해석하면 , 장치 제어자 ( 운영자 ) 라고 해석이 된다 . 좀 더 의미를 분석해보면 운영체제로부터의 입출력 명령에 따라 주변기기 사이의 입출력 제어를 한다 . 그리고 , 애플리케이션에서 주변기기를 제어하기 위해서는 디바이스 드라이버를 통해 제어를 해야 하고 , 각각의 디바이스 드라이버는 기기의 종류 및 인터페이스에 맞게 동작을 제어하게 된다 . 그리고 , 실제 장치를 제어할 목적이 아닌 운영체제에서 지원되지 않는 서비스를 확장하기 위한 용도로도 디바이스 드라이버를 만들어 사용하기도 한다 . 즉 , 기존 API 를 통해서는 커널에 대한 작업이 불가능 하므로 , 이런 작업을 위해 별도의 디바이스 드라이버를 만들어서 API 를 새로 만들기도 한다 .

그리고 , 운영체제가 윈도우냐 , 리눅스냐 , MAC OS X 이냐 , 유닉스냐에 따라 운영체제의 내부 커널 구조나 동작 방식 등이 다라지게 된다 . 이에 따라 디바이스 드라이버도 다른 구조를 가지게 되며 , 개발시에도 서로 다른 방법으로 개발을 하게 된다 .

윈도우가 설치된 PC 에서 작업을 하다가 갑자기 화면이 파란색지면서 PC 가 재부팅 되는 현상을 봤을 것입니다 . 대부분의 사용자는 이 블루스크린의 원인을 윈도우 운영체제를 만든 마이크로소프트가 문제를 발생시킨다고 생각할 것이다 . 하지만 , 문제가 발생되는 내용을 분석한 결과 문제발생의 70 ~ 80 % 는 IHV (Independent Hardware Vendor) 또는 ISV (Independent Software Vendor) 가 만든 디바이스 드라이버의 문제 때문이라고 한다 .

아래 윈도우 운영체제의 아키텍처에서 보듯이 디바이스 드라이버와 운영체제는 서로 밀접한 관계를 가지고 있는 위치에 있으며 , 커널모드 환경에서 작동하고 있다 . 즉 , 커널모드 환경은 운영체제의 커널 및 드라이버가 동작되는 환경으로 이 환경에서 잘못된 동작을 하게 되면 , 전체 시스템에 영향을 주기 때문에 디바이스 드라이버는 신중히 작성 되어져야 한다 . 그리고 , 마이크로소프트에서는 이런 디바이스 드라이버 이슈를 사전에 방지하기 위해 Windows Logo 인증이라는 인증 제도를 두고 , 디바이스 드라이버 및 하드웨어에 대한 사전 검증 시스템을 가지고 있기도 하다 .

주 : 커널모드 (Intel CPU 특권모드 , Ring 0) : CPU 가 Ring 0 mode 에서 수행 중인 상태이며 이 상태에서는 실행할 수 있는 명령의 제한이 없으며 , 운영체제와 디바이스 드라이버가 이 모드에서 실행된다 .

유저모드 (Intel CPU 특권모드 , Ring 3 ) : CPU 가 Ring 3 mode 에서 수행 중인 상태이며 이 상태에서는 실행할 수 있는 명령은 제한이 있으며 . 일반적으로 모든 application 은 이 모드에서 실행된다 . ]

디바이스 드라이버의 실체는 파일로 존재 내용을 확인할 수 있는데 , 윈도우 환경 ( 윈도우 NT/2000/2003/VISTA 계열 ) 이라면 windows 설치폴더 \system32\drivers 폴더에서 드라이버 파일을 접할 수 있을 것이다 .

지금까지는 디바이스 드라이버의 개념에 대해서 알아봤다 . 그럼 실제 이 디바이스 드라이버가 어떤 분야들에 쓰이는지 알아보도록 하자 . 디바이스 드라이버는 기반 기술이 되는 분야로 이 기술을 응용해 다양한 분야에 활용 되고 있다 .


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


2. 보안 분야
최근 보안 분야의 이슈인 금융권 사이트에 보이는 키보드 보안이나 회사의 정보 유출 방지를 위한 매체 제어 (CD-RW, USB 이동식 디스크 등 ) 보안 , 그리고 , 게임 보안에 이르기까지 다양한 보안 분야들에서 이미 디바이스 드라이버 기술이 사용되고 있다 .

해킹기술이 점점 응용프로그램 레벨에서 커널모드 레벨로 내려오고 , 장치를 통한 정보유출들이 많아지면서 보안 프로그램도 점점 디바이스 드라이버 기술를 사용해야 할 필요성이 생기게 되었다 . 하지만 , 잘못된 보안 프로그램의 오동작 및 보안 프로그램들간의 드라이버간의 충돌로 인해 문제가 생기기도 한다 . 그래서 이런 보안 관련 디바이스 드라이버 개발시에는 세심한 주의가 필요하다 .


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

이처럼 디바이스 드라이버가 사용되는 분야는 다양하고 , 앞으로도 무궁무진하게 다양할 것입니다 . 디바이스 드라이버 분야가 일반 애플리케이션이나 게임처럼 눈에 쉽게 결과가 드러나지 않다 보니 아직까지 일반 사용자들 뿐만 아니라 , 개발자들에게도 어렵게 느껴지는게 사실이며 , 아직까지 개발자 저변도 넓지 않지 않는 상황이다 .

하지만 기반 기술이 되는 디바이스 드라이버 분야는 없어서는 안될 중요한 기술이고 , 앞으로 기술의 가치는 더욱 더 빛날 거라 봅니다 . 그리고 , 개발자들에게는 디바이스 드라이버 기술를 알게 되면 다른 개발분야들에도 많은 도움이 될거라 봅니다 .

그럼 , 이번 컬럼은 여기서 마치고 다음 컬럼 에서는 이런 디바이스 드라이버를 어떻게 개발하는지에 대해 우리가 쉽게 접하는 윈도우 환경에서의 디바이스 드라이버 개발 방법에 대해서 알아보도록 하겠습니다 .

 



출처 : http://imdev.devpia.com/column_detail.jsp?seq=5
Posted by 쫑경