【Linux】驱动_1_hello驱动

1. 代码框架分析

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

  • module_init 模块加载函数 (必须): 当通过 insmod 或 modprobe 命令加载内核模块时,模块的加载函数
    就会自动被内核执行,完成本模块相关的初始化工作。
  • module_exit 模块卸载函数 (必须): 当执行 rmmod 命令卸载模块时,模块卸载函数就会自动被内核自动
    执行,完成相关清理工作。
  • MODULE_LICENSE(“GPL2”); 模块许可证声明 (必须): 许可证声明描述内核模块的许可权限,如果模块不声明,模块被加载时,将会有内核被污染的警告。
  • 模块参数: 模块参数是模块被加载时,可以传值给模块中的参数。
  • 模块导出符号: 模块可以导出准备好的变量或函数作为符号,以便其他内核模块调用。
  • 模块的其他相关信息: 可以声明模块作者等信息。
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>

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.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
    

    以上代码**__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);
    

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

相关推荐

  1. Linux驱动_1_hello驱动

    2024-04-23 13:02:06       14 阅读
  2. Linux学习笔记9-Linux驱动1

    2024-04-23 13:02:06       37 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-23 13:02:06       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-23 13:02:06       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-23 13:02:06       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-23 13:02:06       20 阅读

热门阅读

  1. FineReport报表问题- SET LOGSIZE FAILED 解决

    2024-04-23 13:02:06       14 阅读
  2. 通讯协议---USB枚举过程

    2024-04-23 13:02:06       11 阅读
  3. 页面跳转的几种方式

    2024-04-23 13:02:06       16 阅读
  4. 主流微前端框架对比与选择策略

    2024-04-23 13:02:06       17 阅读
  5. Stable Diffusion Web UI Windows部署及坑

    2024-04-23 13:02:06       13 阅读
  6. 密码学 | 多重签名:基本概念

    2024-04-23 13:02:06       12 阅读
  7. SQL server详细使用教程

    2024-04-23 13:02:06       15 阅读
  8. 数据结构——6.4 图的应用

    2024-04-23 13:02:06       17 阅读