linux 内核功能编译为模块

在内核配置过程中,make menuconfig 工具提供了一个用户友好的图形化界面,用于选择和配置内核功能。配置选项中的 <M> 意味着将该功能作为模块(module)来编译。

内核配置选项解释

make menuconfig 中,有三种主要的选项来配置内核功能:

  1. [ ] excluded:表示功能被排除在内核之外,即不会被编译和包含。
  2. [*] built-in:表示功能被直接编译进内核,成为内核的一部分。这些功能在内核启动时就可用,无法动态加载或卸载。
  3. module:表示功能被编译成模块。这些模块在需要时可以动态加载到内核中,并在不需要时卸载。这种方式提供了更大的灵活性,因为可以在运行时添加或移除功能,而无需重新编译和重启内核。

使用模块的优点

选择 <M> 将功能编译成模块有以下几个优点:

  1. 灵活性:模块可以在内核运行时动态加载或卸载。这样可以根据需要添加或移除功能,而无需重新启动系统。
  2. 节省内存:未加载的模块不会占用内核内存。只有在需要时才加载模块,可以节省系统资源。
  3. 易于维护:模块化的功能更易于维护和更新。可以单独更新某个模块而不影响整个内核。

示例

假设你在 make menuconfig 中配置了一个网络驱动,如 Realtek RTL8139 驱动程序:

  • 选择 [*]:该驱动程序将被编译进内核,在内核启动时就会加载和初始化。
  • 选择 [ ]:该驱动程序将不会被编译或包含在内核中。
  • 选择 <M>:该驱动程序将被编译成一个模块,可以在需要时通过 modprobe 命令加载,或通过 rmmod 命令卸载。

加载和卸载模块

使用模块时,可以通过以下命令进行加载和卸载:

  • 加载模块

    sudo modprobe <module_name>
    
  • 卸载模块

    sudo rmmod <module_name>
    

例如,如果你编译了 Realtek RTL8139 驱动程序为模块 8139too,可以使用以下命令加载或卸载该模块:

  • 加载模块:

    sudo modprobe 8139too
    
  • 卸载模块:

    sudo rmmod 8139too
    

总结

make menuconfig 中选择 <M> 意味着将该功能编译成模块,这为内核提供了更大的灵活性和可维护性。模块可以在运行时动态加载和卸载,允许用户根据需要启用或禁用功能,而无需重新编译和重启内核。

posted @ 2024-07-20 16:41  立体风  阅读(130)  评论(0)    收藏  举报