## 개요 ##
디바이스란 컴퓨터를 제외한 주변장치를 말하는 것으로 USB 캠이나, USB 하드디스크, 프린터
뿐만 아니라 새로 개발된 장치등을 말한다. 이러한 디바이스들을 사용하기 위해서는 디바이스들을 제어하기 위한 소프트웨어가 필요하다. 디바이스 드라이버가 바로 물리적으로 이루어진 하드웨어 장치를 제어하는 소프트웨어이다.
## 주번호(Major number)와 부번호(Minor number) ##
리눅스에서는 디바이스 드라이버는 하나의 파일로 처리된다. 즉 그 파일을 통해 외부 주변장치를 엑세스 하거나 제어할 수 있다. 하나의 디바이스 드라이버는 주번호(Major number)와 부번호(Minor number)로 나타낸다. 주번호는 장치유형을, 부번호는 그 유형의 단위기기를 나타낸다.
예를 들어 컴퓨터의 시리얼 포트를 보면 COM1, COM2 포트가 존재한다. 이때 COM을 나타내는것이 주번호이고, COM의 1,2가 부번호이다. 리눅스에서는 255번까지 장치 특수파일 주번호가 있다. 현재는 새로운 하드웨어의 디바이스 드라이버 지원으로 100번 이하는 거의 할당되어 있으며, 특정한 하드웨어를 위한 디바이스 드라이버를 만들고 공식적으로 리눅스의 주번호를 받고 싶으면 Documentation/devices.txt를 참고하여 리눅스 주번호를 관리하는 사람에게 연락해야 한다. 임의로 번호를 부여한다면, 다른 디바이스 드라이버와 충돌날수 있다. 임시적으로 디바이스 드라이버를 테스트 하는 사람을 위해서 60~63, 120~127, 240~254번이 예약되어 있다. 이 번호들중 임의로 하나를 선택하여 사용할 수 있다.
## 디바이스 드라이버 종류 ##
디바이스 드라이버는 크게 3가지로 나눌수 있다.
1) 문자(Char)디바이스 드라이버
디바이스를 파일처럼 취급하여 엑세스 한다. 버퍼 캐쉬를 사용하지 않고 직접 읽기/쓰기를 하며,
데이터의 형태는 스트림 방식으로 전송한다.
EX) Keyboard, Printer, Serial Mouse, Joystick...
2) 블록(Block)디바이스 드라이버
디스크와 같은 메모리 장치를 제어할 때 작성하는 드라이버이다. 즉, 큰 용량의 데이터를 처리할때 데이터를 블록단위로 읽기/쓰기를 하며, 버퍼 캐쉬를 사용하여 랜덤 엑세스가 가능하다.
EX) HDD, Floppy, RAM Disk, CD-ROM...
3) 네트워크(Network)디바이스 드라이버
네트워크 통신을 통해 패킷을 송/수신 할수 있는 장치를 제어한다.
EX) 이더넷 디바이스 드라이버(eth0)

< 그림 1.1 문자 디바이스 드라이버의 동작 >
## 리눅스 시스템 구조 ##
USER 영역
- 사용자 모드에서 도악하는 응용 프로그램 영역
Kernel 영역
- 시스템 콜 인터페이스
: 응용프로그램에서 커널 서비스를 제공하는 인터페이스
- 커널
: 프로세서 관리, 메모리 관리, 파일 시스템 관리, 네트워킹, H/W영역에 위치한 장치의 디바이스
드라이버 관리 등의 기능 수행
H/W영역
- 물리적인 하드웨어 영역

< 그림 1.2 리눅스 시스템 구조 >
## 모듈 프로그래밍 ##
- 디바이스 드라이버를 제작한 뒤 테스트 하려면 리눅스 커널에 적재해야 한다. 하지만 테스트 할때 마다 커널에 적재하고 작업할 수는 없다. 커널이 변경되면 변경될 때마다 계속 커널을 컴파일해야 하고 다운로드 해야 하기 때문이다. 바로 이 문제를 해결하기 위해 등장한 것이 바로 모듈 프로그래밍이다. 모듈 프로그래밍은 필요할 때만 커널에 적재시켜 테스트 할 수 있다.
테스트가 완료되면 최종적으로 커널에 적재하고 컴파일하여 완전한 커널을 생성하면 되는 것이다.
## 모듈 프로그래밍 명령어 ##
- insmood : 모듈을 설치한다.
- rmmod : 모듈을 제거한다.
- lsmod : Load된 모듈들의 정보를 표시한다.
'Study > Embaded Linux' 카테고리의 다른 글
| 개발자를 위한 vi 환경 설정하기 (0) | 2010/05/18 |
|---|---|
| wipi 애뮬 (0) | 2010/05/03 |
| 디바이스 드라이버 (0) | 2010/04/20 |
| 커널이란? (0) | 2010/04/19 |
| 임베디드 리눅스 중간고사 (0) | 2010/04/18 |
| 리눅스 커널 웹페이지 (0) | 2010/04/06 |


