• 【Linux】驱动_1_hello驱动


    1. 代码框架分析

    Linux内核模块的代码框架通常由下面几个部分组成:

    • module_init 模块加载函数 (必须): 当通过 insmod 或 modprobe 命令加载内核模块时,模块的加载函数
      就会自动被内核执行,完成本模块相关的初始化工作。
    • module_exit 模块卸载函数 (必须): 当执行 rmmod 命令卸载模块时,模块卸载函数就会自动被内核自动
      执行,完成相关清理工作。
    • MODULE_LICENSE(“GPL2”); 模块许可证声明 (必须): 许可证声明描述内核模块的许可权限,如果模块不声明,模块被加载时,将会有内核被污染的警告。
    • 模块参数: 模块参数是模块被加载时,可以传值给模块中的参数。
    • 模块导出符号: 模块可以导出准备好的变量或函数作为符号,以便其他内核模块调用。
    • 模块的其他相关信息: 可以声明模块作者等信息。
    #include 
    #include 
    #include 
    
    static int __init hello_init(void)
    {
    	printk(KERN_EMERG "[ KERN_EMERG ] Hello Module Init\n");
    	printk( "[ default ] Hello Module Init\n");
    	return 0;
    }
    
    
    static void __exit hello_exit(void)
    {
    	printk("[ default ] Hello Module Exit\n");
    }
    
    module_init(hello_init);
    module_exit(hello_exit);
    
    MODULE_LICENSE("GPL2");
    MODULE_AUTHOR("Ye");
    MODULE_DESCRIPTION("hello module");
    MODULE_ALIAS("test_module");
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    1.1 模块加载/卸载函数

    1. __init __initdata 宏 定 义

      #define __init		__section(.init.text)
      #define __initdata	__section(.init.data)
      #define __exitdata	__section(.exit.data)
      #define __exit __section(.exit.text) __exitused __cold notrace
      
      • 1
      • 2
      • 3
      • 4

      以上代码**__init __initdata宏定义(位于内核源码/linux/init.h)中的__init 用于修饰函数, __initdata用于修饰变量。带有init的修饰符,表示将该函数放到可执行文件的__init节区中,该节区的
      内容只能用于模块的初始化阶段,初始化阶段执行完毕之后,这部分的内容就会被释放掉。 __exit用于修饰函数,
      __exitdata**用于修饰变量
      告诉内核,当卸载模块时,需要调用哪个函数。

    2. module_init / module_exit

      #define module_init(x) __initcall(x);
      #define module_exit(x) __exitcall(x);
      
      • 1
      • 2

      宏定义 module_init 用于通知内核初始化模块的时候,要使用哪个函数进行初始化。它会将函数地址加入到相应的节区 section 中,这样的话,开机的时候就可以自动加载模块了。 内核模块卸载函数 module_init 主要是用于释放初始化阶段分配的内存,分配的设备号等,是初始化过程的逆过程。

  • 相关阅读:
    [附源码]计算机毕业设计基于SpringBoot的在线作业批改系统
    关于3位数字加上不同范围的随机数之后对大小正确率的影响
    【通过】华为OD机试真题70:加扰字符串
    如何创建自己的Spring Boot Starter并为其编写单元测试
    资深架构师必备知识:Netty+MySQL+并发+JVM+多线程
    非一线工程管理者的一对一沟通
    使用Xshell远程访问工具连接到Linux
    2022年中南大学夏令营面试经验
    java 编译 引用 jar 包进行编译和执行编译后的class文件
    网页制作基础大二dw作业HTML+CSS+JavaScript云南我的家乡旅游景点
  • 原文地址:https://blog.csdn.net/easy_Ye/article/details/138113089