문자 디바이스 드라이버

문자 디바이스 드라이버 동작

■ 문자 디바이스 드라이버는 블록 단위 디바이스와 상대적 개념
■ 하드디스크와 같은 장치는 섹터 단위로 저장되며 처리 범위가 정해져 있음
■ 반면, 시리얼 포트나 키보드 같은 디바이스는 바이트 단위로 처리, 파일 끝의 개념이 없음

■ 커널은 디바이스 파일에 기록된 디바이스 타입과 주 번호를 이용해 커널 내에 등록된 디바이스 드라이버 함수를 연결
■ 문자 디바이스 드라이버는 커널 2.6에서 fs/char_dev.c에 chrdevs라는 전역 변수를 다음과 같이 정의

struct char_device_struct chrdevs[MAX_PROBE_HASH];

linux kernel 2.6.25

static struct char_device_struct {
        struct char_device_struct *next;
        unsigned int major;
        unsigned int baseminor;
        int minorct;
        char name[64];
        struct file_operations *fops;
        struct cdev *cdev;              /* will die */
} *chrdevs[CHRDEV_MAJOR_HASH_SIZE];

linux kernel 2.6.38

static struct char_device_struct {
        struct char_device_struct *next;
        unsigned int major;
        unsigned int baseminor;
        int minorct;
        char name[64];
        struct cdev *cdev;              /* will die */
} *chrdevs[CHRDEV_MAJOR_HASH_SIZE];

kernel 2.6.25 버전 이후로 file_operations 구조체 포인터 변수 fops가 struct cdev 구조체 필드로 이동

linux/include/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;
};

■ fops 필드는 file_operations 구조체로, 응용 프로그램이 디바이스 파일에 적용한 저수준 파일 입출력 함수에 대응하는 디바이스 드라이버의 함수 주소를 지정하는 필드를 포함

■ 호출 구조
 1. 응용 프로그램에서 open() 함수로 디바이스 파일을 열어 타입 정보와 주번호를 얻음
 2. 이 정보를 이용하여 chrdevs 배열에 등록된 디바이스 드라이버의 인덱스를 얻음
 3. 인덱스값으로 chrdevs 변수에 등록된 file_operations 구조체 주소를 얻음
 4. 해당 구조체에서 문자 디바이스 드라이버를 등록하는 함수를 사용하여 주수준 파일 입출력에 대응하는 함수를 호출

Leave a Reply