본문 바로가기
dev, tech

<img src="http://blogimgs.naver.com/nblog/ico_scrap01.gif" class="i_scrap" width="50" height="15" alt="본문스크랩" /> Device Driver 및 makefile

by 구띵 2006. 6. 10.
 

  1. Device Driver


1) Device Driver의 정의

  ◦ Device Driver란 물리적인 하드웨어 장치를 다루고 관리하는 소프트웨어로서 사용자 어플리케이션이 드라이버에게 요청을 하면, 드라이버는 하드웨어를 구동시켜서 목적을 달성한다. 장치와 시스템 메모리 간에 데이터의 전달을 담당하는 내부 기능을 수행하며, Major Number와 Minor Number를 이용하여 각각의 장치들을 구분하여 사용한다.



2) Device Driver들의 공통적인 특성

  ◦ 디바이스 드라이버는 커널의 한 부분이므로, 커널의 다른 코드와 마찬가지로 잘못되면 치명적인 피해를 줄 수 있다.

  ◦ 리눅스 커널이나 자신이 속한 서브 시스템에 표준 인터페이스를 제공해야 한다.

  ◦ 메모리 할당, 인터럽트 전달, Wait queue같은 표준 커널 서비스를 사용할 수 있다.

  ◦ 대부분은 커널 모듈로서, 필요할 때 로드하고 더 이상 필요하지 않을 때 언로드 할 수 있다.

  ◦ 리눅스 디바이스 드라이버를 커널에 포함하여 컴파일 할 수 있다. 어떤 장치를 넣을 것인가는 커널을 컴파일 할 때 설정을 할 수 있다.



3) Device Driver의 종류

  ◦ Device Driver는 Char Driver와 Block Driver, Network Driver로 나뉘며, 이들은 다음과 같은 작업을 수행한다.

 - Char Driver : 자료의 순차성을 지닌 장치로서, 버퍼 캐쉬를 사용하지 않는다. 장치들은 파일처럼 취급하고 접근하여 직접 읽기/쓰기를 수행하며, 데이터 형태는 스트림 방식으로 전송한다. 터미널, 콘솔, 키보드, 사운드 카드, 스캐너, 프린터, 시리얼 포트 드라이버 등이 이에 해당한다.

사용자 삽입 이미지


 - Block Driver : 랜덤 액세스가 가능하며, 블록단위의 입출력이 가능한 장치이다. 버퍼 캐쉬에 의해 내부 장치를 표현하며 파일 시스템에 의해 마운트되어 관리 되는 장치이다. 디스크와 같이 파일 시스템을 기반으로 일정한 블록 단위로 데이터를 읽기/쓰기를 수행한다. 플로피 디스크, 하드 디스크, 램디스크, 시디롬 드라이버 등이 이에 해당한다.

사용자 삽입 이미지


 - Network Driver : 대응하는 장치 파일이 없으며 응용프로그램과의 통신은 파일 시스템 관련 콜 대신 socket(), bind() 등의 시스템 콜을 사용한다. 네트워크의 물리계층과 프레임 단위의 데이터를 송수신 하며, 이더넷, PPP, ATM, ISDN 드라이버가 이에 해당한다.



사용자 삽입 이미지

<Device Driver의 동작 과정>

※ Major Number & Minor Number

    장치를 구분하는 방법으로 둘을 이용하여 특정 장치를 구별한다. Major Number는 커널에서 디바이스 드라이버를 구분하는데 사용하고 Minor Number는 디바이스 드라이버 내에서 필요한 경우 장치를 구분하기위해 사용한다. 새로운 장치는 새로운 Major Number를 가져야 하며, register_chrdev()로 장치를 등록할 때, Major Number를 지정한다. 다른 장치 간에는 같은 Major Number를 가질 수 없으며, 만약 시도할 경우에는 실패로 등록되지 않는다. Major와 Minor Number는 파일의 정보를 담고 있는 inode의 i_dev에 16bit로 저장되며 상위 8bit는 Major, 하위 8bit는 Minor이다.

