- 각 I/O 디바이스를 제어하기 위해 Device-specific code(커널에서 같이 동작)가 담겨져 있다.
- device-independent I/O sw와 interrupt handlers와의 상호작용을 해야 한다.
- 잘 정의된 모델 그리고 표준 인터페이스에 따라서 만들어져야 한다.(OS와 하드웨어가 잘 맞도록)
- DD 구현 방식
-> statically linked with 커널
-> 부팅할 때 선택적으로 DD를 로딩할 수 있다.
-> 시스템 리눅스 커널이 실행하면서 DD요청이 들어오면 dynamically 로딩이 가능하다.(ex)USB)(요즘 많이 사용하는 방식)
- DD가 충분히 안정적인 코드가 아니라면 전체 시스템에 문제를 일으킨다. 한 번 문제가 생기면 커널이 망가지는 것이라 완전히 시스템이 다운되는 상황이 생긴다.
-> 주식거래, e-commerce, 버스 안내 시스템, atm 등 임베디드 시스템에서 문제가 생기면 안된다. 만약 DD가 커널 영역을 침범해서 동작하게 되면 커널을 망가뜨릴 수 있다.
-> OS제작 회사에서 DD를 만드는 것이 아니라 HW제작 회사에서 DD를 만드므로 커널 영역을 잘못건드리는 상황이 발생하여 문제가 생길 수 있다.- DD extension이 계속하여 증가하고 있다.
-> linux 커널 코드의 70%는 DD다.
-> OS제작 회사보다는 덜 숙련된 개발자에 의해 만들어질수도 있다.- 블루 스크린이 생기는 이유
-> window XP crashes의 85%는 DD의 잘못이다.
-> 리눅스 커널에 있는 것보다 DD의 버그가 7배 더 많다.
바로 밑에 있는 DD와 상호작용하는 SW이다.(커널을 개발하는 회사에서 만든다.)
1. Unix에서는 divice를 특별한 파일 형태로 관리한다. 즉, 파일을 다루는 open, read, write, close, ioctl 등 시스템 콜들을 통해서 이 디바이스를 다룰 수 있다는 말이다.
-> 파일 이름이 각 디바이스에 맵핑되도록 한다.
- Major device number는 특정한 driver를 의미한다.
-> minor device number는 parellel port에서 각 디바이스를 구분하는 번호이다. 같은 디바이스지만 partition별로 다른 번호를 부여한다.
- 일반적인 protection rule을 file에서 쓰는 것과 함께 쓸 수 있다는 장점이 있다.(read/write 등 file interface를 통해 protection관리를 할 수 있다. 통일되고 일관된 방식으로 디바이스를 다룰 수 있다.)
- error reporting(error handling)
-> 에러에 대해서 사용자에게 report해줘야 한다.
-> 적절한 driver에 의해 handle되어야 한다.
-> programming errors vs 실제 I/O errors
- handling errors
-> 반드시 에러 코드와 함께 시스템 콜을 리턴해줘야 한다.
-> 몇 번 정도 다시 시도할 수 있다.
-> 에러를 무시할 수 있다.
-> 프로세스를 죽여야 할 수도 있다.
-> 시스템을 다운해야 할 수도 있다.
- 라이브러리 형태로 제공된다.
-> C에서 표준 I/O 라이브러리(fopen, open)- 라이브러리는 다양하게 제공된다.(fgets, fscanf)
- 자신만의 라이브러리를 만들 수 있다.(myopen, myfgets)