在linux中,模块是一种能够向linux内核添加设备驱动程序、文件系统以及其他组件的方法,是一些可以作为独立程序来编译的函数和数据类型的集合,可以通过静态或动态的方法加载到内核空间。
本教程操作环境:linux7.3系统、Dell G3电脑。
模块是一种能够向Linux内核添加设备驱动程序、文件系统及其他组件的方法,它不需要重新编译内核或者重启系统。对于内核来讲,它需要处理的就是模块的装载和卸载以及模块间的依赖关系。因为模块是在内核空间运行的,因此模块必须使用内核提供的函数,我们也可以使用模块来调用相应的内核函数,这属于内核态编程的一种方式。模块文件的本质是一种可重定位的二进制文件,一般以*.ko的形式出现。
Linux模块可以通过静态或动态的方法加载到内核空间,静态加载是指在内核启动过程中加载;动态加载是指在内核运行的过程中随时加载。一个模块被加载到内核中时,就成为内核代码的一部分。模块加载入系统时,系统修改内核中的符号表,将新加载的模块提供的资源和符号添加到内核符号表中,以便模块间的通信。
模块的组成
Linux内核模块主要由以下几个部分组成:
模块加载函数(必须):当通过insmod命令加载内核模块时,模块的加载函数会自动被内核执行,完成本模块相关初始化工作;
模块卸载函数(必须):当通过rmmod命令卸载模块时,模块的卸载函数会自动被内核执行,完成与模块加载函数相反的功能;
模块许可证声明(必须):模块许可证(LICENSE)声明描述内核模块的许可权限,如果不声明LICENSE,模块被加载时将收到内核被污染的警告。
模块参数(可选):模块参数是模块被加载的时候可以被传递给他的值,它本身对应模块内部的全局变量;
模块导出符号(可选):内核模块可以导出符号(symbol,对应于函数或变量),这样其他模块可以使用本模块中的变量或函数;
模块作者等信息声明(可选)。
一个模块的示例:
//内核头文件 #include<linux/module.h> #include<linux/kernel.h> #include<linux/init.h> //加载函数 static int __init init_hello_module(void){ //内核打印函数,linux系统使用dmesg命令可以查看打印信息 printk(KERN_INFO "Hello World\n"); return 0; } //卸载函数 static void __exit exit_hello_module(void){ printk(KERN_INFO "Exit the Hello world Module!\n"); } module_init(init_hello_module); module_exit(exit_hello_module); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Eric"); MODULE_VERSION("v0.1"); MODULE_DESCRIPTION("TEST FOR MODULE");
模块对应的Makefile文件:
#Makefile obj-m:=hello.o KERNELBUILD:=/lib/modules/$(shell uname -r)/build all: make -C $(KERNELBUILD) M=$(shell pwd) modules clean: make -C $(KERNELBUILD) M=$(shell pwd) clean
相关推荐:《Linux视频教程》
以上是linux模块是什么意思的详细内容。更多信息请关注PHP中文网其他相关文章!