> ## Documentation Index
> Fetch the complete documentation index at: https://dragonwingdocs.qualcomm.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 修改内核

Qualcomm<sup>®</sup> Linux 内核使用 Yocto `devtool` 工作流程进行开发。
本页介绍在 Yocto 工作区内进行内核源码和配置更改的"编辑–构建–维护"循环。

<Note>
  本页仅介绍 Yocto `devtool` 工作流程。如需在不构建完整镜像的情况下更快地迭代仅涉及内核的更改,请参阅
  [不使用 Yocto 构建内核](./build-kernel-standalone)。
</Note>

<Note>
  开始之前,请确保主机已安装所需工具(`kas`、`git` 和 Yocto 构建依赖项)。请参阅
  [先决条件与主机设置](./prerequisites-and-host-setup)。
</Note>

* 要设置主机并克隆源码,请参阅[获取内核源码](./access-kernel-sources)。
* 要配置内核并构建镜像,请参阅[使用 Yocto 构建内核](./build-kernel-yocto)。
* 要不使用 Yocto 构建内核,请参阅[不使用 Yocto 构建内核](./build-kernel-standalone)。
* 要在构建后刷写和验证,请参阅[安装并启动内核](./install-and-boot-the-kernel)。

有关 Yocto 内核开发机制的更多信息,请参阅
[Yocto Project Linux Kernel Development](https://docs.yoctoproject.org/kernel-dev/)。

## 解包内核源码

使用 `devtool` 将内核源码解包到本地工作区进行编辑。
`devtool modify` 将内核源码检出到 devtool 工作区,并将配方重新指向该本地副本进行构建,因此下次构建时会自动使用你的编辑内容,而无需重新从上游获取。

1. 在发布标签处克隆 `meta-qcom`。发布标签遵循 `qli-<version>` 约定(例如 `qli-2.0`)。有关可用标签,请参阅
   [Qualcomm Linux 发行说明 - 简介](https://dragonwingdocs.qualcomm.com/Key-Documents/Software-Release-Notes/introduction)。

```bash theme={null}
git clone https://github.com/qualcomm-linux/meta-qcom.git -b <release-tag>
```

2. 在固定的修订版本处同步所有 meta 层。如果你已经在
   [使用 Yocto 构建内核](./build-kernel-yocto#sync-meta-layers-with-kas)中完成了同步步骤,则此步骤已完成。

3. 打开 kas shell。将 `rb3gen2-core-kit.yml` 替换为与你的单板匹配的机器 YML。所有受支持的机器 YML 文件均在 `meta-qcom/ci/` 中。

```bash theme={null}
kas shell meta-qcom/ci/rb3gen2-core-kit.yml:meta-qcom/ci/qcom-distro.yml
```

4. 将内核源码解包到 devtool 工作区:

```bash theme={null}
devtool modify linux-qcom
```

内核源码被检出到 `build/workspace/sources/linux-qcom`。

<Note>
  对于主线 BSP,请使用 `linux-qcom-next`,并在解包之前在
  `build/conf/local.conf` 中设置
  `PREFERRED_PROVIDER_virtual/kernel = "linux-qcom-next"`。
</Note>

## 进行内核配置更改

在 `build/workspace/sources/linux-qcom` 中编辑内核源码或配置。

要以交互方式修改内核配置:

1. 打开 kas shell(将 `rb3gen2-core-kit.yml` 替换为你的机器 YML):

```bash theme={null}
kas shell meta-qcom/ci/rb3gen2-core-kit.yml:meta-qcom/ci/qcom-distro.yml
```

2. 通过 devtool 启动 `menuconfig`:

```bash theme={null}
devtool menuconfig linux-qcom
```

3. 配置片段保存到:

```text theme={null}
build/workspace/sources/linux-qcom/oe-local-files/devtool-fragment.cfg
```

<Note>
  对于主线内核,将 `linux-qcom` 替换为 `linux-qcom-next`。
</Note>

## 构建并测试你的更改

编辑内核源码或配置后,先构建并部署内核,在硬件上验证更改后再提交。

1. 打开 kas shell(将 `rb3gen2-core-kit.yml` 替换为你的机器 YML):

```bash theme={null}
kas shell meta-qcom/ci/rb3gen2-core-kit.yml:meta-qcom/ci/qcom-distro.yml
```

2. 仅构建内核(比完整镜像构建更快):

```bash theme={null}
devtool build linux-qcom
```

3. 准备好部署时,构建完整的可刷写镜像:

```bash theme={null}
devtool build-image qcom-multimedia-image
```

4. 刷写更新的内核镜像并重启。有关完整的刷写步骤和启动后验证步骤,请参阅
   [安装并启动内核](./install-and-boot-the-kernel)。

## 提交内核更改

编辑和测试完成后,在 devtool 工作区内提交你的更改,以便将其导出为补丁。`-s` 标志会添加 `Signed-off-by:` 尾注,这是向上游提交补丁所必需的。

```bash theme={null}
cd build/workspace/sources/linux-qcom
git add .
git commit -s -m "my changes"
```

## 维护内核更改

使用 `devtool finish` 将你的更改导出为补丁,并接入自定义 meta 层:

1. 打开 kas shell(将 `rb3gen2-core-kit.yml` 替换为你的机器 YML):

```bash theme={null}
kas shell meta-qcom/ci/rb3gen2-core-kit.yml:meta-qcom/ci/qcom-distro.yml
```

2. 创建并注册自定义层(仅首次需要):

```bash theme={null}
bitbake-layers create-layer ~/meta-<mylayer>
mkdir -p ~/meta-<mylayer>/recipes-kernel/linux/linux-qcom
bitbake-layers add-layer ~/meta-<mylayer>
```

3. 将补丁和配置片段导出到该层:

```bash theme={null}
devtool finish linux-qcom ~/meta-<mylayer>
```

`devtool finish` 之后,该层会更新为包含:

* 位于 `meta-<mylayer>/recipes-kernel/linux/linux-qcom/*.patch` 的内核补丁
* 一个将这些补丁添加到 `SRC_URI` 的 `bbappend`
* `build/workspace` 条目被移除

生成的 `bbappend` 如下所示:

```text theme={null}
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"

SRC_URI += "file://devtool-fragment.cfg \
            file://0001-my-patch.patch"
```

4. 从该层重新构建镜像,验证补丁能够干净地应用:

```bash theme={null}
devtool build-image qcom-multimedia-image
```

## 清理工作区

要丢弃 devtool 工作区并恢复到干净状态:

1. 打开 kas shell(将 `rb3gen2-core-kit.yml` 替换为你的机器 YML):

```bash theme={null}
kas shell meta-qcom/ci/rb3gen2-core-kit.yml:meta-qcom/ci/qcom-distro.yml
```

2. 移除自定义层:

```bash theme={null}
bitbake-layers remove-layer ~/meta-<mylayer>
```

3. 重置 devtool 工作区:

```bash theme={null}
devtool reset linux-qcom
```

4. 删除工作区目录:

```bash theme={null}
rm -rf build/workspace/sources/linux-qcom
```

## 后续步骤

* 要调试内核问题,请参阅[配置调试方法](./configure-debug-methods)。
