(시스템 프로그래밍) 14-2 디바이스 드라이버 구성 (문자 디바이스 드라이버)

업데이트:
1 분 소요

시스템 프로그래밍 - 디바이스 드라이버 구성 (문자 디바이스 드라이버)

1. 문자 디바이스 드라이버

1) file 구조체

  • 디바이스 드라이버 구현시 사용
  • c 라이브러리에 정의된 FILE과는 다름
  • 응용 프로그램에서는 사용할 수 없고, 단지 커널에서만 사용
  • 파일 연산을 위한 인자 전달 방법으로 사용
  struct file{

    structdentryf_dentry;         // 파일에 대한 디렉토리 엔트리
    structsmount *f_vfsmnt;
    structfile_operationsf_op;    // 다양한 파일 연산 함수가 정의된 파일 연산 구조체를 지시
    atomic_tf_count;              // 프로세스 파일 참조 횟수
    unsigned intf_flags;          // 접근모드, 비블록킹, 생성, 첨부 등에 관련된 플래그
    mode_t f_mode;                // 파일 모드로 FMODE_READ or FMODE_WRITR 구분
    loff_t f_pos;                 // 현재 읽기/쓰기 위치
    unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin;
    structfown_structf_owner;
    unsigned intf_uid, f_gid;     // 파일 사용자 및 그룹 식별자
    intf_error;
    unsigned long f_version;
    void *private_date;           // 시스템 호출간에 필요한 정보를 보존하기 위해 사용
  };

2) 파일 연산 구조체

  • 파일 연산 구조체 변수를 커널에 등록하는 것이 디바이스 드라이버를 등록하는 것
  <linux> /include/linux/fs.h 선언

(1) 응용 프로그램

  • 저수준 파일 입출력 함수를 사용하여 디바이스 파일에 접근

(2) 커널

  • 등록된 디바이스 드라이버의 파일 연산 구조체를 참고해 응용프로그램의 요청에 대응하는 함수 호출
  structfile_operations {

    struct module *owner              // 파일 작업의 소유자, 보통 THIS_MODULE로 지정
    loff_t (*lseek)(struct file*, loff_t, int)  // 파일에서 현재 읽고 쓰는 위치 이동
    ssize_t (*read) (struct file*, char*, size_t, loff_t *) // 디바이스에서 파일 읽음
    ssize_t (*write)(struct file*, const char*, size_t, loff_t *)// 디바이스에 데이터 씀
    int (*readdir) (struct file*, void*, filldir_t);  // 디렉토리에서만 사용 함수
    unsigned int(*poll)(struct file*, structpoll_talbe_struct *);
                                                      // 현 프로세스를 대기 큐에 넣음
    int(*ioctl)(structinode*, struct file*, unsigned int, unsigned long);
                                          // 디바이스에 종속적인 명령을 만듬. 사용자가 임의로 함수 만듦
    int(*mmap)(struct file*, structvm_area_struct *)
                                          // 디바이스의 메모리를 프로세스의 메모리로 매핑
    int(*open)(structinode *, struct file *)  // 디바이스를 개방
    int(*release)(structinode *, struct file *) // 디바이스를 종료
    int(*fsync)(struct file *, structdentry *);
                             // 디바이스를 플러시함, 데이터 중에서 디바이스에 있는 것은 모두 디바이스에 씀
    int (*fasync)(int, struct file*, int);  // FASYNC 플래그 변화에 있는 디바이스 확인용
    int(*check_media_change)(kdev_t dev); // 미디어가 변경될 수 있는 블록디바이스 사용
    int (*revalidate)(kdev_t dev);    // 제거가능한 블록 디바이스에서 버퍼 캐시 관리용
    int(*lock)(strict file*, int, structfile_lock *); // 파일에 잠금 가능
  }

댓글남기기