• 【嵌入式Linux内核驱动】内核模块三要素与验证测试


    内核模块

    Linux内核模块是一种可以动态加载和卸载的软件组件,用于扩展Linux操作系统的功能。Linux内核本身只包含了必要的核心功能,而内核模块则允许开发者在运行时向内核添加新的功能、驱动程序或文件系统支持,而无需重新编译整个内核或重新启动系统。

    内核模块是一段独立的代码,可以被编译为共享目标文件,并且遵循Linux内核的特定接口和标准。它们可以通过加载器(如insmod或modprobe)动态地插入到内核中,并通过卸载器(如rmmod)从内核中移除。一旦加载到内核中,模块可以访问和修改内核的数据结构、函数和服务,以提供额外的功能或驱动支持。

    内核模块在许多方面都非常有用。它们使得开发者可以通过加载适当的模块来添加硬件设备的支持,如网卡、声卡等。此外,内核模块还可以添加新的文件系统支持,以便访问特定的文件系统类型。开发者还可以使用内核模块扩展内核的功能,添加新的系统调用、网络协议或安全功能等。

    使用内核模块的好处是可以减小内核的大小,并允许系统仅加载需要的模块,从而提高系统的性能和灵活性。内核模块也可以动态加载和卸载,使得系统可以根据需要动态地添加或删除功能,而无需重新启动。

    NFS挂载

    bootargs启动参数设置

    • root=/dev/nfs #指定rootfs所在的设备是NFS,也就是从NFS启动

    • nfsroot=192.168.9.119:/nfs/rootfs #指定nfs rootfs的位置 (是在ip 是192.168.9.119的机器上 的/nfs/rootfs目录下).

      ​ 注意/nfs/rootfs必须和前面NFS服务配置文件设置一致(见环境安装)

    • v3 #ubuntu 20.04,nfs版本的问题需在bootargs 里加v3

    • console=ttyS0,115200 #指定内核启动后串口信息从串口0输出,波特率115200

    • init=/linuxrc #指定第一个应用程序

    • ip=192.168.9.9 #需设置为板子u-boot自己的IP(通过pri ipaddr查看)


    • ext4load mmc 1:1 0x84000000 /boot/Image //读ext 文件系统中的 /boot/Image 到内存 0x84000000

      ​ //这个镜像是烧录在TF卡上的官方镜像

      ​ //fstype mmc 1:1 //查看emmc设备(flash) 1号设备的1号分区

    • ext4load mmc 1:1 83100000 /boot/tegra210-p3448-0002-p3449-0000-b00.dtb //和上面一个道理

    • booti 0x84000000 - 83100000 /*启动Image格式的内核 booti,

      引导ARM64 kernel image----Image; bootz,

      引导ARM kernel image----zImage; bootm,

      引导u-boot自定义的kernel image----uImage。

    # setenv bootargs  root=/dev/nfs rw nfsroot=192.168.9.119:/nfs/rootfs,v3 console=ttyS0,115200 init=/linuxrc ip=192.168.9.9
    # setenv nfsboot ext4load mmc 1:1 0x84000000 /boot/Image \; ext4load mmc 1:1 83100000 /boot/tegra210-p3448-0002-p3449-0000-b00.dtb \; booti 0x84000000 - 83100000
    # pri bootcmd /*备份原来的,方便恢复
       bootcmd=run distro_bootcmd
        */
    # set bootcmd run nfsboot  
    # saveenv
    # run nfsboot  //能nfs挂载成功	
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    内核三要素

    • module_init(led_init); //模块加载入口声明
    • module_exit(led_exit); //模块卸载入口声明
    • MODULE_LICENSE(“GPL”); //模块免费开源声明
    //led.c
    #include 
    #include 
    
    static int led_init(void)
    {
        printk("led init yhai 1\n");
        return 0;
    }
    
    static void led_exit(void)
    {
        printk("led exit\n");
    }
    
    module_init(led_init); //模块加载入口声明
    module_exit(led_exit); //模块卸载入口声明
    MODULE_LICENSE("GPL"); //模块免费开源声明
    MODULE_AUTHOR("bbcen"); //模块作者声明(可选)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    Makefile

    • KERNELDIR ?= ~/linux 第二行这里的目录要选一个已经编译过的内核目录
    • obj-m := led.o 这里的.o文件名要和.c的文件名一样
    //Makefile
    ifeq ($(KERNELRELEASE),)
    KERNELDIR ?= ~/linux 
    PWD := $(shell pwd)
    
    all:
    	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
    
    clean:
    	rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules* a.out 
    
    else
        obj-m := led.o
    endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    验证测试

    SourceInsight编辑代码,cp到nfs目录编译生成ko文件插入内核

    • make的时候不要在共享文件夹,会报错,可以直接复制到nfs共享目录下编译
    $ make              //编译生成 模块文件 led.ko
    $ file led.ko       //查看一下格式,看编译的是 电脑的, 还是板子的(ARM)
    
    # insmod led.ko     /*加载模块 
    提示: loading out-of-tree module taints kernel    -> 提示内核污染,出问题时你自己驱动的问题,不是内核的问题。方便内核开放者排查 
    可添加   MODULE_INFO(intree, "Y"); 去除提示,但最好别这样做                
                         */
    # lsmod  /*查看已加载模块列表 -> 检测是否已加载
    		等效于 cat /proc/modules
         */
    # rmmod  led         //卸载模块     
      
    # dmesg      //查看内核日志
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  • 相关阅读:
    gitlab创建一个项目的流程
    极智编程 | 谈谈 C++ 中容器 map 和 unordered_map 的区别
    MapReduce项目案例1
    redis存储原理与数据模型笔记
    ASP.NET Core 3 高级编程(第8版) 学习笔记 03
    TFTP协议解析及C/C++代码实现
    数据结构与算法之顺序表经典题目《合并两个有序数组》《合并两个有序链表》
    java基于springboot的毕业生简历模板分享管理系统
    拓扑排序(C++)
    如何快速找到华为手机中下载的文档
  • 原文地址:https://blog.csdn.net/Ybc_csdn/article/details/130904499