• insmod 和第一个驱动


    一, Linux insmod加载过程

    Linux内核支持动态的加载模块运行:比如insmod first_drv.ko,这样就可以将模块加载到内核所在空间供应用程序调用。现在简单描述下insmod first_drv.ko的过程

    1、insmod也是一个用户进程

    2、insmod进程从命令行中读取要链接的模块名字:first_drv.ko

    3、insmod进程确定模块对象代码所在的文件在系统目录树中的位置,即first_drv.ko文件所在的位置

    4、insmod进程从文件系统所在的存储区读入存有模块目标代码的文件

    5、insmod调用init_module系统调用。函数将进入内核到达内核函数 sys_init_module,然后sys_init_module函数将模块二进制文件复制到内核,然后由内核完成剩余的任务。

    二,Linux驱动之建立一个hello模块

    目标:在开发板上执行insmod hello.ko能在控制台打印出hello init;接着执行rmmod会在控制台打印出hello exit

    建立一个hello模块的步骤如下:

    1、建立一个hello.c文件,敲入一下代码

    复制代码
    #include <linux/module.h>
    #include <linux/init.h>
    
    int major;
    static int first_drv_init(void)
    {
        printk("hello init
    ");
    
        return 0;
    }
    
    static void first_drv_exit(void)
    {
        printk("hello exit
    ");
    }
    
    module_init(first_drv_init);//在insmod后会将first_drv_init调用
    module_exit(first_drv_exit); //在rmmod后会将first_drv_exit调用
    
    MODULE_LICENSE("GPL");//GPL协议
    复制代码

    2、建立一个Makefile,填入如下代码,其中KERN_DIR为需要装载模块的内核源码路径,此源码路径必须成功编译过内核并且在开发板上跑起来。 

    复制代码
    KERN_DIR = /work/system/linux-2.6.22.6
    
    all:
            make -C $(KERN_DIR) M=`pwd` modules //M='pwd'表示当前目录。这句话的意思是利用内核目录下的Makefile规则来编译当前目录下的模块
    
    clean:
            make -C $(KERN_DIR) M=`pwd` modules clean
            rm -rf modules.order
    
    obj-m   +=hello.o//调用内核目录下Makefile编译时需要用到这个参数
    复制代码

    3、执行Make后,在目录下会产生hello.ko文件

    4、将hello.ko文件拷贝到开发板的文件系统上。执行insmod可以看到有hello init输出,在执行rmmod可以看到有hello exit输出。

    5、第一个模块建立成功

  • 相关阅读:
    「NOIP2011」聪明的质监员
    「CF5E」Bindian Signalizing
    「NOIP2017」列队
    「NOIP2016」愤怒的小鸟
    「牛客CSP-S2019赛前集训营2」服务器需求
    「牛客CSP-S2019赛前集训营1」仓鼠的石子游戏
    「SCOI2010」幸运数字
    函数求值一<找规律>
    梯形
    F(k)<(维护+枚举)(找规律+递推+枚举)>
  • 原文地址:https://www.cnblogs.com/shelley-AL/p/10808575.html
Copyright © 2020-2023  润新知