最初のLinuxドライバ

4617 ワード

モジュールプログラミング
Linuxドライバは本質的にモジュールであり、モジュールは対応するインタフェースを実現し、Linuxカーネルという本体と結合しなければならない.しかし、モジュールのプログラミングモードはPHPモジュール、nginxモジュールなど、ほとんど似ています.モジュールプログラミングは主に以下の点に注目します.
  • 本体はどうしてモジュールが
  • 入っていることを知っていますか.
  • モジュールは、本体が使用する
  • としてどのようなインタフェースを実現するか.
  • モジュールは、本体のどのインタフェース
  • を呼び出すことができるか.
    先に見るのが早い
    やはり一例を見てみましょう.
    word_count.c :
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    #define DEVICE_NAME "wordcount"
    
    static ssize_t word_count_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { 
       //     
       return 0;
    }
    
    static ssize_t word_count_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) {
       //     
       return 0;
    }
    
    static struct file_operations dev_fops = { 
        .owner = THIS_MODULE,
        .read = word_count_read,
        .write = word_count_write
    };
    
    static struct miscdevice misc = { 
        .minor = MISC_DYNAMIC_MINOR, 
        .name = DEVICE_NAME,
        .fops = &dev_fops
    };
    
    static int word_count_init(void) {
        int ret;
        //       
        ret = misc_register(&misc);
    
        printk("word_count_init_success
    "
    ); return 0; } static void word_count_exit(void) { // misc_deregister(&misc); printk("word_count_exit_sucess
    "
    ); } // register init function module_init(word_count_init) // register exit function module_exit(word_count_exit) // modinfo MODULE_AUTHOR("lijianxing"); MODULE_DESCRIPTION("statistics of word count"); MODULE_ALIAS("word count module."); MODULE_LICENSE("GPL");

    Makefile:
    obj-m := word_count.o

    コンパイル:
    make -C /usr/src/linux-headers-3.16.0-30-generic/ M=your_path/word_count

    ドライバのインストール:
    sudo insmod word_count.ko

    ドライバのアンインストール:
    sudo rmmod word_count

    dmsgコマンドを使用してprintk出力の情報を表示します.
     dmesg | grep word_count 

    以下の出力が表示されます:[38281.439946]word_count_init_success [38427.487553] word_count_exit_sucess
    サンプル分析
  • Linuxカーネルはどのようにモジュールがロードされましたか?Linuxモジュールは動的にロードできることを知っています.上記のinsmodコマンドとrmmodコマンドはこのことをしています.
  • モジュールはLinuxカーネルのどのインタフェースを使用できますか?Linuxモジュール自体がカーネル空間にロードされて動作し,カーネルコードの一部と見なすことができる.
  • モジュールはどのようなインタフェースを実現しますか?コードにもう1つのマクロmodule_init、このマクロは私たちのモジュールの初期化関数word_を指定しました.count_init.word_でcount_initでmisc_を呼び出すregister呼び出しmisc_deregisterはmiscデバイスを登録した.この中には多くの細部が含まれているので、先に置いておきましょう.後で分析します.