사용자 삽입 이미지

<Major Number & Minor Number>


  2. Makefile

1) Makefile이란 무엇인가

  ◦ Makefile은 make가 이해할 수 있도록 일종의 쉘 스크립트 언어같이 되어 있으며 makefile database라 하기도 한다. 이 파일에는 결과 파일을 생성시키기 위한 파일들 간의 관계, 명령어 등이 기술되어 있다. GNU make는 보통 GNUmakefile, Makefile, makefile 중에서 하나가 있으면 그 파일을 읽게 된다. 하지만 일반적으로 Makefile을 추천하게 되는데, 그 이유는 우선 GNUmakefile은 기존의 make에서 인식을 못한다는 단점이 있고, makefile은 보통 소스 파일에 묻혀서 잘 안보이게 되기 때문이다.

  ◦ make는 프로그램 그룹을 유지하는데 필요한 유틸리티이다. make유틸리티의 목적은 프로그램 그룹 중에서 어느 부분이 새롭게 컴파일 해야 하는지를 자동적으로 판단해서, 필요한 커맨드를 이용해서 그들을 재 컴파일 시키는 것이다. make는 일련의 프로그램 개발에만 쓰이지 않고, 컴파일러처럼 일종의 명령어 방식으로 처리되는 모든 곳에서 쓰일 수가 있다.


2) Makefile의 사용법

  ◦ Makefile은 기본적으로 아래와 같이 목표(target), 의존 관계(dependency), 명령(command)의 세 가지로 이루어진 기분적인 규칙(rule)들이 계속적으로 나열되어 있다고 봐도 무방하다. make가 지능적으로 파일을 갱신하는 것도 모두 이 간단한 규칙에 의하기 때문이다.

target ... : dependency ...

           command

           ...

           ...

  ◦ 목표(target) 부분은 명령(command)이 수행이 되어서 나온 결과 파일을 지정한다. 당연히 목적 파일(object file)이나 실행 파일이 된다. 목표 부분에는 결과 파일만 올 수 있는 것이 아니고, 보통 make clean 에서와 같이 간단한 레이블(label) 기능을 제공하기도 한다.

  ◦ 명령(command)부분에 정의된 명령들은 의존 관계(dependency)부분에 정의된 파일의 내용이 바뀌었거나, 목표 부분에 해당하는 파일이 없을 때 이곳에 정의된 것들이 차례대로 실행이 된다. 일반적으로 쉘에서 쓸 수 있는 모든 명령어들을 사용할 수가 있으며 bash에 기반을 둔 쉘 스크립트도 지원한다. 명령 부분은 반드시 TAB 글자로 시작해야 하며 그냥 빈칸 등을 사용하면 make 실행 중에 에러가 발생한다.

사용자 삽입 이미지

<사용 예제>

 3. 결론 및 토의

  ◦  Makefile과 Device Driver를 조사하면서 한 가지 놀라운 사실을 발견하였다. Device Driver 부분의 자료를 찾고 있는데, 작성을 마친 뒤 강의 게시판을 보니 강의 자료가 올라와 있기에 어느 정도 조사가 잘 되었나 확인하는 순간 경악을 금치 못하였다. 내가 조사한 자료가 똑같이 강의 자료로 올라와 있었기 때문이다. 정말 난감했기에 다시 조사를 시작하여 정리를 하고 추가를 하였다.

     Makefile 같은 경우는 지난해, 유닉스 시스템 및 실습시간에 배웠기에 쉽게 이해할 수 있었다. 따라서 GNU 문서를 바탕으로 하여 조사를 실시하였다.



 ■ 참고 문헌

   ▪ HUINS ; ARM, SoC, Embedded, Sensor Networks Design - http://www.huins.com/

   ▪D.C.I.E. ;SNU Department of Control and Instrumentation Engineering- http://cie.snut.ac.kr/

   ▪ K.L.D.P. ; Korean Linux Documentation Project - http://kldp.org

댓글