캐릭터 디바이스 드라이버



1. 디바이스 타입



  • dev_t
major/minor 번호가 조합된 수형
major 번호와 쌍을 이뤄 하나의 장치 번호를 구성


- 매크로 (include/linux/kdev_t.h)

MAJOR(dev_t dev);         주번호 추출

MINOR(dev_t dev);         부번호 추출

MKDEV(int ma, int mi);    번호 설정



  • major 번호의 결정

- Manual Allocation

현재 사용 중이지 않은 major 번호를 알아낸 후 직접 하드 코딩함.

- Dynamic Allocation

alloc_chrdev_region() 함수를 이용하여 동적으로 할당

단점: 미리 디바이스 파일을 만들어 둘 수 없음
해결책: 장치 번호 등록 후 /proc/devices를 읽어 major 번호를 얻고, 장치 파일을 만드는 스크립트를 활용한다.




  • cdev 구조체

커널은 내부적으로 캐릭터 디바이스를 표현하기 위해 cdev 구조체를 사용
커널이 file operation에 등록된 디바이스 등록 함수 (open, read..)를 호출하기 전에 할당 및 등록하여야 한다.

<linux/cdev.h> 

 struct cdev{

      struct kobject kobj;

      struct module *owner;

      const struct file_operations *ops;

      struct list_head list; dev_t dev;

      unsigned int count;

}






2. 캐릭터 디바이스 드라이버 API



  • register_chrdev_region()

디바이스 개수를 포함한 디바이스 드라이버 등록 함수



- 함수


int register_chrdev_region (dev_t first, unsigned int count, char* name)



- 매개 변수


 first 

 할당 받으려는 디바이스 번호 범위 중 시작 번호.

 major/minor 번호를 모두 포함

 count

 minor 번호로 디바이스 개수

 *name

 디바이스 이름 (/proc/devices 에 나타난다)





  • alloc_chrdev_region()
디바이스 번호를 동적으로 할당하기 위한 함수

- 함수

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name)

- 매개 변수

*dev

 성공적인 경우 디바이스 번호가 할당

 firstminor

 디바이스에 할당될 첫번째 minor number, 일반적으로 0

 count

 minor number로 디바이스 개수

 *name

 디바이스 이름(/proc/devices와 sysfs에 나타난다)





  • unregister_chrdev_region()
사용중인 디바이스 번호 해제

- 함수

void unregister_chrdev_region (dev_t first, unsigned int count)




  • cdev_init()
cdev 구조체 초기화

- 함수

void cdev_init (struct *cdev, struct file_operations *fops)

- 매개 변수

 *cdev 

 초기화할 cdev 구조체 

 *fops

 등록할 fop 구조체 포인터 





  • cdev_add()
준비된 cdev 구조체를 커널에 등록, 캐릭터 디바이스 등록

- 함수

void cdev_add (struct cdev *cdev, dev_t num, unsigned int count)

- 매개변수

 *cdev

 등록한 cdev 구조체

 num

 등록할 디바이스 번호 (major/minor 포함) 

 count

 등록할 디바이스 개수, 주로 1 






  • cdev_del()
등록된 캐릭터 디바이스를 제거.
디바이스 파일도 삭제해야 한다.
디바이스 번호도 삭제, unregister_chrdev_region() 이용

- 함수

int cdev_del (struct cdev *cdev)








디바이스 드라이버 (Device Driver) - 1. 개요


  • 시스템이 지원하는 하드웨어를 응용 프로그램에서 사용할 수 있도록 커널에서 제공하는 라이브러리
  • 응용 프로그램이 하드웨어를 제어하려면 커널에 자원을 요청하고, 커널은 요청에 따라 시스템 관리
    ..

  • 디바이스 드라이버의 역할
    • 디바이스 드라이버는 하드웨어를 사용가능하게 만들어 줄 뿐 하드웨어를 어떻게 사용할지에 대한 결정은 응용 프로그램에 넘겨야 한다.
    • 디바이스 드라이버는 온갖 상황을 고려해 균형있게 작성한다.

  • 리눅스 디바이스 드라이버의 공통적 특성
    • 커널 코드
      • 디바이스 드라이버는 커널의 한 부분이므로, 커널의 다른 코드와 마찬가지로 잘못되면 시스템에 치명적인 피해를 줄 수 있다.
    • 커널 인터페이스
      • 디바이스 드라이버는 리눅스 커널이나 자신이 속한 서브시스템에 표준 인터페이스를 제공해야 한다.
    • 커널 메커니즘과 서비스
      • 디바이스 드라이버는 메모리 할당, 인터럽트 전달, wait queue와 같은 표준 커널 서비스를 사용할 수 있다.
    • Loadable
      • 대부분의 리눅스 디바이스 드라이버는 커널 모듈로서, 필요할 때 로드하고 더 이상 필요하지 않을 때 언로드 할 수 있다.
    • 설정 가능 (Configuration)
      • 리눅스 디바이스 드라이버를 커널에 포함하여 컴파일할 수 있다.
      • 어떤 장치를 넣을 것인지는 커널을 compile할 대 설정할 수 있다.


  • 디바이스 드라이버 종류
    • 문자 디바이스 드라이버
      • 임의의 길이를 갖는 문자열이나 자료의 순차성을 지닌 장치를 다루는 디바이스 드라이버
      • serial, console, keyboard, printer, mouse 등이 있다.
    • 블록 디바이스 드라이버
      • 일정 크기의 버퍼(블록 단위)를 통해 데이터를 처리하는 디바이스
      • 커널 내부의 파일시스템에서 관리하고 내부적인 버퍼가 있는 디바이스 드라이버
      • 하드 디스크, 램 디스크 등이 있다.
    • 네트워크 디바이스 드라이버
      • 네트워크 계층과 연결되어 네트워크 통신을 통해 네트워크 패킷을 송수신할 수 있는 기능을 제공
      • 이더넷, PPP 등이 있다.


+ Recent posts