====== 1장 - 디바이스 드라이버 소개 ====== O`reilly 에서 나온 'LDD(Linux Device Driver) Third Edition' 을 가지고 공부한 내용을 정리했다. ====== 디바이스 드라이버는 무엇인가? ====== '높은 수준의 컴퓨터 프로그램들이 컴퓨터 하드웨어 장치와 상호 작용하기 위해 만들어진 하나의 컴퓨터 프로그램이다. - 위키피디아' '사용자 프로그램이 하드웨어를 컨트롤하기 위해서 만들어진 프로그램이다. - 나의 정의' 그냥 하드웨어를 컨트롤 하는 프로그램이라고 하면 되지, 왜 꼭 디바이스 드라이버라는 이름으로 정의를 했을까? 가장 큰 이유는 커널 즉 운영체제 때문일 것이다. 사실 디바이스 드라이버를 설명하는 데, 빠질 수 없는 것이 있다. 책에서도 가장 많이 언급하고 있는 것이 바로 커널이다. 운영체제라는 개념이 없었다면, 디바이스 드라이버라는 말도 없었을 것이다. 커널이 하는 일은 다음과 같다. {{ :it:kernel.jpg |}} - 프로세스 관리 - 메모리 관리 - 파일시스템 - 디바이스 제어 - 네트워킹 이 중에서, 디바이스 드라이버와 연계하여 하는 일을 보자. 하드웨어 자원은 한정되어 있다. 예를 들면, 하나의 랜카드가 있지만, 이를 통해 통신을 하고 싶어하는 프로그램들은 많을 수 있다(브라우저, 메신저 등). 그렇다면, 이에 대한 통제는 누가할까? 바로 커널이 한다. 한정된 자원을 효율적으로 사용할 수 있게 한다. 디바이스 드라이버는 운영체제에 종속적이다. 같은 하드웨어지만, 운영체제에 따라 서로 다른 드라이버가 존재한다. 여기서는 LDD 인 만큼 리눅스를 기준으로 설명한다. ====== 리눅스에서 정의하는 디바이스 유형 ====== 현재 리눅스에서 지원하는 디바이스가 무수히 많지만, 크게 3가지 유형으로 정의한다. 리눅스의 특징이라고 할 수 있는 장치 디바이스를 파일로 매핑하여 나타낸다(/dev). 문자, 블럭 디바이스의 경우 드라이버에서 해당 장치파일을 이용하여 제어한다. ===== 문자 디바이스 ===== 마치 파일을 참조하듯이 사용한다. 따라서 open, close, read, write 와 같은 시스템콜을 사용한다. 하지만 몇몇 예외적인 디바이스를 제외하고 일반 적인 파일 참조와 같이 앞뒤로 원하는 위치로 이동할 수 없다. 대표적인 문자 디바이스로는 문자열 콘솔(/dev/console), 직렬포트(/dev/ttyS0) 등이 있다. ===== 블록 디바이스 ===== 블록을 전송하는 I/O 작업을 수행한다. 주로 파일시스템을 사용하는 디바이스(하드 디스크 등)가 해당된다. ===== 네트워크 인터페이스 ===== 네트워크 디바이스는 패킷 전송과 수신을 위주로 동작한다. 다른 디바이스와는 달리 장치파일에 매핑되지 않는다. 네트워크 드라이버는 개별적인 접속 연결에 대해서는 알지 못하고, 패킷만 처리한다. ====== 디바이스 드라이버 작성시 유의할 점 ====== ===== 보안 문제 ===== 디바이스 드라이버는 사용자 프로그램과는 달리 커널 영역에서 실행되기 때문에, 전체 시스템에 악영향을 끼칠 수 있다. ===== 커널 버전 ===== 드라이버는 함께 커널메모리에 로딩 되어 커널과 함께 실행되기 때문에 커널에 의존적이다. 커널은 수시로 업데이트 될 수 있고, 이에 따라 참조하는 구조체등이 바뀔 수 있다. 될 수 있으면 안정버전(짝수버전)을 사용하고 새로운 커널에 대하여 동작여부를 모니터링 할 필요가 있다. ===== 라이선스 조건 ===== 리눅스는 GPL(General Public License) 버전 2를 사용한다. 이는 GPL 제품을 토대로 만든 소프트웨어 제품은 소스코드를 공개 및 배포해야 한다. 그런데, 커널 모듈을 바이너리 형태로 배포하는 경우에 대해 답은 애매하게 남겨져 있다. ---- {{indexmenu>:#1|skipns=/^(wiki|etc|diary|playground)$/ skipfile=/^(todays|about|guestbook)$/ nsort rsort}} ----