5 内核维护

5 构造源码树

本节介绍 Yocto Project 团队如何构造内核源码仓库,形成 Yocto Linux 内核 仓库。这些仓库位于 https://git.yoctoproject.org/ 的 "Yocto Linux Kernel" 栏目下,随 Yocto Project 发行版发布。团队通过编译和执行产品中每个 BSP 及功能的功能 描述集合来创建仓库。这些描述列出 Yocto Linux 内核中所需的全部补丁、配置、 分支、标签和功能划分,最终构建出 Yocto Project Linux 内核仓库(源码树) 以及 yocto-kernel-cache 中配套的元数据。

有了这些仓库,就可以访问并克隆特定 Yocto Project Linux 内核仓库,利用 其配置和功能构建镜像。

在 Yocto Project Linux 内核源码仓库和 yocto-kernel-cache Git 树的 任意克隆中,都能找到描述所有有效功能和 BSP 的文件。例如,以下命令克隆 基于 linux.org 4.12 版本分支的 Yocto Project 基线 Linux 内核,以及 保存内核元数据的 yocto-kernel-cache:

$ git clone https://git.yoctoproject.org/linux-yocto-4.12
$ git clone https://git.yoctoproject.org/linux-kernel-cache

设置 Yocto Project Linux 内核本地 Git 仓库的方法,见 “准备内核开发构建主机” 一节。

将内核 Git 仓库和元数据缓存克隆到本机后,可用以下 Git 命令查看可用分支:

$ git branch -a

检出分支后便可处理特定 Yocto Linux 内核。例如,以下命令检出内核仓库的 "standard/beagleboard" 分支,以及 yocto-kernel-cache 的 "yocto-4.12" 分支:

$ cd ~/linux-yocto-4.12
$ git checkout -b my-kernel-4.12 remotes/origin/standard/beagleboard
$ cd ~/linux-kernel-cache
$ git checkout -b my-4.12-metadata remotes/origin/yocto-4.12

备注

yocto-kernel-cache 仓库的分支对应 Yocto Linux 内核版本,例如 "yocto-4.12"、"yocto-4.10"、"yocto-4.9" 等。

检出并切换到相应分支后,就能看到为特定开发板构建该 Yocto Linux 内核所用 全部源文件的快照。

要查看特定 Yocto Linux 内核的功能和配置,需要检查 yocto-kernel-cache Git 仓库。其分支对应内核版本,例如 yocto-4.12,分支中的描述以 .scc 和 .cfg 文件保存。

不过,浏览本地 yocto-kernel-cache 中的功能描述和补丁,并不是确认某个 内核分支包含哪些内容的有效方法。应直接使用 Git 查看分支变更,这种方式 高效且灵活。

备注

只有 Yocto Project 团队才会在活跃开发周期中从头重建完整内核树。克隆 内核 Git 仓库只是为了高效地获得可用于构建和开发的副本。

以下步骤描述引入新的顶层内核功能或 BSP 时,Yocto Project 团队如何构造 https://git.yoctoproject.org/ 上的内核源码 Git 仓库。这些操作提供元数据,并创建包含 新功能、补丁或 BSP 的源码树:

  1. 将功能传给 OpenEmbedded 构建系统: 顶层内核功能传入内核构建子系统, 通常是某种内核类型的 BSP。

  2. 定位功能: 在以下系统目录中查找描述顶层功能的文件:

    典型构建查找的是 .scc 文件中的功能描述,文件名遵循以下格式,例如 beaglebone-standard.scc 和 beaglebone-preempt-rt.scc:

    bsp_root_name-kernel_type.scc
    
  3. 展开功能: 找到后,将功能描述展开为简单的操作脚本,或使用发布内核中 已有的等效脚本。

  4. 追加额外功能: 向顶层功能描述追加额外功能,它们可以来自配方的 KERNEL_FEATURES 变量。

  5. 定位、展开并追加每项功能: 按第三步所述,逐个定位、展开额外功能, 并追加到脚本。

  6. 执行脚本: 运行脚本,在 yocto-kernel-cache 仓库的对应目录生成 .scc 和 .cfg 文件。它们描述需要应用到基础 Git 仓库的全部分支、 标签、补丁及配置,以完整创建新 BSP 或功能的源码(构建)分支。

  7. 克隆基础仓库: 克隆基础仓库,将 yocto-kernel-cache 目录中列出的 操作应用到源码树。

  8. 执行清理: 完成所需的分支创建、补丁应用和标签操作,并让 Git 仓库保持 检出所需分支的状态。

至此,内核源码树和缓存可供开发者克隆到本地、配置,并构建适合特定目标硬件 的 Yocto Project 内核。

备注

  • 生成的 yocto-kernel-cache 仓库对 Yocto Project 发行版提供的内核 作出补充。附加内容和配置数据应用到现有分支末尾。https://git.yoctoproject.org/ 上 官方内核仓库的完整生成结果,是所有受支持开发板与配置的组合。

  • Yocto Project 团队采用的方法十分灵活,可将不可变历史与部署专用的 额外补丁无缝结合。所有内核新增内容都成为分支的组成部分。

  • https://git.yoctoproject.org/ 上的完整内核树,是为所有有效 BSP 重复上述步骤生成的。 最终得到分支清晰、历史干净的源码树,构成某个发行版的内核。负责此过程 的脚本 kgit-scc 位于 yocto-kernel-tools 仓库。

  • 构造完整内核树的步骤,与 BitBake 构建内核镜像时使用的步骤相同。

5 构建策略

将 Yocto Linux 内核仓库和缓存仓库(yocto-kernel-cache)克隆到开发系统 后,就可以进入内核开发的编译阶段,构建内核镜像。编译开始前,构建过程会 验证以下前提:

  • SRC_URI 指向内核 Git 仓库。

  • yocto-kernel-cache 中存在带元数据的 BSP 构建分支。分支基于 Yocto Linux 内核版本,配置与功能按组放在 yocto-kernel-cache/bsp 下。 例如,使用 linux-yocto_4.12 内核时,BeagleBone 开发板的功能和配置 位于仓库的 yocto-kernel-cache/bsp/beaglebone 区域。

    备注

    上例中,yocto-kernel-cache 仓库检出的是 "yocto-4.12" 分支。

OpenEmbedded 构建系统会确保这些条件满足后才尝试编译。不过也存在其他方式, 例如从头建立 BSP。

构建内核前,构建过程会验证源码树,并处理 .scc 功能描述中指定的所有 配置“片段”来配置内核。编译功能时,相关内核配置片段会按编译顺序记录在一系列 目录中。片段经过迁移和预处理,以 .config 文件的形式作为原始输入传给 Linux 内核配置子系统(lkc)。lkc 根据内部依赖约束完成最终处理, 生成编译时使用的最终 .config 文件。

随后,利用开发板模板中的架构及其他相关值启动内核编译,生成内核镜像。

配置内核后,还会发现构建过程生成了一棵独立于本地内核 Git 源码仓库的构建树。 其名称格式如下,其中 ${MACHINE} 是机器(BSP)的元数据名称,"kernel_type" 是 Yocto Project 支持的内核类型之一,例如 "standard":

linux-${MACHINE}-kernel_type-build

这一默认功能由 kernel.org 源码树中的现有支持实现。

因此,特定机器或 BSP 的全部生成文件都位于构建树目录,包括最终 .config、 所有 .o、.a 文件等。每个机器或 BSP 在 Git 仓库的独立分支中都有 自己的 Build Directory,因此可以方便地在不同构建间切换。