文章目录
前言
软硬件环境
硬件:PC
软件:Ubuntu 18.04
Linux 内核是宏内核, 和QNX等微内核相比,它的整体结构非常庞大,包含的组件非常多,如果我们将所有的功能都编译进Linux 内核中,那么Linux 内核镜像将会很大,也将使kernel 的加载时间变长,影响整个系统的启动速度,并且也不能对内核进行动态的新增和删除某些功能,为了实现在内核中动态的新增和删除某些功能,模块(Module)这一机制就诞生了。
一、内核模块的主要组成部分
1. 头文件
内核模块主要依赖如下两个头文件:
2. 模块加载函数
当通过insmod 或 modprobe命令加载内核模块的时候,模块的加载函数会自动被内核调用,完成本模块的相关初始化操作。并且通过作为**module_init()**的参数,注册进内核。
3. 模块卸载函数
当通过rmmod 命令卸载某个模块时, 模块的卸载函数会被内核自动的调用,完成和模块加载函数相关的功能,如资源的释放等;并且通过作为**module_exit()**的参数,注册进内核。
4. 模块许可证声明
许可证(LICENSE)声明描述内核模块的许可权限, 如果不声明LICENSE,模块被加载时,会收到内核被污染(kernel tainted)的警告。
内核模块可接受的LICENSE 主要包括“GPL”, "GPL v2"等
5. 可选部分
模块参数:模块参数时模块被加载的时候可以被传递给它的值,它本身对应模块内部的全局变量。
模块导出符号:内核模块可以导出符号(symbol, 对应于函数或变量),这样其他的模块可以使用本模块中的变量或函数。
模块作者:用来表白该模块的作者是谁,例如 MODULE_AUTHOR(“khl”)
模块描述:用来描述该模块的作用,例如MODULE_DESCRIPTION(“hdmi encoder driver”)
其他:略
二、最简内核模块实例
1. 内核模块代码
#include <linux/init.h>
#include <linux/module.h><