可加载模块和内置(静态链接)模块有什么区别?
我在寻找系统调用
subsys_initcall()
和module_init()
之间差异的答案时遇到了这个问题
Linux 内核支持通过两种方式插入模块(也称为设备驱动程序):
insmod driver.ko
或 modprobe driver.ko
可加载模块相对于内置模块的优势是您可以在运行时加载卸载它们。如果您正在开发一个模块并且需要测试它,那么这很好。每次测试它并且需要对其进行更改时,您可以轻松卸载它(rmmod driver.ko
或
modprobe -r driver.ko
),然后在进行更改后,可以将其插入回来。但对于内置模块,如果您需要对模块进行任何更改,那么您需要编译整个内核,然后使用新的内核映像重新启动系统。
配置:
您可以通过编辑内核源代码根文件夹中的 .config
文件将模块配置为这两个模块中的任何一个:
DRIVER_1=y // y indicate a builtin module
DRIVER_1=m //m inicates a loadable module
注意:
lsmod
仅显示
dynamically loaded modules
,不显示
built-in
。
1.可加载内核模块(LKM):
.ko
文件,可以根据需要从内核动态加载和卸载,无需重新启动系统。
insmod
和
rmmod
等 Linux 命令进行管理。
kernel-space 的一部分,并直接与基础内核交互。当模块被加载时,它们就成为内核本身的一部分。
另外,从Linux内核开始,就没有Module这个东西了,从Linux内核1.0版本开始就提供了这个功能
2.内置内核模块(BKM): +-------------------------------+
| Linux kernel |
+-------------------------------+
| Built-in modules |
+-------------------------------+
|
|
+-----------------------+
| Loadable modules | <-- Load/Unload Dynamically
+-----------------------+
内核模块的用例