首页 > 技术文章 > Linux内核驱动模块编写尝试

Arno-vc 2021-01-17 10:02 原文

课堂笔记

  1. 源代码

    /*file: hello.c*/
    
    #ifndef _KERNEL_
    #define _KERNEL_
    #endif
    #ifndef MODULE
    #define MODULE
    #endif
    
    #include <linux/module.h>
    #include <linux/kernel.h>
    #include <linux/init.h>
    
    static hello_init(void);  //需要添加额外的函数申明
    void hello_exit(void);
    
    //_init and _exit is the special macro
    static int hello_init(void){  //去掉了函数名前的_init
    
    printk("Hello, world!\n");
    return 0;
    }
    
    void hello_exit(void){  //去掉了函数名前的_exit,否则编译无法完成
    printk("Good bye, world!\n");
    return 0;
    }
    
    module_init(hello_init);
    module_exit(hello_exit);
    
    MODULE_LICENSE("GPL");  // 开源协议许可
    

    注:

    • printk与printf类似,但是是运行在内核态,打印的日志文件在/var/log/messages
  2. 编写Makefile文件并运行

    obj-m += hello.o
    
    all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
    
    clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
    

    注:

    • 必须用该操作编译,否则会出现找不到asm/linkage.h的错误

    • 如果/lib/modules/3.10.0-514.26.2.el7.x86_64目录下的build文件为红色,则执行以下操作

    rm -f build  #删除build文件
    ln -s /usr/src/kernels/3.10.0-1160.11.1.el7.x86_64/ ./build  #新建build文件并建立软链接
    

    image-20210117094217819

    make构建的文件

    image-20210117094548598

  3. 尝试添加和移除模块

    insmod hello.ko
    rmmod hello.ko
    

    如果执行成功,可以在/var/log/messages下查看是否有对应的日志打印

    image-20210117094902061

    注:

    • printk与printf类似,但是是运行在内核态,打印的日志文件在/var/log/messages
  4. 编写Makefile文件并运行

    obj-m += hello.o
    
    all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
    
    clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
    

    注:

    • 必须用该操作编译,否则会出现找不到asm/linkage.h的错误

    • 如果/lib/modules/3.10.0-514.26.2.el7.x86_64目录下的build文件为红色,则执行以下操作

        rm -f build  #删除build文件
        ln -s /usr/src/kernels/3.10.0-1160.11.1.el7.x86_64/ ./build  #新建build文件并建立软链接
      

      image-20210117094217819

    make构建的文件

    image-20210117094548598

  5. 尝试添加和移除模块

    insmod hello.ko
    rmmod hello.ko
    

    如果执行成功,可以在/var/log/messages下查看是否有对应的日志打印

    image-20210117094902061

推荐阅读