3. 内核源码获取与配置:从 kernel.org 下载主线内核、使用 git clone 获取 LTS 内核、解压与配置内核(make menuconfig)

在搭建 DRM/KMS 显示驱动开发环境时,获取正确版本的内核源码是第一道工序。本章将系统讲解三种主流的内核源码获取方式,以及使用 make menuconfig 进行内核配置的完整流程。选择哪种方式取决于你的开发场景:主线内核用于尝鲜最新特性,LTS 内核用于稳定产品开发,而发行版内核则适合快速验证。

💡 开发建议: 对于 DRM/KMS 驱动开发,推荐使用 LTS 内核(如 6.6.x 或 6.12.x)作为基线,因为主线内核 API 变动频繁,可能导致驱动代码需要频繁适配。

3.1 内核源码获取方式对比

下表列出了三种主流获取方式的适用场景、版本特性及网络要求,帮助你快速决策:

获取方式 版本类型 适用场景 网络要求 磁盘占用
kernel.org 下载 主线(Mainline) 尝鲜最新特性、提交补丁前验证 HTTP 下载,支持断点续传 ~1.5 GB(压缩包)
git clone LTS LTS(长期支持) 产品级驱动开发、稳定基线 Git 协议,需完整克隆历史 ~4.5 GB(含 .git 目录)
发行版源码包 发行版定制 快速适配现有系统、验证驱动 apt/yum 等包管理器 ~1.2 GB(含补丁)
🔑 关键指标: LTS 内核每 2-3 年发布一次,维护周期长达 6 年;主线内核每 2-3 个月发布一个新版本。DRM 子系统的核心 API 在 LTS 版本间保持稳定,这是选择 LTS 作为开发基线的根本原因。

3.2 从 kernel.org 下载主线内核

kernel.org 是 Linux 内核的官方发布站点,提供所有主线版本的 tar.xz 压缩包。以下是标准下载与校验流程:

  1. 访问官网: 打开 https://www.kernel.org,页面顶部会显示最新的主线版本(如 6.13-rc7)和最新的稳定版本。
  2. 选择版本: 点击 "tarball" 链接下载完整源码包,或点击 "ChangeLog" 查看版本变更。
  3. 下载压缩包: 使用 wget 或 curl 下载,推荐同时下载对应的 .sign 签名文件用于校验。
  4. 校验完整性: 使用 GPG 验证签名,确保源码未被篡改。
# 下载主线内核 6.13-rc7 示例
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.13-rc7.tar.xz
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.13-rc7.tar.sign

# 导入内核维护者公钥(首次需要)
gpg --locate-keys torvalds@kernel.org gregkh@kernel.org

# 验证签名
xz -cd linux-6.13-rc7.tar.xz | gpg --verify linux-6.13-rc7.tar.sign -

# 解压源码
tar -xf linux-6.13-rc7.tar.xz
cd linux-6.13-rc7
⚠️ 安全警告: 永远不要跳过签名验证步骤。2021 年曾发生过内核镜像被投毒的事件,GPG 校验是防止供应链攻击的第一道防线。如果验证失败,请立即删除下载文件并从官方镜像重新获取。

3.3 使用 git clone 获取 LTS 内核

Git 方式适合需要跟踪补丁历史、进行版本回溯或参与社区开发的场景。LTS 内核的 Git 仓库由 Greg Kroah-Hartman 维护,包含所有稳定版本的完整提交历史。

# 克隆 LTS 内核仓库(以 6.12.y 为例)
git clone --depth=1 --branch linux-6.12.y \
    https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git \
    linux-6.12-lts

cd linux-6.12-lts

# 查看所有 LTS 分支
git branch -r | grep "linux-[0-9]\+\.y"

# 切换到特定 LTS 版本(如 6.12.5)
git checkout v6.12.5

参数说明:

  • --depth=1:浅克隆,只下载最新版本的代码,大幅减少下载量(从 4.5 GB 降至 ~1.8 GB)。
  • --branch linux-6.12.y:指定 LTS 稳定分支,该分支会持续接收安全补丁和 bug 修复。
  • v6.12.5:具体的 tagged 版本,每个 LTS 小版本都有对应的 tag。
💡 进阶技巧: 如果后续需要查看完整历史,可以使用 git fetch --unshallow 将浅克隆转换为完整克隆。对于驱动开发,浅克隆通常已经足够,因为只需要最新的源码树。

3.4 内核源码目录结构解析

理解内核源码的目录布局是配置和编译的基础。下图展示了与 DRM/KMS 驱动开发最相关的核心目录:

Linux 内核源码目录结构(DRM/KMS 相关) linux-6.12.y/ drivers/ include/ Documentation/ arch/ gpu/drm/ i915/ amd/amdgpu/ msm/ panel/ drm/ drm_fourcc.h drm_mode.h drm_crtc.h 📌 说明: DRM 核心代码位于 drivers/gpu/drm/,头文件位于 include/drm/。具体 GPU 驱动(i915、amdgpu、msm)位于 drivers/gpu/drm/ 子目录下。

