Skip to content

Linux内核编译的Makefile分析

这个Makefile是Linux内核(版本4.19.232)的顶层Makefile,用于构建Linux内核。以下是其主要功能和编译内容的分析:

此 Makefile 的位于: ./kernel/Makefile

一. 主要功能

  1. 版本控制

    • 定义了内核版本信息(VERSION=4, PATCHLEVEL=19, SUBLEVEL=232)
    • 生成版本相关的头文件(include/generated/uapi/linux/version.h等)
  2. 构建系统设置

    • 设置各种编译标志和选项(KBUILD_CFLAGS, KBUILD_AFLAGS等)
    • 定义交叉编译工具链(CC, LD, OBJCOPY等)
    • 处理输出目录(KBUILD_OUTPUT)
  3. 主要构建目标

    • vmlinux:最终的内核ELF文件
    • modules:所有可加载模块
    • bzImage/zImage:压缩的内核镜像(x86架构)
    • dtbs:设备树二进制文件(ARM等架构)
  4. 目录结构构建

    • 通过变量定义了要构建的核心目录:
      makefile
      core-y		+= kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/
    • 其他重要目录包括:
      • arch/$(SRCARCH)/:架构特定代码
      • drivers/:设备驱动
      • net/:网络协议栈
      • lib/:内核库
  5. 配置系统

    • 支持Kconfig配置系统
    • 处理.config文件和自动生成的配置头文件
  6. 模块支持

    • 支持构建内核模块(CONFIG_MODULES)
    • 模块安装目标(modules_install)
  7. 清理目标

    • clean:删除大多数生成的文件
    • mrproper:删除所有生成的文件和配置
    • distclean:彻底清理

二. 主要编译的目录和内容

这个Makefile会编译以下主要目录的内容:

  1. 核心目录

    • kernel/:核心内核代码(调度、信号处理等)
    • mm/:内存管理
    • fs/:文件系统
    • ipc/:进程间通信
    • security/:安全模块
    • crypto/:加密算法
    • block/:块设备层
  2. 架构相关代码

    • arch/$(SRCARCH)/:特定架构的代码
      • x86, arm, arm64等架构的实现
      • 引导代码、特定架构的内存管理等
  3. 驱动目录

    • drivers/:所有设备驱动
      • char/:字符设备
      • block/:块设备
      • net/:网络设备
      • input/:输入设备
      • 等等...
  4. 子系统

    • net/:网络协议栈(TCP/IP等)
    • lib/:内核通用库
  5. 模块支持

    • 当CONFIG_MODULES=y时,会编译所有标记为=m的内核模块
  6. 工具和脚本

    • scripts/:构建过程中使用的各种脚本
    • tools/:各种内核工具
  7. 文档

    • Documentation/:内核文档(不会直接编译,但可能有相关目标)

三. 编译流程

  1. 配置阶段

    • 通过make menuconfig等生成.config文件
  2. 准备阶段

    • 生成版本信息
    • 准备编译环境
  3. 核心构建

    • 编译所有=y的内核对象
    • 链接生成vmlinux
  4. 模块构建(如果启用):

    • 编译所有=m的模块
    • 处理模块依赖关系
  5. 最终镜像

    • 生成特定架构的启动镜像(如bzImage)

四. 特殊功能

  1. 静态分析

    • 支持sparse静态分析工具
    • 可通过make C=1make C=2启用
  2. 调试支持

    • 支持各种调试选项(CONFIG_DEBUG_*)
    • 生成调试信息(-g)
  3. 优化选项

    • 支持不同优化级别(-Os, -O2)
    • 链接时优化(LTO)
  4. 安全特性

    • 栈保护(-fstack-protector)
    • KASAN(内核地址消毒剂)

这个Makefile非常复杂,因为它需要支持多种架构、配置选项和构建场景。它使用递归make的方式在各个子目录中构建目标,最终将所有部分链接成完整的内核镜像。