# 功能

Source: [https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html)

Qualcomm Linux 内核提供各种功能，以便在 Qualcomm 设备上运行上游 Linux 内核。

下方列出了与在 Qualcomm 平台上运行 Mainline Linux 内核相关的一些主要功能和成果：

- 专为支持使用 Qualcomm 芯片组的设备定制的 Qualcomm Linux BSP。
- 对应于 Qualcomm 开发套件的设备树。
- 便于使用 Qualcomm 芯片组的多种不同的编译配置。
- 集成到 Yocto 编译系统的 Linux 内核。
- Qualcomm Linux 内核与内核社区标准一致。增加的 Qualcomm 特定配置将单独维护。
- 支持配置、定制和编译内核镜像，这些镜像可以刷入采用 Qualcomm 芯片组的设备并进行启动。
- Qualcomm Linux 内核是 EFI 镜像的一部分，该镜像使用 Qualcomm 统一可扩展固件接口 (UEFI) 和标准 systemd-boot 启动管理器。
- 保持对 Qualcomm 下游基础设施的支持，以实现 RAM 转储等定制用例和 secure 用例。
- 与使用追踪和 RAM 转储的标准 Linux 内核调试方法兼容。
- 使用 Gunyah™ Hypervisor 软件支持不受信虚拟机的虚拟化。
- 定期合并相应长期支持 (LTS) 内核分支中的 LTS，以获得最新的安全性和稳定性修复。

## 启动

Source: [https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html)

Qualcomm Linux 支持将 systemd-boot 作为 UEFI 启动管理器，用于加载和启动 Linux 内核。在这种情况下，Linux 内核编译为 EFI stub。

### 启动流程和架构

冷启动从 primary boot loader (PBL) 开始执行，以此设置初始系统，以便执行 eXtensible boot loader (XBL)。XBL 执行包括 DDR 初始化在内的更广泛的系统初始化，并加载 UEFI 镜像。UEFI 提供丰富的固件接口，用于将 system-boot 启动管理器加载至 Qualcomm Linux，以管理操作系统镜像。

有关完整冷启动流程的详细信息，参见 [Qualcomm Linux 启动指南](bundle/publicresource/topics/80-70014-4)中的 [冷启动架构](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-4Y/bootloader-architecture.html)部分。

### Systemd-boot

Systemd-boot 是一种 UEFI 启动管理器，用于执行 EFI 镜像、提供启动项并支持统一内核镜像。Systemd-boot 支持以下各项：

