O`reilly 에서 나온 'LDD(Linux Device Driver) Third Edition' 을 가지고 공부한 내용을 정리했다.

디바이스 드라이버는 무엇인가?

'높은 수준의 컴퓨터 프로그램들이 컴퓨터 하드웨어 장치와 상호 작용하기 위해 만들어진 하나의 컴퓨터 프로그램이다. - 위키피디아'

'사용자 프로그램이 하드웨어를 컨트롤하기 위해서 만들어진 프로그램이다. - 나의 정의'

그냥 하드웨어를 컨트롤 하는 프로그램이라고 하면 되지, 왜 꼭 디바이스 드라이버라는 이름으로 정의를 했을까?
가장 큰 이유는 커널 즉 운영체제 때문일 것이다. 사실 디바이스 드라이버를 설명하는 데, 빠질 수 없는 것이 있다. 책에서도 가장 많이 언급하고 있는 것이 바로 커널이다.
운영체제라는 개념이 없었다면, 디바이스 드라이버라는 말도 없었을 것이다. 커널이 하는 일은 다음과 같다.

  1. 프로세스 관리
  2. 메모리 관리
  3. 파일시스템
  4. 디바이스 제어
  5. 네트워킹

이 중에서, 디바이스 드라이버와 연계하여 하는 일을 보자.
하드웨어 자원은 한정되어 있다. 예를 들면, 하나의 랜카드가 있지만, 이를 통해 통신을 하고 싶어하는 프로그램들은 많을 수 있다(브라우저, 메신저 등). 그렇다면, 이에 대한 통제는 누가할까? 바로 커널이 한다.
한정된 자원을 효율적으로 사용할 수 있게 한다.

디바이스 드라이버는 운영체제에 종속적이다. 같은 하드웨어지만, 운영체제에 따라 서로 다른 드라이버가 존재한다. 여기서는 LDD 인 만큼 리눅스를 기준으로 설명한다.

리눅스에서 정의하는 디바이스 유형

현재 리눅스에서 지원하는 디바이스가 무수히 많지만, 크게 3가지 유형으로 정의한다. 리눅스의 특징이라고 할 수 있는 장치 디바이스를 파일로 매핑하여 나타낸다(/dev). 문자, 블럭 디바이스의 경우 드라이버에서 해당 장치파일을 이용하여 제어한다.

마치 파일을 참조하듯이 사용한다. 따라서 open, close, read, write 와 같은 시스템콜을 사용한다. 하지만 몇몇 예외적인 디바이스를 제외하고 일반 적인 파일 참조와 같이 앞뒤로 원하는 위치로 이동할 수 없다.
대표적인 문자 디바이스로는 문자열 콘솔(/dev/console), 직렬포트(/dev/ttyS0) 등이 있다.

블록을 전송하는 I/O 작업을 수행한다.
주로 파일시스템을 사용하는 디바이스(하드 디스크 등)가 해당된다.

네트워크 디바이스는 패킷 전송과 수신을 위주로 동작한다. 다른 디바이스와는 달리 장치파일에 매핑되지 않는다. 네트워크 드라이버는 개별적인 접속 연결에 대해서는 알지 못하고, 패킷만 처리한다.

디바이스 드라이버 작성시 유의할 점

디바이스 드라이버는 사용자 프로그램과는 달리 커널 영역에서 실행되기 때문에, 전체 시스템에 악영향을 끼칠 수 있다.

드라이버는 함께 커널메모리에 로딩 되어 커널과 함께 실행되기 때문에 커널에 의존적이다. 커널은 수시로 업데이트 될 수 있고, 이에 따라 참조하는 구조체등이 바뀔 수 있다. 될 수 있으면 안정버전(짝수버전)을 사용하고 새로운 커널에 대하여 동작여부를 모니터링 할 필요가 있다.

리눅스는 GPL(General Public License) 버전 2를 사용한다. 이는 GPL 제품을 토대로 만든 소프트웨어 제품은 소스코드를 공개 및 배포해야 한다.
그런데, 커널 모듈을 바이너리 형태로 배포하는 경우에 대해 답은 애매하게 남겨져 있다.

  • computer/lg/1장_-_디바이스_드라이버_소개.txt
  • Last modified: 4 years ago
  • by likewind