5内核维护
目录
5.1树的构建
本节介绍 Yocto 项目内核源代码库的构建,由 Yocto 项目团队完成以创建 Yocto Linux 内核库。这些内核存储库位于https://git.yoctoproject.org/cgit/cgit.cgi/ 的“Yocto Linux 内核”标题下,并作为 Yocto 项目版本的一部分提供。该团队通过为产品中的每个 BSP 和功能编译和执行一组功能描述来创建这些存储库。这些功能描述列出了 Yocto Linux 内核中所有必要的补丁、配置、分支、标签和功能分区。因此,yocto-kernel-cache
构建了 Yocto Project Linux 内核存储库(或树)和随附的元数据 。
这些存储库的存在允许您访问和克隆特定的 Yocto Project Linux 内核存储库,并使用它来根据其配置和功能构建映像。
您可以在 Yocto Project Linux 内核源存储库和yocto-kernel-cache
Git 树的任何克隆中找到用于描述 Yocto Project Linux 内核中所有有效功能和 BSP 的文件。例如,以下命令克隆 Yocto Project 基线 Linux 内核,该内核从linux.org
4.12 版和 yocto-kernel-cache
包含内核元数据存储的 .
$ git clone git://git.yoctoproject.org/linux-yocto-4.12
$ git clone git://git.yoctoproject.org/linux-kernel-cache
有关如何设置 Yocto Project Linux 内核文件的本地 Git 存储库的更多信息,请参阅“准备构建主机以在内核上工作”部分。
在本地计算机上克隆内核 Git 存储库和元数据缓存后,您可以使用以下 Git 命令发现存储库中可用的分支:
$ git branch -a
签出分支允许您使用特定的 Yocto Linux 内核。例如,以下命令检查 Yocto Linux 内核存储库的“standard/beagleboard”分支和存储库的“yocto-4.12”分支yocto-kernel-cache
:
$ 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-kernel-cache
存储库中的分支对应于 Yocto Linux 内核版本(例如yocto-4.12
)。分支包含.scc
和.cfg
文件形式的描述。
但是,您应该意识到,浏览本地 yocto-kernel-cache
存储库以获取功能描述和补丁并不是确定特定内核分支中的内容的有效方法。相反,您应该直接使用 Git 来发现分支中的更改。使用 Git 是一种检查内核更改的有效且灵活的方式。
注意
完整内核树的彻底重建是仅由 Yocto 项目团队在活跃的开发周期中采取的行动。当您创建内核 Git 存储库的克隆时,您只是使其有效地可用于构建和开发。
以下步骤描述了当 Yocto 项目团队构建在https://git.yoctoproject.org/cgit/cgit.cgi/ 上找到的 Yocto 项目内核源 Git 存储库(或树)时会发生什么,因为引入了新的顶级内核功能或 BSP。以下操作有效地提供元数据并创建包含新功能、补丁或 BSP 的树:
-
将功能传递给 OpenEmbedded 构建系统:将顶级内核功能传递给内核构建子系统。通常,此功能是特定内核类型的 BSP。
-
定位特征:通过搜索这些系统目录来定位描述顶级特征的文件:
-
树内内核缓存目录,位于 Yocto 项目源代码库中 的“Yocto Linux 内核”标题下的yocto-kernel-cache存储 库中。
-
在内核配方中找到的SRC_URI语句指向的区域。
对于典型的构建,搜索的目标是
.scc
文件中的特征描述,其名称遵循以下格式(例如beaglebone-standard.scc
和beaglebone-preempt-rt.scc
):bsp_root_name-kernel_type.scc
-
-
扩展功能:一旦找到,功能描述要么扩展为一个简单的操作脚本,要么扩展为一个现有的等效脚本,该脚本已经是交付内核的一部分。
-
附加额外功能:将额外功能附加到顶级功能描述中。这些功能可以来自 配方中的 KERNEL_FEATURES变量。
-
定位、扩展和附加每个特征:每个额外的特征都被定位、扩展并附加到脚本中,如步骤 3 中所述。
-
执行脚本:执行脚本以在存储库的适当目录中生成文件
.scc
和.cfg
文件yocto-kernel-cache
。这些文件描述了需要应用于基础 Git 存储库以完全创建新 BSP 或功能的源(构建)分支的所有分支、标签、补丁和配置。 -
克隆基本存储库:克隆基本存储库,并将
yocto-kernel-cache
目录中列出的操作应用于树。 -
执行清理:在 Git 存储库中留下所需的分支,并且已执行任何所需的分支、修补和标记。
内核树和缓存已准备好供开发人员使用,以便在本地克隆、配置并构建到特定于某些目标硬件的 Yocto 项目内核中。
注意
-
生成的
yocto-kernel-cache
存储库将添加到 Yocto 项目发行版附带的内核中。任何附加组件和配置数据都应用于现有分支的末尾。在https://git.yoctoproject.org/cgit/cgit.cgi/的官方 Yocto 项目内核存储库中找到的完整存储库生成是所有支持的板和配置的组合。 -
Yocto 项目团队使用的技术非常灵活,允许将不可变历史与特定于部署的附加补丁无缝混合。对内核的任何添加都成为分支的集成部分。
-
您在https://git.yoctoproject.org/cgit/cgit.cgi/上看到的完整内核树是通过对所有有效 BSP 重复上述步骤生成的。最终结果是一个分支的、干净的历史树,它构成了给定版本的内核。您可以
kgit-scc
在yocto-kernel-tools 存储库中看到对此负责的脚本 ( ) 。 -
用于构建完整内核树的步骤与 BitBake 在构建内核映像时使用的步骤相同。
5.2构建策略
将 Yocto Linux 内核存储库和缓存存储库 ( yocto-kernel-cache
)克隆到开发系统后,您可以考虑内核开发的编译阶段,即构建内核映像。在编译开始之前,构建过程会验证一些先决条件:
-
该SRC_URI点到内核Git仓库。
-
yocto-kernel-cache
存储库中存在带有元数据的 BSP 构建分支。该分支基于 Yocto Linux 内核版本,并具有在yocto-kernel-cache/bsp
目录下分组的配置和功能 。例如,假设linux-yocto_4.12
内核位于yocto-kernel-cache
存储库的以下区域中, BeagleBone Board 的功能和配置 :yocto-kernel-cache/bsp/beaglebone注意
在前面的示例中,“yocto-4.12”分支在
yocto-kernel-cache
存储库中被检出。
OpenEmbedded 构建系统确保在尝试编译之前满足这些条件。但是,确实存在其他方法,例如引导 BSP。
在构建内核之前,构建过程会验证树并通过处理.scc
文件中功能描述指定的所有配置“片段”来配置内核。随着功能的编译,相关的内核配置片段会被记录下来,并按照编译顺序记录在一系列目录中。这些片段被迁移、预处理并以文件lkc
的形式作为原始输入传递到 Linux 内核配置子系统 ( ) .config
。在lkc
使用其自己的内部制约的依赖做的是信息的最终处理,并生成最终.config
是在编译时使用的文件。
使用板的架构和板模板中的其他相关值,启动内核编译并生成内核映像。
配置内核后,您注意到的另一件事是构建过程会生成一个构建树,该树与内核的本地 Git 源存储库树分开。此构建树的名称使用以下形式,其中${MACHINE}
是机器的元数据名称 (BSP),“kernel_type”是 Yocto Project 支持的内核类型之一(例如“standard”):
linux-${MACHINE}-kernel_type-build
kernel.org
树中的现有支持实现了此默认功能。
这种行为意味着为特定机器或 BSP 生成的所有文件现在都在构建树目录中。文件包括最终.config
文件、所有.o
文件、.a
文件等。由于每台机器或 BSP在自己独立的 Git 存储库分支中都有自己独立的 构建目录,因此您可以轻松地在不同构建之间切换。