달공이와 임베디드

디바이스 드라이버에 대한 이해 본문

디바이스 드라이버

디바이스 드라이버에 대한 이해

하일리99 2016. 8. 23. 15:31

디바이스 드라이버에 대한 이해


 디바이스 드라이버란 커널공간에서 응용프로그램과 하드웨어간의 데이터를 주고 받게 해주는 프로그램이다. 이 디바이스 드라이버는 정의되어 있는 인터페이스로 커널과 연결된다.



 

리눅스에서는 모든 것을 파일로 관리한다. 연결되어 있는 하드웨어 장치 또한, 장치 파일(Device file) 로 관리하는 것이다. 그리고 이러한 장치 파일에 대한 컨트롤을 "디바이스 드라이버(Device Driver) 라는 프로그램" 을 통해 관리하는 것이다. 이 때, 디바이스 드라이버는 "정해져 있는 하드웨어 제어함수"를 통해 장치를 제어하도록 작성된다.


디바이스 드라이버의 종류


1) 문자 디바이스 드라이버(chrdev)

2) 블록 디바이스 드라이버(blkdev)

3) 네트워크 디바이스 드라이버(netdev)

 

※ 리눅스 운영체제에서 등록되어 있는 디바이스는 /proc/devices 에서 확인할 수 있다.

        





디바이스 드라이버와 모듈


디바이스 드라이버의 자원처리 요청은 다음과 같은 두가지 방법으로 이루어 질 수 있다.

하나는 1) 시스템 호출 이고 다른 하나는 2) 파일 입출력 형식 을 이용한 방법이다.


1) 시스템 호출의 경우


 각 기능별로 시스템 콜 번호를 부여, 번호에 해당하는 제어 루틴을 커널 내부에 정의, 응용프로그램에서 원하는 기능 번호를 레지스터에 저장 후 원하는 기능을 호출(System Call), 시스템 콜이 발생하면 제어권은 커널이 가지고, 커널 내의 서비스 루틴 기능 번호를 살펴보고 번호에 맞는 서비스 루틴을 호출, 서비스 루틴이 모두 실행된 후 제어권을 다시 응용프로그램으로 넘김.

※ 이와 같은 시스템 호출과정이 나타나면, 기능에 따라서 시스템 콜 번호를 부여하게 되는데 각각의 디바이스 드라이버 마다 시스템 콜 번호를 부여한다면, 시스템 콜 번호가 너무 많아지게 될 것이다. 그럼 관리해야 하는 시스템 콜이 증가하고 필요 없는 기능일지라도 커널소스에 포함되어, 커널의 크기가 커진다는 단점이 있다.

※ 따라서, 모든 기능을 커널에 넣지 않고 모듈이라는 형식을 통해 디바이스 드라이버를 구현한다.


2) 파일 입출력 형식을 이용한 경우


 일반 파일을 제어하듯이 디바이스 파일에 입출력을 시도, 커널 내에 해당 디바이스 파일에 연결된 디바이스 드라이버의 서비스 루틴이 호출되어서 처리( 이 때의 제어권은 커널 ), 서비스 루틴에서 모든 처리가 완료되면 제어권은 다시 응용프로그램으로.

※ 모듈이라는 형식을 통해 커널에 접근하고 파일 입출력 형식을 사용한다.




모듈의 구현원리


 커널 라이브러리를 객체(.ko) 형태로 만들어 시스템 콜을 통해 커널에 적재를 요청하고, 그 요청에 따라 커널은 해당 객체를 커널에 동적으로 링크하여 사용한다. 이를 구현하기 위해 커널에 심볼 테이블 기능이 추가 됬다.




모듈의 기본구성 : 모듈의 적재와 제거


 


기본적으로 모듈의 적재와 제거로 구성되어 진다. 모듈의 적제시 start() 함수를 수행하고, 적재된 모듈의 제거시 end() 함수를 수행한다. 일반적인 디바이스 드라이버가 모듈로 작성될 경우, start() 함수에는 register_chrdev 함수가 들어가 있고, end() 함수 내에는 unregister_chrdev 함수가 들어 있어서 모듈의 적재와 적재해제시에 사용할 장치파일과 사용할 file_operations 내의 함수를 연결시킨다.


모듈의 유틸리티

 insmod [모듈명].ko : 모듈의 커널 적재 

 rmmod [모듈명] : 커널에 적재된 모듈 제거

 lsmod [모듈명] : 커널에 적재된 모듈 확인

 modprobe / depmod : 모듈의 의존성 검사



참고자료

http://knight76.tistory.com/entry/%EC%BB%A4%EB%84%90-%EB%AA%A8%EB%93%88-%EC%A4%91%EC%9A%94-%ED%8F%AC%EC%9D%B8%ED%8A%B8

http://kkangstory.tistory.com/entry/LDD

http://imarch.pe.kr/?p=963


'디바이스 드라이버' 카테고리의 다른 글

디바이스 드라이버 프로그램의 구성  (0) 2016.08.23
Module 생성을 위한 과정  (0) 2016.08.23
Comments