Linux Loadable 和内置模块之间的区别

问题描述 投票:0回答:2

可加载模块和内置(静态链接)模块有什么区别?

我在寻找系统调用

subsys_initcall()
module_init()

之间差异的答案时遇到了这个问题
linux module linux-kernel
2个回答
26
投票

Linux 内核支持通过两种方式插入模块(也称为设备驱动程序):

  1. 内置内核模块 - 当内核启动时,内核会自动将此驱动程序插入到内核中(更像是它已经是内核代码的一部分)。
  2. 可加载内核模块(LKM) - 不会由内核自动加载的驱动程序,用户可以在运行时通过
    insmod driver.ko
    modprobe driver.ko
  3. 插入此模块

可加载模块相对于内置模块的优势是您可以在运行时加载卸载它们。如果您正在开发一个模块并且需要测试它,那么这很好。每次测试它并且需要对其进行更改时,您可以轻松卸载它(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

继续阅读: http://www.tldp.org/HOWTO/Module-HOWTO/x73.html


0
投票
以下是它们在 Linux 内核中集成和管理方式的主要区别:

1.可加载内核模块(LKM):

    可加载模块是单独的
  • .ko
     文件,可以根据需要从内核动态加载和卸载,
    无需重新启动系统
  • 这些模块使用
  • insmod
    rmmod
     等 Linux 命令进行管理。
  • 它们对于并不总是需要的功能或驱动程序很有用,从而在不使用时节省内存。
  • 由于这些模块是为
  • 内核空间开发的,因此它们可以用于所有类型的PC、智能手机和嵌入式设备。
请注意,LKM 模块是

kernel-space 的一部分,并直接与基础内核交互。当模块被加载时,它们就成为内核本身的一部分。

另外,从Linux内核开始,就没有Module这个东西了,从Linux内核1.0版本开始就提供了这个功能

2.内置内核模块(BKM):

    内置模块直接编译到
  • 内核二进制文件中并在启动时加载。
  • 这些无法卸载,并且始终保留为正在运行的内核的一部分(在内存中)。
  • 非常适合系统操作始终需要的基本功能,因为它们避免了动态加载的开销。

+-------------------------------+ | Linux kernel | +-------------------------------+ | Built-in modules | +-------------------------------+ | | +-----------------------+ | Loadable modules | <-- Load/Unload Dynamically +-----------------------+
内核模块的用例

    硬件驱动
  • 文件系统驱动程序
  • 系统调用
  • 网络协议驱动
  • TTY 端口驱动程序
  • 以及需要在内核空间中开发的特殊应用程序。
内置内核模块(BKM)的缺点

    每次重新开发或调试模块时,都必须重新编译并安装整个内核。
  • 识别依赖资源的错误非常困难。
  • 模块的一个小bug导致系统启动过程中启动停止;而且很难追踪 bug。
© www.soinside.com 2019 - 2024. All rights reserved.