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 的源码树:
将功能传给 OpenEmbedded 构建系统: 顶层内核功能传入内核构建子系统, 通常是某种内核类型的 BSP。
定位功能: 在以下系统目录中查找描述顶层功能的文件:
树内的 kernel-cache 目录,位于 Yocto Project 源码仓库 的 "Yocto Linux Kernel" 栏目下的 yocto-kernel-cache 仓库。
内核配方中 SRC_URI 语句指向的位置。
典型构建查找的是
.scc文件中的功能描述,文件名遵循以下格式,例如beaglebone-standard.scc和beaglebone-preempt-rt.scc:bsp_root_name-kernel_type.scc
展开功能: 找到后,将功能描述展开为简单的操作脚本,或使用发布内核中 已有的等效脚本。
追加额外功能: 向顶层功能描述追加额外功能,它们可以来自配方的 KERNEL_FEATURES 变量。
定位、展开并追加每项功能: 按第三步所述,逐个定位、展开额外功能, 并追加到脚本。
执行脚本: 运行脚本,在
yocto-kernel-cache仓库的对应目录生成.scc和.cfg文件。它们描述需要应用到基础 Git 仓库的全部分支、 标签、补丁及配置,以完整创建新 BSP 或功能的源码(构建)分支。克隆基础仓库: 克隆基础仓库,将
yocto-kernel-cache目录中列出的 操作应用到源码树。执行清理: 完成所需的分支创建、补丁应用和标签操作,并让 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,因此可以方便地在不同构建间切换。