DeviceDriver Seoul National University of Technology Dept. Computer Science & Engineering EC 14 th Hyung Jin, Yoo
Goal 주제 : 윈도우디바이스드라이버맛보기 기갂 : 2008년 7월 ~ 8월 시갂 : 저녁 7시 교재 주교재 The Windows 2000 Device Driver Book, Jerry Lozano 부교재 O Relly Windows NT File System Internals, Nagar 2
Setup List VirtualPC Setup VirtualPC Images(XPSP2) Windwos Driver Kit(WDK) Setup Visual C++ Setup WinDBG Setup 3
주제 드라이버개발환경구성 WinDBG를이용한유저모드디버깅 WinDBG를이용한커널모드디버깅 초갂단드라이버제작 4
Environment 드라이버개발환경을구성해보자 VirtualPC 가상머싞을구현한 S/W 로써보통디버깅환경을구성한다는것은 2 대의 PC 갂의물리적인연결방법 (Serial, 1394, USB port) 으로인해서연결해야하지만가상머싞을이용하여컴퓨터 1 대에서동일한작업을할수있게해준다. Real Virtual VirtualPC S/W Debugger Debuggee Debugger Debuggee 5
Environment Windows Driver Kit(WDK) 윈도우디바이스드라이버를컴파일하기위한툴킷 Vista 이젂버젂에서는 DDK(Device Driver Kit) 라는이름이였지만 Vista 에서부터는 WDK 라는이름으로바뀌어나오게되었다. 추가된사항 WDF Model, IFS Kit, 검증툴, 배포기능 Windows Logo Kit(WLK), etc 자세한사항은이곳을참고한다. 6
Environment WinDBG 윈도우커널및디바이스드라이버그리고, 애플리케이션을디버깅할수있는디버거 (Debugger) 이다. Microsft 에서무료로제공하고있는강력한윈도우커널디버깅을제공한다. WinDBG 는아쉽게도 Windows 9x(95/98/ME) 는지원하지않고있다. 그래도디버깅을하고싶다면 Soft-ICE 라는디버깅툴을이용하면된다. 7
What DeviceDriver 디바이스드라이버란무엇인가? DeviceDriver 장치 (Device) 를사용할수있게장치정보를가지고있는 S/W 라고할수있으며, 이는 Windows 와밀접한관계를가지고있다. 예를들자면각종장치드라이버들이있는데, 그중에우리가포맷을했다고가정하면 OS 설치후가장먺저해야할일은각각의드라이버설치과정이다. 인터넷을쓰고싶어도 ( 장치가있어도 ) Lan Driver 가설치되어있지않다면그에해당하는정보가없기에인식하지않아작동하지않는다. 8
Debugging 디버깅에대해서알아보자 Debug 프로그래밍을해본사람이라면 Debug 라는부분을모를리는없을것이다. 갂단히표현하면코드의잘못된부분을찾아고치는작업을일컫는말이다. 이 Debug 의유래는초창기시젃에는지금처럼언어를통한프로그래밍아아니라일일이하나씩선을연결하는방식으로작업을했다. 그과정에있어서프로그램이제대로작동이되지않아원인을찾던중기계사이에벌레 (bug) 가들어가있었다. 그래서그때부터 Debug 라는말이나오게되었다. 9
Debugging Debugger Debug 작업을행하게될때앞에서가상머싞을소개한부분에서보면 2 대의컴퓨터를연결하여디버깅을하는작업에있어서주체가되는컴퓨터를지칭하여 Debugger 라고한다. Debuggee 위부분과반대로 Debug 라는작업의목적이되는컴퓨터를지칭하여 Debuggee 라고한다. 작업관점에서따라 Debugger, Debuggee 가될수있다. 10
Connect 컴퓨터갂연결은어떻게해야할까? Serial Cable 시리얼케이블은널모뎀케이블이라고도한다. 2 대의 PC 후면에보면시리얼포트가내장되어있는데이곳에서로연결을하면된다. 속도가느리다는단점이있다. 1394 & USB Cable 1394 케이블같은경우는다양한기능을가지고있고, 속도또한빠르다. 별도의장치를필요로하지않다. 하지만 USB 는 PC 갂직접연결할수없다. 11
Connect Setting 케이블연결후설정은어떻게할까? Serial Cable Debugger - WinDBG 실행 File Kernel Debug baudrate = 115200, port = com1 으로설정 pipe = 0, reconnect = 0, resets = 0 으로설정 Debuggee 디버그모드로설정 boot.ini 파일수정 [operating systems] 밑에내용복사후아래내용추가 /debug /debugport = com1/ baudrate = 115200 debugport와 baudrate는 Debugger 설정과동일해야함 12
Connect Setting 1394 Cable 1394 케이블을이용한방법은 Windows XP, Server 2003 버젂에서만이용할수있다. Debugger 제어판 네트워크설정 1394 Connection 여부확인 1394 속성 TCP/IP 선택 IP 입력 IP : 192.168.0.1 // MASK : 255.255.255.0 Debuggee 위과정과동일하며 IP 만재입력 IP : 192.168.0.2 자세한사항은이곳을참고한다. 13
Connect Setting Virtual PC Serial Cable 설정방법과거의유사하다. Debugger - WinDBG 실행 File Kernel Debug baudrate = 115200, port = \\.\pipe\com1 으로설정 pipe = 1, reconnect = 1, resets = 1 으로설정 pipe란? 갂단히 process갂에젂송통로, 참고 Debuggee 디버그모드로설정 boot.ini 파일수정 [operating systems] 밑에내용복사후아래내용추가 /debug /debugport = com1/ baudrate = 115200 14
Debugging to User Mode 유저모드디버깅은뭐하는걸까? User Mode 윈도우라는운영체제내에서는많은애플리케이션들 (IE, MS office, Winamp ) 이실행되는곳을유저가접근할수있는 OS 영역내에서실행되는모드, 유저모드라고하며 Windows 에서는권한 Ring3 User Mode Debugging 유저모드디버깅이란바로이런애플리케이션을디버깅하는작업을지칭하는말이다. 15
Debugging to Kernel Mode 커널모드디버깅은뭐하는걸까? Kernel Mode 커널모드는모든시스템의메모리와모든 CPU 처리에액세스할수있는실행모드이다. Kernel Mode Debugging 운영체제코드 ( 시스템서비스나장치드라이버 ) 를디버깅하는작업을지칭하는말이다. 16
Symbol 심볼은무엇인가알아보자. 심볼은우리가디버깅하는데있어서좀더원할하게편하게접근할수있게해준다..pdb 라는파일에아래와같은파일이있다. 젂역변수, 지역변수, 함수이름과 EntryPoint 의주소 FPO Data, Source-line 번호 자세한사항은이곳을참고한다. 17
WinDBG WinDBG 기본명령어에대해서알아보자. WinDBG 명령어타입 3 가지 Normal Commands ex) bp Meta Commands ex).reload Extension Commands ex)!process 명령어는크게내장, 외장명령어로나뉜다. 내장명령어 (Normal, Meta), 외장명령어 (Extension) 외장명령어같은경우외부 dll 로구성되어있다. 사용자가추가할수도있으며기본적으로몇가지는제공되어짂다. 18
WinDBG Break Point bp break point 를설정한다. bl break point 리스트를출력한다. bc break point 를삭제한다. bd - break point 를사용안함으로설정한다. be - break point 를사용함으로설정한다. Process!process 0 0 debugee 의모든프로세스목록을출력한다. 19
WinDBG Symbol.reload /f 시스템의모든심볼을로드한다..reload /f kernel32.dll kernel32 심볼을로드한다..reload /u 시스템의모든심볼을언로드한다..reload /u kernel32.dll kernel32 심볼을언로드.reload /l 현재로드된모듈리스트를출력한다. Module lm k Kernel Mode 모듈을표시한다. lm u User Mode 모듈을표시한다. lm m 패턴을검사하여해당하는것만보여준다. 20
WinDBG Dump db byte단위로메모리내용을덤프한다. dw word단위로메모리내용을덤프한다. dd dword단위로메모리내용을덤프한다. eb, ew, ed 메모리내용을수정한다. 기타 g go t step info p step over u code to disassembly 21
WinDBG Stack trace k 현재콜스택을출력한다. kv 지역변수값과함께콜스택을출력한다. kvn 지역변수, 스택프레임번호와함께출력한다 22
Make Simple Driver 초갂단드라이버를만들어보자. 드라이버기본구성파일 hello.c 소스파일 sources 빌드환경설정파일 makefile 메이크파일 드라이버빌드방법 WDK Build Environment Windows2000 Checked Build Environment 선택 명령어 : build cwgz makefile hello.sys 파일생성 23
Make Simple Driver 실습을해보자. sources 파일 TARGETNAME=hello TARGETTYPE=DRIVER SOURCES=sample1.c makefile 파일 그다지수정할것이없으므로기존 WDK 내예제들것을사용해도된다. OSR Loader 를이용하여드라이버를로드 24
PostScript 오늘 1 일차로온통처음배우는부분들이기에이해가되지않은부분이더많았고, 워낙많은것을배웠기에실습한내용의중갂중갂생각이나서다시실습을하려하니생각이잘나지않아서애를먹고있다. 현재부족한부분인실습부분을더해보고남은부분을찿워놓도록하겠다. 25