3.5 内核配置:make menuconfig

make menuconfig 是基于 ncurses 的文本界面配置工具,是嵌入式开发和驱动开发中最常用的配置方式。它提供树形菜单结构,支持搜索、依赖检查和帮助查看。

3.5.1 配置前的准备工作

在运行 make menuconfig 之前,需要确保系统安装了必要的依赖:

# Debian/Ubuntu 系统
sudo apt-get update
sudo apt-get install -y \
    build-essential \
    libncurses-dev \
    bison \
    flex \
    libssl-dev \
    libelf-dev \
    bc \
    dwarves

# 验证 ncurses 是否可用
dpkg -l | grep libncurses-dev

3.5.2 启动配置界面

# 进入内核源码目录
cd linux-6.12-lts

# 使用当前系统的配置作为起点(推荐)
cp /boot/config-$(uname -r) .config

# 或者从默认配置开始
make defconfig

# 启动 menuconfig
make menuconfig

界面操作指南:

按键 功能
↑ / ↓ 上下移动光标
Enter 进入子菜单 / 选中条目
Space 切换选项状态(M=模块,*=编译进内核,空=禁用)
/ 搜索配置项(支持通配符)
? 查看当前选项的帮助信息
Tab 在底部按钮间切换(Select/Exit/Help)

3.5.3 DRM/KMS 相关配置项

在 menuconfig 中,DRM 子系统位于 Device Drivers → Graphics support 路径下。以下是与显示驱动开发最核心的配置项:

# 搜索 DRM 相关配置
/DRM

# 关键配置路径及选项(按菜单层级排列)
Device Drivers  --->
  Graphics support  --->
    <*> Direct Rendering Manager (XFree86 4.1.0 and higher DRI support)
    [*]   Enable legacy drivers (DRI1, etc.)
    <M>   DRM driver for Intel Graphics
    <M>   DRM driver for AMD GPU
    <M>   DRM driver for Qualcomm Adreno GPU
    [*]   DRM DisplayPort MST support
    [*]   DRM HDMI support
    <*>   DRM Simple Memory Allocator
    Console display driver support  --->
      <*> Framebuffer Console support
      [*]   Bootup logo
🔑 配置原则:
  • 编译进内核(*):DRM 核心框架、帧缓冲控制台、启动 Logo 等基础功能必须编译进内核,否则系统可能无法正常显示。
  • 编译为模块(M):具体的 GPU 驱动(i915、amdgpu 等)建议编译为模块,便于调试时动态加载/卸载。
  • 禁用(空):不需要的驱动(如旧的 DRI1 驱动)可以禁用,以减小内核体积。

3.5.4 保存配置与生成 .config

配置完成后,通过 Save 按钮保存到 .config 文件。也可以使用命令行方式快速调整:

# 保存配置(在 menuconfig 界面中按 Tab 选择 Save 并确认)

# 或者使用脚本方式修改配置
# 启用 DRM 核心
scripts/config --enable DRM
# 将 i915 驱动设为模块
scripts/config --module DRM_I915
# 禁用旧的 radeon 驱动
scripts/config --disable DRM_RADEON

# 处理依赖关系
make olddefconfig
💡 效率技巧: 使用 scripts/config 脚本可以批量修改配置项,适合在自动化构建脚本中使用。修改后务必执行 make olddefconfig 自动处理新增配置项的默认值,避免后续编译报错。

3.6 配置验证与常见问题

配置完成后,建议进行以下验证:

# 查看最终配置中 DRM 相关选项
grep -E "^(CONFIG_DRM|CONFIG_FB)" .config

# 检查是否有未满足的依赖
make defconfig-check

# 生成依赖关系图(需要 graphviz)
make savedefconfig
cat defconfig | grep DRM

常见问题排查:

问题现象 原因 解决方案
menuconfig 无法启动 缺少 libncurses-dev 安装 ncurses 开发包
配置项显示为 N/A 依赖的父选项未启用 先启用父选项,再返回子菜单
搜索不到 DRM 选项 未执行 make defconfig 先生成默认 .config 文件
保存后编译报错 配置依赖冲突 执行 make olddefconfig 修复
⚠️ 配置陷阱: 不要直接手动编辑 .config 文件来修改配置项,因为内核的 Kconfig 系统有复杂的依赖关系链。手动修改可能导致依赖不一致,编译时会出现难以排查的错误。始终使用 make menuconfig 或 scripts/config 工具进行修改。

3.7 本章小结

本章完成了 DRM/KMS 开发环境搭建的第一步——内核源码的获取与配置。核心要点总结如下:

  • 源码获取: LTS 内核(git clone)适合驱动开发基线,主线内核(kernel.org)适合特性验证。
  • 目录结构: DRM 核心代码在 drivers/gpu/drm/,头文件在 include/drm/,具体驱动在子目录中。
  • 配置工具: make menuconfig 是驱动开发的标准配置方式,支持搜索、依赖检查和模块化配置。
  • 配置策略: DRM 核心编译进内核,具体驱动编译为模块,使用 scripts/config 进行批量修改。