• Module Programming


    - 절차


    - 특징



    - Module 적재 및 제거


    - 기본 구조


    - Module 관련 유틸리티


    - Module Program 작성




  • Device Driver
    : 디바이스와 시스템 사이에 데이터를 주고받기 위한 인터페이스
    : 표준적으로 동일한 서비스 제공을 목적
    : 커널의 일부분으로 내장
    : 서브루틴과 데이터의 집합체
    : 디바이스의 고유한 특성을 내포




    - Device 종류



    - 디바이스 파일



    - File Operations







    ■ Character Device Driver


    ■ Ext4_file_operations



    - 디바이스 드라이버 구현



    : 모드간 데이터 전송

     

     

     : I/O 영역 경쟁 처리

     

     

     

    : 디바이스 종류별 등록/해제

     


    문자 디바이스 드라이버
     - 2.6 이후
      1. 디바이스 번호 등록
      2. cdev 구조체 생성 및 초기화
      3. 디바이스 등록 cdev_add(); -> module_init();
      4. file_operations 구조체에 대입될 함수들을 작성

    - 출처 : http://blog.dasomoli.org/223

    : register_chrdrv_region 함수는 원하는 디바이스의 번호를 미리 알고 있을 때 사용하고, alloc_chrdev_region 함수는 디바이스의 번호를 동적으로 할당받아 파라미터로 받는 dev_t 구조체 포인터를 이용해 dev_t 구조체에 넣는다.
    register_chrdrv 대신 register_chrdrv_region을 사용하는 것으로 혼동할 수 있는데 그게 아닌 cdev_add 함수까지 사용하여야 한다. 실제 커널 소스의 register_chrdrv 함수를 보면 이런 과정이 구현되어 있음을 볼 수 있다.
    cdev_add 함수를 사용하기 위해서는 struct cdev 구조체를 사용하여야 하는데 이 구조체를 초기화 시켜주는 함수가 cdev_init 이다. struct cdev 구조체 등을 사용하려면 <linux/cdev.h> 를 include하여야 한다. 다음은 사용 예이다.

     
    #include <linux/kernel.h>
    #include <linux/cdev.h>
    #include <linux/fs.h>
    
    ...
    struct file_operations dasom_fops;
    
    static struct cdev dasom_cdev = {
        .owner = THIS_MODULE,
        .ops = &dasom_fops,
    };
    
    int _init dasom_init(void)
    {
        dev_t dev;
        int err = 0;
    
        if(major) {
            dev = MKDEV(major, minor);
            err = register_chrdev_region(dev, 1, "dasomoli");
        } else {
            err = alloc_chrdev_region(&dev, mior, 1, "dasomoli");
            major = MAJOR(dev);  
        }
        if(err < 0) {
            err = -ENODEV;
            return err;
        }
        ...
        
        cdev_init(&dasom_cdev, &dasom_fops);
        dasom_cdev.owner = THIS_MODULE;
        dasom_cdev.ops  = &dasom_fops;
    
        if(cdev_add(&dasom_cdev, dev, 1)) {
            printk(KERN_INFO"dasom: cdev creation failed.\n");
            err = -ENODEV;
            goto error_label;
        }
        
        ...
        
        return 0;
        
    error_label:
        return err;
    }
    


     - 2.6 이전
     
     

     블록 디바이스 드라이버
     
     

    ■ 

    네트워크 디바이스 드라이버

     
     

    - Character Device Driver with VFS


    - File System and Device Driver




  • 전체 요약







'Major > Linux' 카테고리의 다른 글

리눅스 - Ext4 File System  (0) 2016.02.01
리눅스 - 가상 파일 시스템  (0) 2016.01.28
리눅스 - 파일 디스크립터  (7) 2016.01.28
리눅스 - 파일 시스템  (0) 2016.01.28
리눅스 - System Call  (0) 2016.01.28

+ Recent posts