0、前言:

  • 一篇以问题为导向,的技能贴!就是这
  • 探究linux内核中的 内核模块 如何编译生成;

基础概念库:

1、linux内核源码:

  • Linux 内核的源代码集合。解压后会生成一个名为 linux-4.14.21 的目录,里面包含了 Linux 内核 4.14.21 版本的所有源代码文件:就是tar -zxvf linux-4.14.21.tar.gz 解压的是 Linux 内核的源码包,它不是一个完整的 Linux 系统,而

    • 内核核心代码(如 kernel/、fs/、net/ 目录);
    • 硬件驱动代码(如 drivers/ 目录);
    • 编译配置文件(如 Makefile、.config 模板);文档和工具脚本等。这些文件的作用是供开发者编译、定制或研究 Linux 内核。
  • 一个完整的 Linux 系统得具备:

    • 内核:即你解压的 linux-4.14.21 编译后的可执行程序(如 vmlinuz);
    • 用户态组件:包括 Shell(如 bash)、系统工具(如 ls、cd)、库文件(如 libc)、应用程序等;
    • 文件系统:包含系统配置、用户数据、启动脚本等。
  • linux-4.14.21.tar.gz 仅献出了内核的源代码,需要经过编译、配置后,才能生成可运行的内核。

2、在内核文件编译前,设置make menuconfig 后出现的三种内核文件编译选择模式的解释:

  • make menuconfig 中这三种选择对应内核组件的不同编译和加载方式,核心逻辑就是“按需决定组件是否编译、以及如何集成到系统中”。

  • 三种选择的具体含义:

  1. 选 M (Module,模块模式)

    • 编译结果:生成独立的 .ko 模块文件(如 hello.ko ),不直接打包进内核镜像。
    • 加载时机:系统启动后,借助 insmod / modprobe 手动加载,不需时用 rmmod 卸载,实现“动态按需加载”。​
    • 适用场景:硬件驱动(如USB、网卡驱动)、测试组件等,避免内核镜像过大。
  2. 选 * (Built-in,内置模式)

    • 编译结果:组件代码直接编译进内核镜像(如 vmlinuz ),成为内核的一部分。
    • 加载时机:系统启动时随内核一起加载,无需手动操作,重启后仍生效。
    • 适用场景:内核核心功能(如进程管理、内存管理)