(1) 문자 디바이스
: 파일처럼 바이트 스트림(stream)으로 접근(read/write)할 수 있는 디바이스다.

- 문자 디바이스 드라이버 작성 시 응용프로그램에서 이 디바이스를 사용할 수 있도록 시스템 콜 함수들을 구현해야 한다.
  ○ open(), close(), read(), write() 등..
  ○ ioctl()함수도 함께 구현해야 하는 경우도 많다.
  ○ ex) 콘솔 직렬포트, 병렬포트 등 -> /dev/tty1, /dev/ttyS0, /dev/lp1

- 문자디바이스와 일반 파일과의 유일한 차이
  ○ 프로그래밍 시 일반 파일에 접근할 때 파일 내부의 위치포인터를 앞뒤로 옮길 수 있다.
  ○ 문자 디바이스는 순차적으로 접근할 수 밖에 없다.(입/출력 데이터를 송/수신하는 데이터 채널이다.)


(2) 문자 디바이스 드라이버 동작
: 시리얼 포트나 키보드 같은 디바이스는 바이트 단위로 처리되고, 써넣은 데이터는 보존될 수도, 보존되지 않을 수도 있다. 또한 처리 용량과 같은 개념이 없다. 키보드의 입력은 시간에 따라 연속적으로 발생할 수 있고, 발생한 데이터의 끝을 알 수 없기 때문이다. 시리얼 입출력 역시 파일의 끝과 같은 개념이 없다. 리눅스는 이런 특성을 갖는 디바이스를 다루기 위해 문자 디바이스 드라이버를 제공한다.

- 응용 프로그램에서 저수준 파일 함수를 이용해 디바이스 파일에 데이터를 읽고 쓴다.
- 이에 대응하는 디바이스 드라이버 내의 선언 함수가 호출된다.
- 하드웨어에서 특정 처리를 수행한 뒤, 결과는 역으로 응용 프로그램으로 전달된다


- 응용 프로그램 : 응용 프로그램은 시스템에 준비된 함수나 프로그램 자체적으로 선언된 함수를 이용해 특정 기능을 수행하도록 구현한 프로그램이다. 리눅스에서 동작하는 응용 프로그램은 사용자 공간에서 프로세스 형식으로 동작하고, 시스템에 의해 할당된 메모리와 파일만 제어할 수 있기 대문에 하드웨어에 직접 접근할 수는 없다. 그래서 디바이스 파일이라는 특수 파일을 이용해 하드웨어에 접근한다.

- 디바이스 파일 : 디바이스 파일은 일반 파일과 달리 커널 내의 파일 시스템 구조에 의해 하드웨어를 제어하는 디바이스 드라이버 함수와 연결된다. 그래서 응용 프로그램은 하드웨어를 제어하기 위해 저수준 파일 입출력 함수를 사용해 디바이스 파일에 데이터를 쓰거나 읽고, 그 결과로 하드웨어를 제어하는 디바이스 드라이버 함수가 호출된다.

- 디바이스 드라이버 : 하드웨어를 제어하기 위해서는 해당 디바이스를 제어하는 함수 집합인 디바이스 드라이버가 커널 내부에 있어야 한다. 이 디바이스 드라이버는 모듈 형태로 커널에 적재될 수도 있고, 처음부터 커널 내부에 구현되어 있을 수도 있다. 그래서 문자 디바이스 드라이버의 경우에는 응용 프로그램에서 해당 디바이스 드라이버와 연결된 디바이스 파일을 통해 호출해야 하지만, 블록 디바이스 드라이버나 네트워크 디바이스 드라이버는 커널에서 직접 호출해서 사용한다.


by 민트앤라떼 2011. 9. 28. 14:50