共计 1602 个字符,预计需要花费 5 分钟才能阅读完成。
这篇文章给大家分享的是有关 linux 模块指的是什么意思的内容。丸趣 TV 小编觉得挺实用的,因此分享给大家做个参考,一起跟随丸趣 TV 小编过来看看吧。
在 linux 中,模块是一种能够向 linux 内核添加设备驱动程序、文件系统以及其他组件的方法,是一些可以作为独立程序来编译的函数和数据类型的集合,可以通过静态或动态的方法加载到内核空间。
本教程操作环境:linux7.3 系统、Dell G3 电脑。
linux 模块是什么意思
模块是一种能够向 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
make -C $(KERNELBUILD) M=$(shell pwd) modules
clean:
make -C $(KERNELBUILD) M=$(shell pwd) clean
感谢各位的阅读!关于“linux 模块指的是什么意思”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!