- 启动项：类型 1 boot loader 规范条目位于 ESP 分区的 `loader/entries/` 目录中。这些文件描述了 Linux 内核镜像及相关的 initrd 镜像，和其他 EFI 可执行文件。
- 统一内核镜像 (UKI)：类型 2 boot loader 规范的 EFI 统一内核镜像是 ESP 分区 `/EFI/Linux/` 目录中的可执行 EFI 二进制文件。
    有关启动项和统一内核镜像的信息，参见[BootLoader 规范](https://uapi-group.org/specifications/specs/boot_loader_specification)。

Systemd-boot 是 systemd 软件包的一部分，该软件包是 Yocto 元数据层的一部分。Yocto recipe 使用 `systemd-boot_254.4.bb` recipe 文件编译 systemd-boot，`uki.bbclass` recipe 文件用于处理 ESP 镜像的生成。

有关 systemd-boot 的详细信息，参见 [systemd-boot](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-27Y/platform_software_features.html#sub$systemd_boot)。

### Linux 内核作为 EFI stub

EFI boot stub 支持直接启动 Linux 内核，而无需传统的 EFI boot loader。

如果编译 Linux 内核时启用了 `CONFIG_EFI_STUB` 内核配置选项，启动固件可以将 EFI 镜像作为可执行文件进行加载。在这种情况下，固件加载程序会跳转到 `drivers/firmware/efi/libstub/` 目录中的 `EFI boot stub` 位置，然后启动内核。

在 Arm® (Arm64) 架构中，由于不支持压缩内核镜像，内核镜像可充当可移植可执行 (PE) 文件格式或通用对象文件格式 (COFF) 镜像，并且 EFI stub 会链接到内核中。

有关将 Linux 内核作为 EFI 镜像启动的详细信息，参见 [EFI Boot Stub](https://docs.kernel.org/admin-guide/efi-stub.html)。

### 启动镜像和 ESP/启动分区

ESP 分区是一个存储位置，用于存储将 systemd-boot、UKI 和 DTB 打包的 `efi.bin` 镜像。UKI 包括内核镜像、initramfs 和内核命令行参数。

UEFI 固件用于启动 UEFI boot loader 并加载内核启动镜像。ESP 分区使用 UEFI 规范支持的文件分配表 (FAT) 文件系统进行格式化。如需详细了解 UKI 镜像格式以及在基本元数据层中的相应支持，参见 [systemd-boot](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-27Y/platform_software_features.html#sub$systemd_boot)。

### DTB 的选择

所有设备树 blob 均打包至 `efi.bin` 中。UEFI 选择并加载适合 Linux 内核的 DTB。

若要打包 DTB 以供启动时选择，参见[平台支持](https://docs.qualcomm.com/doc/80-70014-3Y/topic/customize.html#platform-support_0)章节。

## 平台支持

Source: [https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html)

Qualcomm Linux 按照以下步骤来选择设备树文件、更改内核配置以及编译树外内核模块。

### QCM6490 设备树

Source: [https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html)

Qualcomm Linux 支持设备树 overlay 特性，该特性支持设备树外 blob 的维护及其与基础设备树 blob 的合并。

QCM6490 片上系统 (SoC) 设备树由 `arch/arm64/boot/dts/qcom` 目录下的内核源代码提供支持。

[Table :  4. Qualcomm 设备树源文件](https://docs.qualcomm.com/doc/80-70014-3Y/topic/getting_started_chapter2.html#platform_device_tree__table_g34_hmd_l1c_barnchak_02-15-24-1354-23-238) 列出了设备树如何进行明确区分，以包含下游增加的配置，同时支持与上游对齐的基本配置：

有些下游内容托管在内核源代码之外。树外驱动程序还会在内核之外维护增加的设备树 overlay 内容。在编译过程中，相应的设备树 overlay 文件与基本的板级 DTB 合并，生成统一的 DTB，与启动镜像配合使用。

下图显示了编译设备树 overlay 文件并生成 DTB 的过程：

Figure : 设备树 overlay
                ![](data:image/png;base64,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)

编译系统使用 `fdt_overlay` 工具在编译期间为处理树外设备树叠加提供支持。

DTBO 合并功能支持合并 `meta-qcom-hwe/conf/machine/qcm6490.conf` 文件中列出的 DTBO 文件。

设备树变量枚举如下：

    # List of dtbs for corresponding supported qcm6490 platforms
    KERNEL_DEVICETREE = " \ 
                          qcom/qcs6490-addons-rb3gen2.dtb \
                          "
    # Additional list of dtbos to be overlaid on top of base kernel devicetree files
    # Format - KERNEL_TECH_DTBOS[<base-dtb-name>] = "<dtbo1 <dtbo2> ..."
    # For example:
     
    KERNEL_TECH_DTBOS[qcs6490-addons-rb3gen2] = "qcm6490-graphics.dtbo qcm6490-wlan-rb3gen2.dtbo qcm6490-display-rb3gen2.dtbo qcm6490-bt.dtbo"Copy to clipboard

**DTBO 合并序列**

`image-qcom-deploy.bbclass` 类中的 `merge_dtbos()` 任务使用 `fdtoverlay` 工具合并 DTBO。

`merge_dtbos()` 任务迭代按以下顺序进行：

1. 任务的第一步是找出配置文件中列出的 DTBO 文件名。
2. 然后，会遍历 `KERNEL_DEVICETREE` 变量中的内容。
3. 对于每个基本的 DTB，都会叠加 `KERNEL_TECH_DTBOS` 变量中列出的 DTBO。
4. 叠加过程完成后，将生成最终的 DTB 输出。

### 内核配置

Source: [https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html)

内核 recipe `linux-kernel-qcom_6.6.bb` 使用下列配置文件编译镜像。

    KERNEL_DEFCONFIG = "${S}/arch/arm64/configs/qcom_defconfig"
     
    KERNEL_CONFIG_FRAGMENTS:append = " ${S}/arch/arm64/configs/qcom_addons.config"
    KERNEL_CONFIG_FRAGMENTS:append = " ${@oe.utils.vartrue('DEBUG_BUILD', '${S}/arch/arm64/configs/qcom_debug.config', '', d)}"
    KERNEL_CONFIG_FRAGMENTS:append = " ${@oe.utils.vartrue('DEBUG_BUILD', '${S}/arch/arm64/configs/qcom_addons_debug.config', '', d)}"Copy to clipboard

使用下列命令和调试配置文件生成调试编译版本：

    # Set DEBUG_BUILD to 1 to compile debug enabled build
     
    $ source setup-environment
    $ DEBUG_BUILD=1 bitbake linux-kernel-qcomCopy to clipboard

有关不同配置文件的详细信息，参见[入门指南](https://docs.qualcomm.com/doc/80-70014-3Y/topic/getting_started_chapter2.html)章节。

## Remoteproc 子系统

Source: [https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html)

Remoteproc 框架用于将固件加载到 Qualcomm 平台上的其他子系统中，例如音频数字信号处理器 (aDSP) 和计算数字信号处理器 (cDSP)。

Remoteproc 框架分为两部分 - 核心框架和 remoteproc 驱动程序。核心框架包含通用逻辑，驱动程序则包含管理相应核心的平台特定操作。Remoteproc 驱动程序向核心框架注册一个 remoteproc 实例和一组操作。核心框架用于加载固件并启动或停止远程处理器。

在采用非对称多处理 (ASMP) 配置的 SoC 中，存在多个异构远程处理器。远程处理器运行不同的固件（或操作系统）实例。

如需详细了解 Qualcomm Linux 用于管理其他核心的标准框架，参见[远程处理器框架](https://www.kernel.org/doc/html/next/staging/remoteproc.html)。

### Qualcomm 对 remoteproc 的支持

Source: [https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html)

Qualcomm 对 remoteproc 框架进行了增强，使其能够利用上游外设鉴权服务 (PAS) 驱动程序来对外设固件进行鉴权。

Qualcomm Linux 中的 remoteproc 驱动程序实现了外设鉴权服务 (PAS) 驱动程序，该驱动程序是一种基于 TrustZone 的外设镜像加载程序，用于将镜像加载到 Qualcomm SoC 设备上的远程处理器中。

有关详细信息，参见[qcom_q6v5_pas.c](https://github.com/torvalds/linux/blob/master/drivers/remoteproc/qcom_q6v5_pas.c)。

远程处理器用于管理各种协处理器的生命周期，如 aDSP、cDSP、Modem 外设子系统 (MPSS) 和无线处理器子系统 (WPSS) 等。以下列出了基于 QCM6490 的电路板上支持的协处理器列表：

- RB3 Gen 2：aDSP，cDSP 和 WPSS

**用户接口：**Remoteproc 框架可跟踪注册的 remoteproc 设备并提供用于启动和关闭设备的用户接口。用户空间可以使用以下 `sysfs` 接口查询和更改 remoteproc 的当前状态：

    remoteproc user space interface
    # start remoteproc:
    $ echo "start" > /sys/class/remoteproc/remoteprocN/state
     
    # stop remoteproc:
    $ echo "stop" > /sys/class/remoteproc/remoteprocN/stateCopy to clipboard

Figure : 对 remoteproc 的支持
            ![](data:image/png;base64,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)

### Remoteproc 恢复和子系统重启

Source: [https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html)

Remoteproc 子设备负责管理远程处理器子系统崩溃和恢复场景中的通信环境。

通信环境等实体必须确定远程处理器何时启动或关闭。每个子设备都有两种操作：
- `probe()`，在 remoteproc `start()` 之后调用
- `remove()`，在 `stop()` 之前调用

当远程处理器发生致命错误时，remoteproc 驱动程序将对其进行处理并调用 `rproc_report_crash()`，使发生错误的远程处理器恢复。

恢复处理程序会执行以下操作：

Figure : Remoteproc 崩溃时序
            ![](data:image/png;base64,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)

使用用户空间中的恢复 `debugfs` 节点来启用和禁用恢复的方法如下：

    # remoteproc user space interface
    # Disable SSR:
    # echo disabled > /sys/kernel/debug/remoteproc/remoteprocN/recoveryCopy to clipboard

### Coredump

Source: [https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html)

支持远程处理器 coredump，可利用 Linux 内核 devcoredump 功能调试子系统崩溃问题。

当子系统崩溃时，devcoredump 会将正在恢复的 remoteproc 的内存快照暴露在 `/sys/class/devcoredump/devcdN/data` 节点中，同时将相关的崩溃 `uevent` 发送到用户空间。读取 sysfs 节点时，会提供 ELF 容器中的段；对该节点进行写入操作时，会释放相关资源并销毁 devcoredump 实例。

可暴露一个 debugfs 节点，使用户从用户空间启用和禁用 coredump。

    # Disable coredumps:
    $ echo disabled > /sys/kernel/debug/remoteproc/remoteprocN/coredumpCopy to clipboard

Note: QCM6490 平台在 remoteproc 崩溃（远程处理器上的致命错误）时会触发内核异常，以便收集完整的 RAM 转储文件，用于进行崩溃分析和进一步调试。内核异常只有在 coredump 处于禁用状态时才会启用。

### Remoteproc 配置和固件

Source: [https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html)

Remoteproc 设备使用 DT 绑定在相应的设备树文件中进行配置。根据 `Documentation/devicetree/bindings/remoteproc/` 目录中的 DT 绑定，该配置包括兼容的设备名称、内存区域、中断设置和时钟参考。

以下示例展示了 `arch/arm64/boot/dts/qcom/qcm6490.dtsi` 文件中的 QCM6490 aDSP remoteproc 设备树配置：

          remoteproc_adsp: remoteproc@3000000 {
                    compatible = "qcom,sc7280-adsp-pas";
                    reg = <0x0 0x03000000 0x0 0x100>;
     
                    interrupts-extended = <&pdc 6 IRQ_TYPE_EDGE_RISING>,
                                            <&adsp_smp2p_in 0 IRQ_TYPE_EDGE_RISING>,
                                            <&adsp_smp2p_in 1 IRQ_TYPE_EDGE_RISING>,
                                            <&adsp_smp2p_in 2 IRQ_TYPE_EDGE_RISING>,
                                            <&adsp_smp2p_in 3 IRQ_TYPE_EDGE_RISING>,
                                            <&adsp_smp2p_in 7 IRQ_TYPE_EDGE_RISING>;
                    interrupt-names = "wdog", "fatal", "ready", "handover",
                                    "stop-ack", "shutdown-ack";
     
                    clocks = <&rpmhcc RPMH_CXO_CLK>;
                    clock-names = "xo";
                    <snip>
           };Copy to clipboard

所有固件文件都位于 `rootfs` 中的 `/lib/firmware` 目录下，相关配置在相应的板级设备树 `arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts` 文件中完成。

以下示例展示了 remoteproc DT 配置：

          &remoteproc_adsp {
            firmware-name = "qcom/qcm6490/adsp.mdt";
            status = "okay";
           };Copy to clipboard

### 示例日志

在 remoteproc 成功启动后，会显示以下日志：

    # remoteproc success
    "remoteproc remoteproc1: remote processor 4080000.remoteproc is now up"Copy to clipboard

在 remoteproc 固件加载失败后，回显示以下日志：

    # remoteproc failure
    Error log: "remoteproc remoteproc0: Direct firmware load for qcom/qcm6490/modem.mdt failed with error -2"
     
    # Caused by: error loading firmware.
    # Solution: ensure that the modem firmware is copied to /lib/firmware/qcom/qcm6490 in rootfs.Copy to clipboard

## 内存

Source: [https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html)

Qualcomm Linux 内核基线支持所有内存管理功能和分配器。以下信息概述了如何定制内存映射和执行堆管理。

有关 Linux 内核内存管理的详细信息，参见[内存管理](https://www.kernel.org/doc/html/next/core-api/index.html#memory-management)。

### 平台内存映射

平台内存映射描述了内核启动过程中为子系统（如 Modem、摄像头、aDSP 和 cDSP 等）保留的区域。

内存映射为 DTSI 中的划分区域设置 `no-map`，使内核无法访问这些区域。

划分区域可以配置，并在 `reserved-memory` 节点的 `arch/arm64/boot/dts/qcom/qcm6490.dtsi`DTSI 文件中定义。

    reserved-memory {
                    cdsp_secure_heap_mem: cdsp-secure-heap@81800000 {
                            reg = <0x0 0x81800000 0x0 0x1e00000>;
                            no-map;
                    };
     
                    camera_mem: camera@84300000 {
                            reg = <0x0 0x84300000 0x0 0x500000>;
                            no-map;
                    };
     
                    wpss_mem: wpss@0x84800000 {
                            reg = <0x0 0x84800000 0x0 0x1900000>;
                            no-map;
                    };
     
                    adsp_mem: adsp@86100000 {
                            reg = <0x0 0x86100000 0x0 0x2800000>;
                            no-map;
                    };
    };Copy to clipboard

以下早期启动日志显示了为不同子系统创建的划分区域：

    [    0.000000] OF: reserved mem: 0x0000000081800000..0x00000000835fffff (30720 KiB) nomap non-reusable cdsp-secure-heap@81800000
    [    0.000000] OF: reserved mem: 0x0000000084300000..0x00000000847fffff (5120 KiB) nomap non-reusable camera@84300000
    [    0.000000] OF: reserved mem: 0x0000000084800000..0x00000000860fffff (25600 KiB) nomap non-reusable wpss@0x84800000
    [    0.000000] OF: reserved mem: 0x0000000086100000..0x00000000888fffff (40960 KiB) nomap non-reusable adsp@86100000Copy to clipboard

### 连续内存分配器 (CMA)

Qualcomm Linux 发行版支持 CMA 分配大块的物理上连续的内存。CMA 在启动时会保留大块的物理上连续的内存区域，并在 CMA 分配时提供物理上连续的内存。不使用时，CMA 内存可供内核伙伴分配器进行可移动分配。

如需修改默认 CMA 区域的大小，可以通过内核命令行参数传递 `cma=size_in_MB`。有关如何使用内核参数的详细信息，可参见以下示例：

    cma=nn[MG]@[start[MG][-end[MG]]]
                            [KNL,CMA]
                            Sets the size of kernel global memory area for
                            contiguous memory allocations and optionally the
                            placement constraint by the physical address range of
                            memory allocations. A value of 0 disables CMA
                            altogether. For more information, see
                            kernel/dma/contiguous.cCopy to clipboard

定制 CMA 区域定义在 `reserved-memory` 节点下，并带有 `shared-dma-pool` 兼容标记来指示 CMA 区域：

    adsp_heap_mem: adsp-heap {
                            compatible = "shared-dma-pool";
                            alloc-ranges = <0x0 0x00000000 0x0 0xffffffff>;
                            reusable;
                            alignment = <0x0 0x400000>;
                            size = <0x0 0xc00000>;
                    };Copy to clipboard

以下所示为启动时保留的 aDSP CMA 内存区域的日志示例：

    [    0.000000] OF: reserved mem: initialized node adsp-heap, compatible id shared-dma-pool
    [    0.000000] OF: reserved mem: 0x00000000ff000000..0x00000000ffbfffff (12288 KiB) map reusable adsp-heapCopy to clipboard

### DMA-BUF 堆

Qualcomm Linux 发行版支持 DMA-BUF 堆，以分配定制 CMA 堆。使用 DMA-BUF 堆时，每个堆在 `/dev/dma_heap` 文件系统中都有一个设备文件。除了系统堆和常用的 CMA 预留堆外，用户还可以创建自己的 CMA 类型的 DMA-BUF 堆。

### 支持的堆

下表列出了 Qualcomm Linux 发行版默认支持的堆：

| 堆名称 | Dev 节点 | 说明 | 用法 |
| --- | --- | --- | --- |
| 系统堆 | /dev/dma_heap/systemCopy to clipboard | 内核会创建默认的 DMA-BUF 堆。 | 所有通用用例均应使用系统堆，而系统堆在底层使用的是常见的 Linux 内存管理伙伴分配器。 |
| 保留堆 | /dev/dma_heap/reservedCopy to clipboard | 系统中创建的默认 CMA 类型的堆，使用默认**保留的** CMA 区域。 | 如果由于任何限制而需要使用连续内存，可使用 CMA 堆。 |
| 定制 CMA 堆 | /dev/dma_heap/my_cma_heapCopy to clipboard | 用户定义的 CMA 类型的堆。 | 为特定用例创建自己的 CMA 类型的堆时使用。 |

### DMA-BUF 堆的用法

以下示例程序演示了如何使用 `/dev/dma_heap/system` 目录下 Linux 内核创建的 DMA-BUF 系统堆：

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <fcntl.h> 
    #include <sys/ioctl.h> 
    #include <linux/dma-buf.h>
     
    #define DMA_HEAP_NAME "system" int main()
    {
    int fd, dma_buf_fd;
    struct dma_heap_export_info exp_info = {
    .heap_name = DMA_HEAP_NAME,
    .flags = 0,
    };
    struct dma_buf_sync sync_start = {
    .flags = DMA_BUF_SYNC_START,
    };
    struct dma_buf_sync sync_end = {
    .flags = DMA_BUF_SYNC_END,
    };
    
    fd = open("/dev/dma_heap/system", O_RDWR); if (fd < 0) {
    perror("open");return -errno;
    }
    
    dma_buf_fd = ioctl(fd, DMA_HEAP_IOCTL_ALLOC, &exp_info); if (dma_buf_fd < 0) {
    perror("ioctl");return -errno;
    }
    printf("Allocated DMA buffer with fd %d\n", dma_buf_fd); if (ioctl(dma_buf_fd, DMA_BUF_IOCTL_SYNC, &sync_start)) {
    perror("ioctl DMA_BUF_IOCTL_SYNC start"); return -errno;
    }
    
    // Do something with the buffer here
    
    if (ioctl(dma_buf_fd, DMA_BUF_IOCTL_SYNC, &sync_end)) { perror("ioctl DMA_BUF_IOCTL_SYNC end");
    return -errno;}
    re
    if (close(dma_buf_fd)) { perror("close"); return -errno;
    }
    
    if (close(fd)) {

    perror("close"); return -errno;
    }
    
    return 0;
    }
    Copy to clipboard

## 调度器

Source: [https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html)

调度器决定进程的运行顺序。调度器运行每个 CPU 的运行队列中可用的进程。

内核基线支持标准的 Linux 调度器方案。内核使用[节能调度 (EAS)](https://www.kernel.org/doc/html/next/scheduler/sched-energy.html) 功能根据 CPU 能耗选择适合放置任务的目标 CPU。

EAS 会取代 CFS 的任务唤醒负载均衡代码。在采用非对称 CPU 拓扑的系统中，它会使用平台的能量模型 (EM) 和每实体负载跟踪 (PELT) 信号，在任务唤醒负载均衡期间选择节能的目标 CPU。

有关调度器的基本文档，参见[调度器](https://www.kernel.org/doc/html/next/scheduler/index.html)。

### CPU 拓扑和 EAS

Source: [https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html)

Qualcomm SoC 平台采用异构 CPU 拓扑，这些拓扑通过 EAS 中使用的 CPU 容量指标加以区分。

EAS 使用“容量”的概念来区分具有不同计算能力的 CPU。CPU 的容量表示的是相对于系统中性能最强的 CPU 而言，以最高频率运行时完成的工作量。容量值归一化至 1024 范围内（最强大 CPU/群集的容量值配置为 1024）。

EAS 根据 CPU 节点中指定的 Dhrystone 每秒百万条指令 (DMIPS) 值和群集支持的最高频率确定群集的容量。

下表列出了 CPU 拓扑和容量对应的 `sysfs` 节点：

Table : CPU 拓扑和容量

| 命令 | 用途 |
| --- | --- |
| cat /sys/devices/system/cpu/cpu*/cpu_capacityCopy to clipboard | 获取系统中每个 CPU 的相关容量。 |
| cat /sys/devices/system/cpu/cpufreq/policy*/related_cpusCopy to clipboard | 获取与系统中每个群集相关的 CPU 列表。 |

有关调度器如何使用 CPU 容量的详细信息，参见[节能调度](https://www.kernel.org/doc/html/next/scheduler/sched-capacity.html)。

### 每实体负载跟踪

Source: [https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html)

每实体负载跟踪 (PELT) 是一种负载跟踪机制，用于跟踪 `sched_entities/groups/runqueues` 的负载计算。

PELT 时钟乘数可以进行调节，以满足功耗和性能要求。

命令行参数 `sched_pell_multiplier` 可用于设置时钟乘数。时钟乘数可调节 PELT 上升/下降速度，以便优化系统功耗和性能。

半衰期较短时，可以更快地累积任务的 CPU 利用率，并将任务分配给高性能 CPU 执行，从而实现更好的性能，但功耗也会更高。此外，CPU 利用率也会累积起来，以便在更短的时间内选择更高的 CPU 频率。

Note: 半衰期还会影响任务利用率下降的方式。UTIL EST 功能可加快下降速度。

有关 PELT 的详细信息，参见[实体负载跟踪](https://lwn.net/Articles/531853/)。

### SchedUtil 调节器

Source: [https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html)

SchedUtil CPU 频率调节器是 Qualcomm 平台的默认调节器。SchedUtil 根据 CPU 利用率预测最佳工作点 (OPP)，从而在频率请求与能耗预测之间保持一致。

SchedUtil CPU 频率调节器与 EAS 相关，它会尝试预测所有 CPU 在近期以哪个 OPP 运行，从而估算其能耗。

有关 SchedUtil 的详细信息，参见 [SchedUtil](https://www.kernel.org/doc/html/next/scheduler/schedutil.html)。

### 利用率夹紧 (UCLAMP)

Source: [https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html)

UCLAMP 可实现从用户空间进行任务/任务组的性能管理。

UCLAMP 可实现任务或任务组放置并提供性能提示或性能约束。此机制用于影响调度器放置决策或影响群集的频率指导。

有关 UCLAMP 的详细信息，参见 [UCLAMP](https://www.kernel.org/doc/html/next/scheduler/sched-util-clamp.html)。

## 动态电压及频率调节 (DVFS)

Qualcomm 内核基线支持多种 DVFS 实现，以便根据系统要求以动态方式管理频率调节。

### CPU DVFS

Source: [https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html)

可以选择一个调节器来调节系统的功耗或性能，同时更改 `CPUfreq` 调节器 (`powersave/performace/schedutil`)。默认情况下，在 Qualcomm Linux 平台上，CPU 频率调节器设置为 `performance` 模式。

Table : CPU DVFS 变量

| 变量 | 说明 | 路径 |
| --- | --- | --- |
| scaling_governorCopy to clipboard | 将调节器设置为性能模式。 | echo performance > /sys/devices/system/cpu/cpufreq/policy*/scaling_governorCopy to clipboard |
| scaling_max_freqCopy to clipboard | 设置 CPU 群集的最高频率。 | /sys/devices/system/cpu/cpufreq/policy*/scaling_min_freq or scaling_max_freq tunableCopy to clipboard |
| scaling_min_freqCopy to clipboard | 设置 CPU 群集的最低频率。 | /sys/devices/system/cpu/cpufreq/policy*/scaling_min_freq or scaling_min_freq tunableCopy to clipboard |

有关 `CPUfreq` 的详细信息，参见 [https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt](https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt)。

### 缓存和内存 DVFS

Source: [https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html)

静态映射 DVFS 调节器将 CPU 工作频率与三级缓存 (L3)、最后一级缓存控制器 (LLCC) 和 DDR RAM 的频率保持一致。

如果 CPU 频率达到最高，无论是通过将 CPU 频率调节器设置为性能模式来达到最高，还是因系统中的负载过高而达到最高，L3、LLCC 和 DDR 也以最高频率运行。

此调节器的驱动程序存在于 `drivers/cpufreq/qcom-cpufreq-hw.c` 文件中，静态映射存在于 `arch/arm64/boot/dts/qcom/sc7280.dtsi` 文件中。

另一个带宽监测 (BWMON) 调节器用于根据 CPU 与 LLCC 和 CPU 与 DDR 之间的流量检测，对 LLCC 和 DDR 的频率进行投票。此调节器的驱动程序位于 `drivers/soc/qcom/icc-bwmon.c` 文件中。

## 虚拟化

Source: [https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html)

虚拟化使用软件在计算机硬件上创建抽象层。

抽象层支持将单台计算机的硬件元素（例如处理器、内存和存储设备）分割成多个虚拟计算机，即虚拟机 (VM)。每个虚拟机都运行自己的操作系统 (OS)，工作方式类似于独立计算机，尽管它们都运行在同一底层计算机硬件上。

Figure : 虚拟化
            ![](data:image/png;base64,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)

### Qualcomm 虚拟化解决方案

Source: [https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html)

Qualcomm 使用的是 Gunyah (Type-1 Hypervisor)，旨在实现强大的安全性、高性能、操作系统独立性和更高的 CPU 权限层级。

Gunyah 不依赖任何低权限的操作系统内核或代码来实现其核心功能，提升了系统的安全性。Gunyah 专为隔离的虚拟机用例而设计，并且支持从相对不太可信的主机虚拟机启动隔离的虚拟机。

下图显示了Qualcomm 虚拟化解决方案架构：

Figure : Qualcomm 虚拟化解决方案架构
                ![](data:image/png;base64,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)

Gunyah 提供了以下功能：

Table : Gunyah 的功能

| 功能 | 说明 |
| --- | --- |
| 线程和调度 | 调度器在物理 CPU 上调度虚拟 CPU (VCPU) 并实现 CPU 的时间共享。 |
| 内存管理 | Gunyah 跟踪其控制下的内存的所有权和使用情况。Gunyah 提供 low-level 动态内存管理 API，基于此可实现更高级别的内存捐赠、借用和共享等操作。 |
| 中断虚拟化 | Gunyah 管理直接路由到指定虚拟机的中断信号。 |
| 虚拟机间通信 | 为虚拟机间通信提供了多种不同的机制，如消息队列和门铃等。 |
| 设备虚拟化 | 通过虚拟机间通信和 virtio 原语支持设备的准虚拟化。硬件虚拟化和仿真支持 low-level 架构功能和设备，如 CPU 定时器和中断控制器等。 |
| 资源管理器 | Gunyah 支持最初拥有所有虚拟机内存和输入/输出资源的 root VM。Gunyah 资源管理器是默认捆绑的 root VM，提供 high-level 服务，包括动态虚拟机管理和安全的内存捐赠、借用和共享等。 |

[crosvm](https://chromium.googlesource.com/chromiumos/platform/crosvm) 虚拟内存监控器 (VMM) 现已支持 Gunyah 管理程序。crosvm 通过 `/dev/gunyah ` 接口与内核中的 Gunyah 虚拟机管理器交互并创建虚拟机。

下图显示了 Qualcomm 虚拟化解决方案中的块：

Figure : Qualcomm 虚拟化解决方案
                ![](data:image/png;base64,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)

有关 Type-1 Hypervisor 的详细信息，参见 [guyah-hypervisor](https://github.com/quic/gunyah-hypervisor)。

### Guest VM 编译支持

Source: [https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html)

按照以下步骤编译 guest VM 内核和 initrd 镜像。

在 guest VM 内核编译期间，会同时编译 guest VM 内核和最小的 `rootfs`。`qcom_vm_defconfig` 用作 guest VM 内核编译的基础配置。`qcom_vm_debug.config` 编译 guest VM 的调试版本。

`crosvm` 作为 VMM，通过 `/dev/gunyah` 接口与内核中的 Gunyah 虚拟机管理器交互并创建虚拟机 (VM)。

**编译 guest VM**
有关 `crosvm` 支持的详细信息，参见[辅助虚拟机](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-27Y/platform_software_features.html#sub$secondary_virtual_machine)。

编译过程完成后，将生成某些镜像。这些镜像将存储在 `<workspace>/build-qcom-wayland/tmp-glibc/deploy/images/qcm6490/qcom-console-image` 目录下。

使用以下命令编译 guest VM：

    $ export SHELL=/bin/bash && MACHINE=qcm6490 DISTRO=qcom-wayland source setup-environment
    
    $ bitbake qcom-console-imageCopy to clipboard

**Guest VM initrd 镜像**

- `Svm-initramfs-qcom-image-qcm6490.cpio.gz` 文件是为 guest VM 创建的。该镜像包含一个在启动过程中使用的 initrd 镜像。
- `svm-initramfs-qcom-image-qcm6490.cpio.gz` 文件在 `build-qcom-wayland/tmp-glibc/deploy/images/qcm6490/svm-initramfs-qcom-image` 目录下生成。
- 在已启动的设备上，该镜像存储在系统 rootfs 内的 `/var/gunyah/initrd.img` 文件中。

**Guest VM 内核镜像**

- `svm-initramfs-qcom-image-qcm6490.cpio.gz` 镜像是为辅助虚拟机 (SVM) 生成的，是 guest VM 内核镜像。
- SVM 内核镜像在 `build-qcom-wayland/tmp-glibc/deploy/images/qcm6490/linux-svm-kernel-qcom` 目录下生成。
- 在已启动的设备上，该镜像位于系统 rootfs 内的 `/var/gunyah/Image` 文件中。

`initrd.img` 和 SVM 内核镜像均已打包在 `system.img` 文件中。最终的 `system.img` 文件与其他镜像均位于同一目录下：`<workspace> /build-qcom-wayland/tmp-glibc/deploy/images/qcm6490/qcom-console-image`。

### 启动 guest VM

Source: [https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html)

使用 `crosvm` VMM 和 Gunyah hypervisor 去启动 guest VM。

使用以下命令启动虚拟机：

    # /usr/bin/crosvm --log-level=debug --no-syslog run --disable-sandbox --hypervisor \
                                                gunyah --protected-vm-without-firmware \
                                                --serial=type=stdout,hardware=virtio-console,console,stdin,num=1 \
                                                --serial=type=stdout,hardware=serial,earlycon,num=1 \
                                                --initrd /var/gunyah/initrd.img --no-balloon --no-rng \
                                                --params "rw root=/dev/ram earlyprintk=serial panic=0" \
                                                /var/gunyah/ImageCopy to clipboard

下表列出了启动 guest VM 的 `crosvm` 命令支持的参数。

Table : 支持的参数

| 参数 | 说明 |
| --- | --- |
| /usr/bin/crosvmCopy to clipboard | 显示 `crosvm` 二进制文件的路径。 |
| --log-level=debugCopy to clipboard | 在运行 `crosvm` 时将日志级别设置为“调试”级别。 |
| --no-syslogCopy to clipboard | 禁用 syslog。 |
| --disable-sandboxCopy to clipboard | 禁用 sandboxing。 |
| --hypervisor gunyahCopy to clipboard | 指定要使用的 hypervisor（在本例中为 `guyah`）。 |
| --protected-vm-without-firmwareCopy to clipboard | 指示虚拟机已受到保护，不需要固件。 |
| --serial=...Copy to clipboard | 配置串行设备，以进行输入/输出操作。 |
| --initrd /var/gunyah/initrd.imgCopy to clipboard | 指定初始 RAM 磁盘 (initrd) 镜像。 |
| --no-balloonCopy to clipboard | 禁用 memory ballooning。 |
| --no-rngCopy to clipboard | 禁用用于注入 guest 操作系统 entropy pool 的 entropy source。 |
| --params "..."Copy to clipboard | 指定内核命令行选项。 |
| /var/gunyah/ImageCopy to clipboard | 指定内核镜像的路径。 |

**运行虚拟机并查看启动日志**

以下代码片段所示为虚拟机日志：

    bash-5.1# cat /proc/cpuinfo
    processor       : 0
    BogoMIPS        : 38.40
    Features        : fp asimd evtstrm aes pmull sha1 crc32 atomics cpuid asimdrdm dcpop asimddp
    CPU implementer : 0x00
    CPU architecture: 8
    CPU variant     : 0x0
    CPU part        : 0x048
    CPU revision    : 0
     
    bash-5.1# cat /proc/meminfo
    MemTotal:         161656 kB
    MemFree:          124940 kB
    MemAvailable:     124032 kB
    Buffers:               0 kB
    Cached:            19816 kB
    SwapCached:            0 kB
    Active:               12 kBCopy to clipboard

以下代码片段所示为启动日志：

    [2022-04-28T17:43:03.290477745+00:00 DEBUG crosvm::crosvm::sys::linux] creating hypervisor: Gunyah { device: None }
    [    0.000000] Booting Linux on physical CPU 0x0000000000 [0x000f0480]
    [    0.000000] Linux version 6.6.0 (oe-user@oe-host) (aarch64-qcom-linux-gcc (GCC) 11.4.0, GNU ld (GNU Binutils) 2.38.20220708) #1 SMP PREEMPT Wed Feb  7 04:56:59 UTC 2024
    [    0.000000] KASLR enabled
    [    0.000000] random: crng init done
    [    0.000000] Machine model: linux,dummy-virt
    [    0.000000] earlycon: uart8250 at MMIO 0x00000000000003f8 (options '')
    [    0.000000] printk: bootconsole [uart8250] enabled
    [    0.000000] efi: UEFI not found.
    [    0.000000] software IO TLB: Reserved memory: created restricted DMA pool at 0x0000000090000000, size 64 MiB
    [    0.000000] OF: reserved mem: initialized node restricted_dma_reserved@90000000, compatible id restricted-dma-pool
    [    0.000000] OF: reserved mem: 0x0000000090000000..0x0000000093ffffff (65536 KiB) map non-reusable restricted_dma_reserved@90000000
    [    0.000000] NUMA: No NUMA configuration found
    [    0.000000] NUMA: Faking a node at [mem 0x0000000080000000-0x0000000093ffffff]
    [    0.000000] NUMA: NODE_DATA [mem 0x8ff509c0-0x8ff52fff]
    [    0.000000] Zone ranges:
    [    0.000000]   DMA      [mem 0x0000000080000000-0x0000000093ffffff]
    [    0.000000]   DMA32    empty
    [    0.000000]   Normal   empty
    [    0.000000] Movable zone start for each node
    [    0.000000] Early memory node ranges
    [    0.000000]   node   0: [mem 0x0000000080000000-0x0000000093ffffff]
    [    0.000000] Initmem setup node 0 [mem 0x0000000080000000-0x0000000093ffffff]
    [    0.000000] On node 0, zone DMA: 16384 pages in unavailable ranges
    [    0.000000] cma: Reserved 32 MiB at 0x000000008d600000 on node -1
    [    0.000000] psci: probing for conduit method from DT.
    [    0.000000] psci: PSCIv1.1 detected in firmware.
    [    0.000000] psci: Using standard PSCI v0.2 function IDs
    [    0.000000] psci: MIGRATE_INFO_TYPE not supported.
    [    0.000000] psci: SMC Calling Convention v1.3
    [    0.000000] percpu: Embedded 31 pages/cpu s86568 r8192 d32216 u126976
    [    0.000000] Detected PIPT I-cache on CPU0
    [    0.000000] CPU features: detected: GIC system register CPU interface
    [    0.000000] CPU features: detected: Spectre-v4
    [    0.000000] CPU features: kernel page table isolation forced ON by KASLR
    [    0.000000] CPU features: detected: Kernel page table isolation (KPTI)
    [    0.000000] alternatives: applying boot alternatives
    [    0.000000] Kernel command line: panic=-1 console=hvc0 earlycon=uart8250,mmio,0x3f8 rw root=/dev/ram earlyprintk=serial panic=0
    [    0.000000] Unknown kernel command line parameters "earlyprintk=serial", will be passed to user space.
    [    0.000000] Dentry cache hash table entries: 65536 (order: 7, 524288 bytes, linear)
    [    0.000000] Inode-cache hash table entries: 32768 (order: 6, 262144 bytes, linear)
    [    0.000000] Fallback order for Node 0: 0
    [    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 80640
    [    0.000000] Policy zone: DMA
    [    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
    [    0.000000] software IO TLB: area num 1.
    [    0.000000] software IO TLB: mapped [mem 0x0000000089600000-0x000000008d600000] (64MB)
    [    0.000000] Memory: 116344K/327680K available (14528K kernel code, 3938K rwdata, 7112K rodata, 6080K init, 571K bss, 178568K reserved, 32768K cma-reserved)
    [    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
    [    0.000000] trace event string verifier disabled
    [    0.000000] rcu: Preemptible hierarchical RCU implementation.
    [    0.000000] rcu:     RCU event tracing is enabled.
    [    0.000000] rcu:     RCU restricting CPUs from NR_CPUS=256 to nr_cpu_ids=1.
    [    0.000000]  Trampoline variant of Tasks RCU enabled.
    [    0.000000]  Tracing variant of Tasks RCU enabled.
    [    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
    [    0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=1
    [    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
    [    0.000000] GICv3: 988 SPIs implemented
    [    0.000000] GICv3: 0 Extended SPIs implemented
    [    0.000000] Root IRQ handler: gic_handle_irq
    [    0.000000] GICv3: GICv3 features: 16 PPIs
    [    0.000000] GICv3: CPU0: found redistributor 0 region 0:0x000000003ffd0000
    [    0.000000] rcu: srcu_init: Setting srcu_struct sizes based on contention.
    [    0.000000] arch_timer: cp15 timer(s) running at 19.20MHz (virt).
    [    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x46d987e47, max_idle_ns: 440795202767 ns
    [    0.000000] sched_clock: 56 bits at 19MHz, resolution 52ns, wraps every 4398046511078ns
    [    0.002616] arm-pv: using stolen time PV
    [    0.003945] Console: colour dummy device 80x25
    [    0.005300] Calibrating delay loop (skipped), value calculated using timer frequency.. 38.40 BogoMIPS (lpj=76800)
    [    0.008475] pid_max: default: 32768 minimum: 301
    [    0.009923] LSM: initializing lsm=capability,selinux,integrity
    [    0.011702] SELinux:  Initializing.
    [    0.012884] Mount-cache hash table entries: 1024 (order: 1, 8192 bytes, linear)
    [    0.015180] Mountpoint-cache hash table entries: 1024 (order: 1, 8192 bytes, linear)
    [    0.017809] cacheinfo: Unable to detect cache hierarchy for CPU 0
    [    0.019820] RCU Tasks: Setting shift to 0 and lim to 1 rcu_task_cb_adjust=1.
    [    0.022107] RCU Tasks Trace: Setting shift to 0 and lim to 1 rcu_task_cb_adjust=1.
    [    0.024472] rcu: Hierarchical SRCU implementation.
    [    0.025891] rcu:     Max phase no-delay instances is 1000.
    [    0.027767] EFI services will not be available.
    [    0.029190] smp: Bringing up secondary CPUs ...
    [    0.030713] smp: Brought up 1 node, 1 CPU
    [    0.032002] SMP: Total of 1 processors activated.
    [    0.033471] CPU features: detected: 32-bit EL0 Support
    [    0.035048] CPU features: detected: Data cache clean to the PoU not required for I/D coherence
    [    0.037742] CPU features: detected: Common not Private translations
    [    0.039678] CPU features: detected: CRC32 instructions
    [    0.041275] CPU features: detected: LSE atomic instructions
    [    0.043105] CPU features: detected: Privileged Access Never
    [    0.044891] CPU: All CPU(s) started at EL1
    [    0.046161] alternatives: applying system-wide alternatives
    [    0.050071] devtmpfs: initialized
    [    0.051500] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
    [    0.054767] futex hash table entries: 256 (order: 2, 16384 bytes, linear)
    [    0.057122] pinctrl core: initialized pinctrl subsystem
    [    0.058872] DMI not present or invalid.
    [    0.060334] NET: Registered PF_NETLINK/PF_ROUTE protocol family
    [    0.062534] DMA: preallocated 128 KiB GFP_KERNEL pool for atomic allocations
    [    0.064964] DMA: preallocated 128 KiB GFP_KERNEL|GFP_DMA pool for atomic allocations
    [    0.067353] DMA: preallocated 128 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
    [    0.069943] audit: initializing netlink subsys (disabled)
    [    0.071632] audit: type=2000 audit(0.056:1): state=initialized audit_enabled=0 res=1
    [    0.074141] thermal_sys: Registered thermal governor 'step_wise'
    [    0.074143] thermal_sys: Registered thermal governor 'power_allocator'
    [    0.076118] cpuidle: using governor menu
    [    0.079536] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.
    [    0.081693] ASID allocator initialised with 32768 entries
    [    0.083662] Serial: AMBA PL011 UART driver
    [    0.085582] Modules: 2G module region forced by RANDOMIZE_MODULE_REGION_FULL
    [    0.087812] Modules: 0 pages in range for non-PLT usage
    [    0.087813] Modules: 516176 pages in range for PLT usage
    [    0.091914] HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
    [    0.099837] HugeTLB: 0 KiB vmemmap can be freed for a 1.00 GiB page
    [    0.101815] HugeTLB: registered 32.0 MiB page size, pre-allocated 0 pages
    [    0.107895] HugeTLB: 0 KiB vmemmap can be freed for a 32.0 MiB page
    [    0.109875] HugeTLB: registered 2.00 MiB page size, pre-allocated 0 pages
    [    0.116064] HugeTLB: 0 KiB vmemmap can be freed for a 2.00 MiB page
    [    0.118084] HugeTLB: registered 64.0 KiB page size, pre-allocated 0 pages
    [    0.124190] HugeTLB: 0 KiB vmemmap can be freed for a 64.0 KiB page
    [    0.128423] ACPI: Interpreter disabled.
    [    0.132206] iommu: Default domain type: Translated
    [    0.133734] iommu: DMA domain TLB invalidation policy: strict mode
    [    0.135749] SCSI subsystem initialized
    [    0.140957] usbcore: registered new interface driver usbfs
    [    0.142744] usbcore: registered new interface driver hub
    [    0.144353] usbcore: registered new device driver usb
    [    0.149976] pps_core: LinuxPPS API ver. 1 registered
    [    0.151488] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
    [    0.162194] PTP clock support registered
    [    0.163436] EDAC MC: Ver: 3.0.0
    [    0.164532] scmi_core: SCMI protocol bus registered
    [    0.166176] FPGA manager framework
    [    0.171350] Advanced Linux Sound Architecture Driver Initialized.
    [    0.173213] vgaarb: loaded
    [    0.174176] clocksource: Switched to clocksource arch_sys_counter
    [    0.235827] VFS: Disk quotas dquot_6.6.0
    [    0.237108] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
    [    0.239428] pnp: PnP ACPI: disabled
    [    0.241483] NET: Registered PF_INET protocol family
    [    0.243293] IP idents hash table entries: 8192 (order: 4, 65536 bytes, linear)
    [    0.245817] tcp_listen_portaddr_hash hash table entries: 256 (order: 0, 4096 bytes, linear)
    [    0.248604] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
    [    0.251034] TCP established hash table entries: 4096 (order: 3, 32768 bytes, linear)
    [    0.253323] TCP bind hash table entries: 4096 (order: 5, 131072 bytes, linear)
    [    0.255664] TCP: Hash tables configured (established 4096 bind 4096)
    [    0.257584] UDP hash table entries: 256 (order: 1, 8192 bytes, linear)
    [    0.259650] UDP-Lite hash table entries: 256 (order: 1, 8192 bytes, linear)
    [    0.261768] NET: Registered PF_UNIX/PF_LOCAL protocol family
    [    0.263829] RPC: Registered named UNIX socket transport module.
    [    0.265673] RPC: Registered udp transport module.
    [    0.267186] RPC: Registered tcp transport module.
    [    0.268641] RPC: Registered tcp-with-tls transport module.
    [    0.270380] RPC: Registered tcp NFSv4.1 backchannel transport module.
    [    0.272421] PCI: CLS 0 bytes, default 64
    [    0.273680] Unpacking initramfs...
    [    0.278241] kvm [1]: HYP mode not available
    [    0.279783] Initialise system trusted keyrings
    [    0.286209] workingset: timestamp_bits=42 max_order=16 bucket_order=0
    [    0.288474] squashfs: version 4.0 (2009/01/31) Phillip Lougher
    [    0.294313] NFS: Registering the id_resolver key type
    [    0.295881] Key type id_resolver registered
    [    0.297197] Key type id_legacy registered
    [    0.302225] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
    [    0.304407] nfs4flexfilelayout_init: NFSv4 Flexfile Layout Driver Registering...
    [    0.310289] 9p: Installing v9fs 9p2000 file system support
    [    0.320607] NET: Registered PF_ALG protocol family
    [    0.322022] Key type asymmetric registered
    [    0.330205] Asymmetric key parser 'x509' registered
    [    0.331833] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 245)
    [    0.334140] io scheduler mq-deadline registered
    [    0.342201] io scheduler kyber registered
    [    0.343459] io scheduler bfq registered
    [    0.353648] pci-host-generic 10000.pci: assigned reserved memory node restricted_dma_reserved@90000000
    [    0.362220] pci-host-generic 10000.pci: host bridge /pci ranges:
    [    0.364055] pci-host-generic 10000.pci:      MEM 0x0002000000..0x0003ffffff -> 0x0002000000
    [    0.370193] pci-host-generic 10000.pci:      MEM 0x0094800000..0xffffffffff -> 0x0094800000
    [    0.372927] pci-host-generic 10000.pci: Memory resource size exceeds max for 32 bits
    [    0.382221] PCI: OF: PROBE_ONLY enabled
    [    0.383535] pci-host-generic 10000.pci: ECAM at [mem 0x00010000-0x0100ffff] for [bus 00]
    [    0.386134] pci-host-generic 10000.pci: PCI host bridge to bus 0000:00
    [    0.394279] pci_bus 0000:00: root bus resource [bus 00]
    [    0.395912] pci_bus 0000:00: root bus resource [mem 0x02000000-0x03ffffff]
    [    0.397972] pci_bus 0000:00: root bus resource [mem 0x94800000-0xffffffffff]
    [    0.406329] pci 0000:00:00.0: [8086:1237] type 00 class 0x060000
    [    0.409065] pci 0000:00:01.0: [1af4:1043] type 00 class 0x00ff00
    [    0.419597] pci 0000:00:01.0: reg 0x10: [mem 0x02000000-0x02007fff]
    [    0.425686] Freeing initrd memory: 6464K
    [    0.428105] pci 0000:00:01.0: PME# supported from D0 D3hot D3cold
    [    0.430575] pci 0000:00:02.0: [1b36:0011] type 00 class 0xffff00
    [    0.432661] pci 0000:00:02.0: reg 0x10: [mem 0x02008000-0x0200800f]
    [    0.436076] pci 0000:00:00.0: Limiting direct PCI/PCI transfers
    [    0.438471] virtio-pci 0000:00:01.0: assigned reserved memory node restricted_dma_reserved@90000000
    [    0.443123] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
    [    0.445534] 2e8.U6_16550A: ttyS0 at MMIO 0x2e8 (irq = 14, base_baud = 115200) is a 16550A
    [    0.448422] 2f8.U6_16550A: ttyS1 at MMIO 0x2f8 (irq = 14, base_baud = 115200) is a 16550A
    [    0.451159] 3e8.U6_16550A: ttyS2 at MMIO 0x3e8 (irq = 15, base_baud = 115200) is a 16550A
    [    0.453983] 3f8.U6_16550A: ttyS3 at MMIO 0x3f8 (irq = 15, base_baud = 115200) is a 16550A
    [    0.456935] msm_serial: driver initialized
    [    0.460508] printk: console [hvc0] enabled
    [    0.461772] printk: bootconsole [uart8250] disabled
    [    0.475305] loop: module loaded
    [    0.475957] megasas: 07.725.01.00-rc1
    [    0.476374] tun: Universal TUN/TAP device driver, 1.6
    [    0.477187] VFIO - User Level meta-driver version: 0.3
    [    0.477691] usbcore: registered new interface driver usb-storage
    [    0.478075] i2c_dev: i2c /dev entries driver
    [    0.478575] sdhci: Secure Digital Host Controller Interface driver
    [    0.479311] sdhci: Copyright(c) Pierre Ossman
    [    0.479612] sdhci-pltfm: SDHCI platform and OF driver helper
    [    0.479932] ledtrig-cpu: registered to indicate activity on CPUs
    [    0.480343] SMCCC: SOC_ID: ARCH_SOC_ID not implemented, skipping ....
    [    0.480864] usbcore: registered new interface driver usbhid
    [    0.481329] usbhid: USB HID core driver
    [    0.482042] NET: Registered PF_PACKET protocol family
    [    0.482342] 9pnet: Installing 9P2000 support
    [    0.482635] Key type dns_resolver registered
    [    0.484383] registered taskstats version 1
    [    0.484775] Loading compiled-in X.509 certificates
    [    0.486896] page_owner is disabled
    [    0.487629] Key type .fscrypt registered
    [    0.487943] Key type fscrypt-provisioning registered
    [    0.488391] clk: Disabling unused clocks
    [    0.488759] ALSA device list:
    [    0.489050]   No soundcards found.
    [    0.490311] Freeing unused kernel memory: 6080K
    [    0.498264] Run /init as init process
    Starting version 250.5+
    bash: cannot set terminal process group (-1): Inappropriate ioctl for device
    bash: no job control in this shell
    bash-5.1#Copy to clipboard

**启动具有 2 个 CPU 和默认 RAM 的虚拟机**

启动虚拟机：若要启动具有两个 CPU 的 guest VM，使用 `--cpus num-cores=2` 参数：

    #/usr/bin/crosvm --log-level=debug --no-syslog run --disable-sandbox --hypervisor \
                                               gunyah --protected-vm-without-firmware \
                                               --cpus num-cores=2 \
                                               --serial=type=stdout,hardware=virtio-console,console,stdin,num=1 \
                                               --serial=type=stdout,hardware=serial,earlycon,num=1 \
                                               --initrd /var/gunyah/initrd.img --no-balloon --no-rng \
                                               --params "rw root=/dev/ram earlyprintk=serial panic=0" \
                                               /var/gunyah/ImageCopy to clipboard

以下代码片段所示为虚拟机日志：

    bash-5.1# cat /proc/cpuinfo
    processor       : 0
    BogoMIPS        : 38.40
    Features        : fp asimd evtstrm aes pmull sha1 crc32 atomics cpuid asimdrdm dcpop asimddp
    CPU implementer : 0x00
    CPU architecture: 8
    CPU variant     : 0x0
    CPU part        : 0x048
    CPU revision    : 0
     
    processor       : 1
    BogoMIPS        : 38.40
    Features        : fp asimd evtstrm aes pmull sha1 crc32 atomics cpuid asimdrdm dcpop asimddp
    CPU implementer : 0x00
    CPU architecture: 8
    CPU variant     : 0x0
    CPU part        : 0x048
    CPU revision    : 0
     
    bash-5.1# cat /proc/meminfo
    MemTotal:         161656 kB
    MemFree:          124940 kB
    MemAvailable:     124032 kB
    Buffers:               0 kB
    Cached:            19816 kB
    SwapCached:            0 kB
    Active:               12 kBCopy to clipboard

**启动具有 2 个 CPU 和 512 MB RAM 的虚拟机**

启动虚拟机：若要启动具有一个 CPU 和 512 MB RAM 的 guest VM，使用 `--cpus num-cores=1 --mem size=512` 参数。

    #/usr/bin/crosvm --log-level=debug --no-syslog run --disable-sandbox --hypervisor \
                                               gunyah --protected-vm-without-firmware \
                                               --cpus num-cores=2 --mem size=512      \
                                               --serial=type=stdout,hardware=virtio-console,console,stdin,num=1 \
                                               --serial=type=stdout,hardware=serial,earlycon,num=1              \
                                               --initrd /var/gunyah/initrd.img --no-balloon --no-rng            \
                                               --params "rw root=/dev/ram earlyprintk=serial panic=0"           \
                                               /var/gunyah/ImageCopy to clipboard

以下代码片段所示为虚拟机日志：

    bash-5.1# cat /proc/cpuinfo
    processor       : 0
    BogoMIPS        : 38.40
    Features        : fp asimd evtstrm aes pmull sha1 crc32 atomics cpuid asimdrdm dcpop asimddp
    CPU implementer : 0x00
    CPU architecture: 8
    CPU variant     : 0x0
    CPU part        : 0x048
    CPU revision    : 0
     
    processor       : 1
    BogoMIPS        : 38.40
    Features        : fp asimd evtstrm aes pmull sha1 crc32 atomics cpuid asimdrdm dcpop asimddp
    CPU implementer : 0x00
    CPU architecture: 8
    CPU variant     : 0x0
    CPU part        : 0x048
    CPU revision    : 0
     
    bash-5.1# cat /proc/meminfo
    MemTotal:         418304 kB
    MemFree:          378356 kB
    MemAvailable:     376048 kB
    Buffers:               0 kB
    Cached:            20308 kB
    SwapCached:            0 kB
    Active:                0 kBCopy to clipboard

**启动具有块设备的虚拟机**

使用以下命令启动虚拟机：

    #/usr/bin/crosvm --log-level=debug --no-syslog run --disable-sandbox --hypervisor \
                                               gunyah --protected-vm-without-firmware \
                                               --block disk.img \ 
                                               --cpus num-cores=2 --mem size=256      \
                                               --serial=type=stdout,hardware=virtio-console,console,stdin,num=1 \
                                               --serial=type=stdout,hardware=serial,earlycon,num=1              \
                                               --initrd /var/gunyah/initrd.img --no-balloon --no-rng            \
                                               --params "rw root=/dev/ram earlyprintk=serial panic=0"           \
                                               /var/gunyah/ImageCopy to clipboard

- 使用 `--block` 标志指定块式设备名称（本例中为
 disk.img）。
- 这会在 guest VM 中创建 `/dev/vda, /dev/vdb` 等。

    bash-5.1# ls -al /dev/block/
    total 0
    drwxr-xr-x    2 root     root           220 Jan  1 00:00 .
    drwxr-xr-x    9 root     root          2980 Jan  1 00:00 ..
    lrwxrwxrwx    1 root     root             6 Jan  1 00:00 254:0 -> ../vda
    lrwxrwxrwx    1 root     root             8 Jan  1 00:00 7:0 -> ../loop0
    lrwxrwxrwx    1 root     root             8 Jan  1 00:00 7:1 -> ../loop1Copy to clipboard

该设备可以通过挂载命令 `mount -t ext4
 /dev/vda /mount-point` 挂载到 guest VM 中。

    bash-5.1# mkdir /data
    bash-5.1# mount -t ext4 /dev/vda /data
    [  112.311376] EXT4-fs (vda): mounted filesystem 4b577765-65ad-4fd8-910c-0eac437d8afb r/w with ordered data mode. Quota mode: none.Copy to clipboard

## 实时 (RT) 内核概述

Source: [https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html](https://docs.qualcomm.com/doc/80-70014-3Y/topic/features.html)

实时系统是一种确定性系统，该系统会在设定的时间内对事件做出响应。

在以下情况下，系统可视为实时系统：

- 没有无限的延迟。
- 最长响应时间计算地非常精确。
- 满足设置的任务调度标准（延迟和截止日期）。

Linux 系统可以视为一种实时操作系统 (RTOS)，在该系统中，实时任务具有定义明确的周期性执行周期（周期时间），并且在执行时在指定限度（抖动）内，满足执行标准。

将 Linux 视为 RTOS 时，应用 `PREEMPT_RT` 补丁并启用完全抢占内核的配置。

实时内核维护工程师负责为每个发布的内核版本维护树外 `PREEMPT_RT` 补丁。

如需安装补丁，参见 [PREEMPT_RT 补丁的版本](https://wiki.linuxfoundation.org/realtime/start)。

Note: 实时支持是为了实现内核空间进程，而非用户空间进程。

Figure : 编译顺序
                    ![](data:image/png;base64,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)

### 设置工作区

Qualcomm 内核支持 v6.6 LTS RT 内核，该内核通过 Yocto recipe 进行维护，该 recipe 位于 `meta-qcom-realtime` 层下的 `recipes-kernel/linux/linux-kernel-qcom-rt_6.6.bb` 文件中。

Qualcomm Linux 中的 Linux RT 内核 recipe 称为 `linux-kernel-qcom-rt` 。

有关克隆工作区并获取使用 Qualcomm RT Linux 所需的所有元数据层的详细信息，参见[如何与实时 Linux 同步并进行编译？](https://docs.qualcomm.com/bundle/publicresource/topics/80-70014-254Y/how_to.html#how-to-sync-and-build-with-real-time-linux-)

### 启用实时内核

Qualcomm Linux `meta-qcom-realtime` 层支持 `linux-kernel-qcom-rt` recipe，该 recipe 在默认情况下会获取和编译适用于支持的机器的 Linux 内核。

`meta-qcom-realtime` 层会在现有层基础上应用更改。在内核编译过程中，`meta-qcom-hwe`, `meta-qcom-realtime` 层会根据内核版本，添加上游 `PREEMPT_RT` 补丁，并启用实时配置。

    require recipes-kernel/linux/linux-kernel-qcom_6.6.bb
     
    SECTION = "RT kernel"
    SUMMARY = "Linux Real time kernel for QCOM devices"
    DESCRIPTION = "Recipe to build real time Linux kernel"
     
    SRC_URI:append = "https://cdn.kernel.org/pub/linux/kernel/projects/rt/6.6/older/patch-6.6.14-rt21.patch.gz;md5sum=91969a704a73aa918c89d3027bdd3634 \
                     file://qcom_rt.cfg \
                     file://0001-arch-Kconfig-Add-RT-kernel-support.patch \
                     
    S = "${WORKDIR}/kernel"
    KERNEL_CONFIG_FRAGMENTS:append = " ${WORKDIR}/qcom_rt.cfg"Copy to clipboard

有关支持的机器的详细信息，参见[确定支持的 Qualcomm 机器](https://docs.qualcomm.com/doc/80-70014-3Y/topic/getting_started_chapter2.html#supported_machines)章节。

Note: QCS5430 不支持 RT 内核。

### 配置实时内核

按照以下步骤配置 RT 内核。

SRC_URI:append = "https://cdn.kernel.org/pub/linux/kernel/projects/rt/6.6/older/patch-6.6.14-rt21.patch.gz;md5sum=91969a704a73aa918c89d3027bdd3634 \
                     file://qcom_rt.cfg \
                     file://0001-arch-Kconfig-Add-RT-kernel-support.patch \Copy to clipboard

- 在 RT 内核上应用外部配置：
    - 维护 `meta-qcom-realtime/recipes-kernel/linux/linux-kernel-qcom-rt` recipe 中的配置文件。
    - 将配置文件添加到 `meta-qcom-realtime/recipes-kernel/linux/linux-kernel-qcom_6.6.bb` 文件中的 `KERNEL_CONFIG_FRAGMENTS`。
- 向 RT 内核添加配置文件：

        KERNEL_CONFIG_FRAGMENTS:append = " ${WORKDIR}/qcom_rt.cfg"
        Copy to clipboard
- 若要修改内核命令行，可在 `conf/layer.conf` 文件中添加内核命令行
- 以下示例说明如何修改命令行：

        KERNEL_CMDLINE_EXTRA = "root=/dev/disk/by-partlabel/system rw rootwait console=ttyMSM0,115200n8 pcie_pme=nomsi earlycon idle=poll skew_tick=1 rcu_nocbs=1-3 rcu_nocb_poll nohz_full=1-3 irqaffinity=4-7 isolcpus=1-3"
        Copy to clipboard

### 内核配置

RT 内核中使用了可选和必选内核配置。

使用 `CONFIG_PREEMPT_RT` 在 RT 内核中启用完全抢占。

`CONFIG_PREEMPT_RT` 在 `linux-kernel-qcom-rt_6.6.bb` recipe 中默认启用

以下示例展示了内核配置：

    # CONFIG_PREEMPT_RT
    $ zcat proc/config.gz | grep CONFIG_PREEMPT
    # CONFIG_PREEMPT_NONE is not set
    # CONFIG_PREEMPT_VOLUNTARY is not set
    # CONFIG_PREEMPT is not set
    CONFIG_PREEMPT_RT=yCopy to clipboard

使用以下配置优化 RT 内核响应：

    # CONFIG_NO_HZ
    $ zcat proc/config.gz | grep NO_HZ
    CONFIG_NO_HZ_COMMON=y
    # CONFIG_NO_HZ_IDLE is not set
    CONFIG_NO_HZ_FULL=y
    # CONFIG_NO_HZ is not set
      
    #CONFIG_CPUSETS
    $ zcat proc/config.gz | grep CPUSETS
    CONFIG_CPUSETS=yCopy to clipboard

在绑定 RT 任务时，设置以下内核配置选项：

- `CONFIG_NO_HZ_FULL` - 启用后，会将内核配置为避免向具有单个可运行任务的 CPU 发送调度时钟中断信号。
- `CONFIG_CPUSETS` - `CONFIG_CPUSETS` 配置选项用于启用 `cpuset`，在这种情况下，会对 CPU 进行分组，形成集合。

将 RT 任务绑定到一组 CPU 时，使用 `CONFIG_CPUSETS` 配置选项。

Figure : RT 内核验证
                ![](data:image/png;base64,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)

### 编译实时内核

使用以下命令编译 RT 内核：

$ MACHINE=qcm6490 DISTRO=qcom-wayland source setup-environment
     
    #verify realtime layer is present
     
    $ bitbake-layers show-layers | grep realtime
        meta-qcom-realtime    /layers/meta-qcom-realtime  12
     
    # compile
    $ bitbake qcom-console-imageCopy to clipboard

### 测试实时内核

测试套件包含在 Linux 基金会的 RT 测试套件中。

周期性测试可确定 RT 应用在最好和最坏情况下的延迟。

如需获取 RT 测试套件源代码，可访问 [rt-tests/rt-tests.git](https://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git/)。

若要将 RT 测试套件包括在镜像中，可更改标准 Yocto 编译版本中的 `layer.conf`文件：

    IMAGE_INSTALL:append = "rt-tests numactl"Copy to clipboard

运行以下周期性测试：

    $ cgexec -g cpuset:core1-3 cyclictest -a 1-3 -t 3 -m -l 100000000 -i 1000 -p 99 -h 800Copy to clipboard

有关 RT 测试的详细信息，参见 [RT-Tests](https://wiki.linuxfoundation.org/realtime/documentation/howto/tools/rt-tests)。

### 调试 RT 内核

以下列出了排查和解决 RT 内核中问题的方法：

- 如何验证底层内核是实时内核？
启动完成后，运行以下命令来验证内核类型：

        $ uname -r
        6.6-rt15
        $ uname -v
        SMP PREMPT_RTCopy to clipboard
- 如何使驱动程序符合 RT 要求？
    确保同步原语不会破坏 RT 假设。

以下示例说明了可能会破坏 RT 假设并导致系统行为异常的场景：

         /* Acquiring a preemptible lock in non preemptible context */
        
        preempt_disable( ) 
        ……
        spin_lock( )
        
         /* Acquiring a preemptible lock in non preemptible context /
        
        raw_spin_lock( )
          ……
        spin_lock( )
        
         /* Acquiring a non preemptible lock in preemptible context /
        
        local_lock_irq( )
           …..
        raw_spin_lock( )Copy to clipboard
- 调试 RT 内核配置
以下所列为 RT 内核的调试配置：
    - `CONFIG_DEBUG_ATOMIC_SLEEP` - 检查是否在原子部分内执行睡眠操作。
    - `CONFIG_PROVE_RAW_LOCK_NESTING` - 启用 `raw_spinlock` 与自旋锁嵌套关系检查，以确保不会违反已启用 `PREEMPT_RT` 的内核的锁定嵌套规则。
        在调试时，可以从 RT 内核切换到非 RT 内核。若要切换，可更改 `layer.conf` 文件，将 virtual/kernel 设置更改为 `linux-kernel-qcom`，然后重新编译。

运行以下命令，执行更改：

            - PREFERRED_PROVIDER_virtual/kernel = "linux-kernel-qcom-rt"
            + PREFERRED_PROVIDER_virtual/kernel = "linux-kernel-qcom"Copy to clipboard

有关 RT 内核锁定原语的详细信息，参见[锁定类型及其规则 - Linux 内核文档](https://www.kernel.org/doc/html/latest/locking/locktypes.html)。

### 调整 RT 内核

调整 RT 内核，使设备中的 RT 任务达到确定性延迟。

运行 RT 任务的 CPU 内核必须设置为以最高工作频率运行，同时防止因温度过高而降低 CPU 频率。例如，在空闲休眠场景中，RT 任务会因 CPU 唤醒存在时间延迟而面临调度延迟。

对于具有 8 个 CPU 核心的系统，使用以下系统配置。
- 以下示例中所述的 RT 任务绑定至核心 1-3。
- CPU 核心 1-3 以隔离模式运行，所有读-写-更新 (RCU) 操作都绑定至核心 4-7。
- IRQ 在内核命令行参数中绑定至核心 4-7。
- CPU 核心 1-3 禁用系统休眠，并设置为以最高频率运行。

        # Disable low power mode and sleep for CPU 1-3
        $ echo 1 > /sys/devices/system/cpu/cpu1/cpuidle/state2/disable
        $ echo 1 > /sys/devices/system/cpu/cpu1/cpuidle/state1/disable
        $ echo 1 > /sys/devices/system/cpu/cpu1/cpuidle/state0/disable
        $ echo 1 > /sys/devices/system/cpu/cpu2/cpuidle/state0/disable
        $ echo 1 > /sys/devices/system/cpu/cpu2/cpuidle/state1/disable
        $ echo 1 > /sys/devices/system/cpu/cpu2/cpuidle/state2/disable
        $ echo 1 > /sys/devices/system/cpu/cpu3/cpuidle/state2/disable
        $ echo 1 > /sys/devices/system/cpu/cpu3/cpuidle/state1/disable
        $ echo 1 > /sys/devices/system/cpu/cpu3/cpuidle/state0/disable
         
        # Enable max freq for cpu group 0-3
        $ echo 1958400 > /sys/devices/system/cpu/cpufreq/policy0/scaling_min_freq
         
        $ echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
         
        # form cgroup for core 0-3
        $ mkdir /sys/fs/cgroup/cpuset/core0/
        $ mkdir /sys/fs/cgroup/cpuset/core1/
        $ mkdir /sys/fs/cgroup/cpuset/core2/
        $ mkdir /sys/fs/cgroup/cpuset/core3/
         
        $ echo 0 > /sys/fs/cgroup/cpuset/core0/cpuset.mems
        $ echo 0 > /sys/fs/cgroup/cpuset/core1/cpuset.mems
        $ echo 0 > /sys/fs/cgroup/cpuset/core2/cpuset.mems
        $ echo 0 > /sys/fs/cgroup/cpuset/core3/cpuset.mems
         
        $ echo 0 > /sys/fs/cgroup/cpuset/core0/cpuset.cpus
        $ echo 1 > /sys/fs/cgroup/cpuset/core1/cpuset.cpus
        $ echo 2 > /sys/fs/cgroup/cpuset/core2/cpuset.cpus
        $ echo 3 > /sys/fs/cgroup/cpuset/core3/cpuset.cpus
         
        $ mkdir /sys/fs/cgroup/cpuset/core1-3/
        $ echo 0 > /sys/fs/cgroup/cpuset/core1-3/cpuset.mems
        $ echo 1-3 > /sys/fs/cgroup/cpuset/core1-3/cpuset.cpusCopy to clipboard

以下示例说明如何在 `layer.conf`中添加内核命令行参数，确保不执行 RCU 回调：
- CPU 核心 1-3
- IRQ 绑定至核心 4-7
- 隔离 CPU 1-3

    KERNEL_CMDLINE_EXTRA = "root=/dev/disk/by-partlabel/system rw rootwait console=ttyMSM0,115200n8 pcie_pme=nomsi earlycon skew_tick=1 rcu_nocbs=1-3 rcu_nocb_poll nohz_full=1-3 irqaffinity=4-7 isolcpus=1-3"
    Copy to clipboard

Last Published: Aug 22, 2024

[Previous Topic
入门指南](https://docs.qualcomm.com/bundle/publicresource/80-70014-3Y/topics/getting_started_chapter2.md) [Next Topic
Yocto 支持](https://docs.qualcomm.com/bundle/publicresource/80-70014-3Y/topics/yocto-kernel-support.md)