# 内核功能

Qualcomm^®^ Linux^®^ 内核提供以下与 Qualcomm 平台上的主线 Linux 内核相关的关键功能和改进：

- Qualcomm Linux BSP 专为支持使用 Qualcomm 平台的设备而量身定制。
- 设备树与 Qualcomm Linux 开发套件相对应。
- 提供多种定制编译版本配置以满足您的要求。
- Qualcomm Linux 内核集成到 Yocto 编译系统中。
- Qualcomm Linux 内核与上游 LTS 内核保持一致。增加的 Qualcomm 特定配置将单独维护。
- 支持配置、定制和编译可在使用 Qualcomm 硬件 SoC 产品的设备上刷写和启动的内核镜像。
- 使用 Gunyah™ Hypervisor 软件支持不受信虚拟机的虚拟化。
- 定期 LTS 从相应的 LTS 内核分支合并以获取最新的安全性和稳定性修复。

## UEFI 启动管理器

Qualcomm Linux 支持 systemd-boot 作为通用可扩展固件接口 (UEFI) 启动管理器来加载和启动 Linux 内核。在这种情况下，Qualcomm Linux 内核是作为 EFI 存根编译的。

### 启动流程和架构概述

冷启动是指从关机状态启动系统的过程。冷启动过程包括以下步骤：

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

有关完整冷启动流程的更多信息，请参阅 [Qualcomm Linux 启动指南](bundle/publicresource/topics/80-70018-4)中的[冷启动架构](https://docs.qualcomm.com/bundle/publicresource/topics/80-70018-4/bootloader-architecture.html)。

### Systemd-boot

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

- 启动条目：类型 1 boot loader 规范条目位于 ESP 上的 `loader/entries/` 目录。这些文件描述了 Qualcomm Linux 内核镜像及其相关的 initrd 镜像和其他 EFI 可执行文件。
- UKI：类型 2 boot loader 规范 EFI 统一内核镜像是位于 ESP 上的 `/EFI/Linux/` 目录中的可执行 EFI 二进制文件。

    有关启动项和统一内核镜像的更多信息，参见 [BootLoader Specification](https://uapi-group.org/specifications/specs/boot_loader_specification)。

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

有关 systemd-boot 的更多信息，请参阅[使用 systemd-boot 和 UKI 配置和安全启动](https://docs.qualcomm.com/bundle/publicresource/topics/80-70018-27/qualcomm_linux_software_components.html#configure-and-secure-boot-with-systemd-boot-and-uki)。

### Qualcomm Linux 内核作为 EFI stub

EFI boot stub 允许直接启动 Qualcomm Linux 内核，而无需传统的 EFI boot loader。

当使用 `CONFIG_EFI_STUB` 内核配置选项编译 Qualcomm Linux 内核时，启动固件可以将 EFI 镜像作为可执行文件加载。在这种情况下，固件加载程序导航到 EFI 镜像 `drivers/firmware/efi/libstub/` 中的 `EFI boot stub` 位置以启动内核。

对于 Arm^®^ (Arm64)，在没有压缩内核支持的情况下，内核镜像作为可移植可执行 (PE) 文件格式或通用目标文件格式 (COFF) 镜像运行，并且 EFI 存根链接到内核中。

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

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

ESP 或启动分区作为打包 systemd-boot 和 UKI 的 `efi.bin` 镜像的存储位置。UKI 包括内核镜像、initramfs 和内核命令行参数。

UEFI 固件用于启动 UEFI boot loader 并加载内核启动镜像。ESP 分区使用 UEFI 规范支持的文件分配表 (FAT) 文件系统进行格式化。有关 UKI 镜像格式以及基础 Qualcomm Linux 元层中相应支持的更多信息，请参阅 [systemd-boot](https://docs.qualcomm.com/bundle/publicresource/topics/80-70015-27/platform_software_features.html#systemd-boot)。

### DTB 的选择

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

要了解启动时 DTB 选择，可参见[平台设备树和内核配置](https://docs.qualcomm.com/doc/80-70018-3SC/topic/customize.html#platform-support-0)。

## 配置 DTB 支持

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

### 平台设备树

Qualcomm Linux 支持设备树叠加功能，以维护设备外树 blob 并将其与基线设备树 blob 合并。SoC 设备树支持存在于 `arch/arm64/boot/dts/qcom` 目录中的内核源代码中。

Qualcomm 设备树源文件列出了设备树，并进行明确区分，以包含下游增加的配置，同时支持与上游对齐的基本配置。

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

下图显示了 QCS6490 上设备树叠加的编译过程以及自定义 BSP 的 DTB 生成：

Note

- 基本 BSP 遵循相同的编译过程，不包含 **addons** 下游设备树文件。
- 对于 DT 叠加 和 DTB 生成，所有支持的 Qualcomm 硬件 SoC 都遵循相同的编译流程。

![../_images/device-tree.png](data:image/png;base64,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)

**图：QCS6490 上的设备树叠加**

构建系统使用 `fdt_overlay` 工具用于在构建期间配置树外设备树叠加处理。

DTBO 合并流程支持合并 `meta-qcom-hwe/conf/machine/<SoC>-<board>-<variant>.conf` 文件中列出的 DTBO 文件。

以下是如何在 QCS6490 上枚举设备树变量的示例。有关平台特定的信息，可参见电路板特定的机器配置文件。

# List of dtbs for corresponding supported qcs6490 platforms
    KERNEL_DEVICETREE = " \
                         qcom/<SoC>-addons-<Variant>.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-rb3.dtbo \
    qcm6490-display-rb3.dtbo qcm6490-bt.dtbo \
    qcm6490-video.dtbo qcm6490-wlan-upstream.dtbo \
    "
    Copy to clipboard

**DTBO 合并序列**

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

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

1. 在配置文件中列出 DTBO 文件名。
2. DTBO 文件名通过 `KERNEL_DEVICETREE` 变量进行迭代。
3. 对于每个基础 DTB，DTBO 合并任务叠加 `KERNEL_TECH_DTBOS` 变量中列出的 DTBO。
4. 叠加过程完成后，将生成最终的 DTB 输出。

### 内核配置

`linux-kernel-qcom-base_6.6.bb` 或 `linux-qcom-custom_6.6.bb` 内核配方文件使用以下配置片段来编译镜像：

例如，`linux-qcom-custom_6.6.bb` 使用以下片段来追加内核：

KERNEL_CONFIG ??= "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)}"
    
    # Enable selinux support
    SELINUX_CFG = "${@oe.utils.vartrue('DEBUG_BUILD', 'selinux_debug.cfg', 'selinux.cfg', d)}"
    KERNEL_CONFIG_FRAGMENTS:append = " ${@bb.utils.contains('DISTRO_FEATURES', 'selinux', '${WORKDIR}/${SELINUX_CFG}', '', d)}"
    Copy to clipboard

若要使用调试配置片段生成调试版本，可运行以下命令：

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

有关不同配置片段的更多信息，请参阅 [Qualcomm Linux 内核入门指南](https://docs.qualcomm.com/doc/80-70018-3SC/topic/getting_started_chapter2.html)。

## Remoteproc 子系统

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

Remoteproc 框架分为两部分：

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

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

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

### Qualcomm 对 remoteproc 的支持

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) 等。基于 QCS6490 的电路板和 RB3 Gen 2 开发套件上支持的协处理器包括 aDSP、cDSP 和 WPSS。

Note

支持的远程处理器子系统列表取决于正在使用的 SoC。

**用户界面：** 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/state
    Copy to clipboard

![../_images/remoteproc-framework.png](data:image/png;base64,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)

**图：Remoteproc 支持**

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

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

通信环境等实体必须确定远程处理器何时启动或关闭。每个子设备都有两个操作：

- `probe()`，在 remoteproc `start()` 之后调用
- `remove()`，在 `stop()` 之前调用

当远程处理器发生致命错误时，remoteproc 驱动程序会处理该错误并调用 `rproc_report_crash()`，从而触发故障远程处理器的恢复。

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

![../_images/Remoteproc-recovery.png](data:image/png;base64,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)

**图：Remoteproc 崩溃序列**

要使用用户空间中的恢复 `debugfs` 节点来启用和禁用恢复，请执行以下操作：

mount -t debugfs nodev /sys/kernel/debug
    echo disabled > /sys/kernel/debug/remoteproc/remoteprocN/recovery
    Copy to clipboard

### Coredump

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

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

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

# Disable coredumps:
      echo disabled > /sys/kernel/debug/remoteproc/remoteprocN/coredump
    
    # Enable coredumps:
      echo enabled > /sys/kernel/debug/remoteproc/remoteprocN/coredump
    #
    # N represents the index number of the remote processor.
    Copy to clipboard

Note

Qualcomm SoC 在 remoteproc 崩溃（远程处理器上的致命错误）时会触发内核 panic，以便收集完整的 RAM dump 文件，用于进行崩溃分析。内核 panic 模式只有在 coredump 处于禁用状态时才会启用。

仅当为子系统启用了核心 coredump 时才会在子系统崩溃时创建 devcoredump `/sys/class/devcoredump/devcdN/data` 节点。要启用 coredump，请运行 `echo enabled > /sys/kernel/debug/remoteproc/remoteprocN/coredump` 命令。`devcdN/data` 节点是临时的，超时后会被删除。要调试问题，请使用 `copy` 命令将 `devcdN/data` 节点复制到本地设备以便安全使用。删除超时在 `base/devcoredump.c` 中定义。

以下是复制 coredump 的示例命令：

# Copy Coredump to a local device
      cp /sys/class/devcoredump/devcdN/data > /var/spool/crash/dump_file.elf
    #
    # N represents the index of coredump. It is incremented each time a new coredump is generated.
    Copy to clipboard

要将 coredump 文件传输到主机设备并调试问题，请使用 Qualcomm Crash Analysis Portal (QCAP)。

Note

有关 QCAP 的更多信息，请参阅 [Parse RAM dumps using QCAP](https://docs.qualcomm.com/bundle/resource/topics/80-70014-12A/debugging_linux_kernel.html#parse_ram_dumps_using_qcap)。

### Remoteproc 配置和固件

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

以下示例显示了 `arch/arm64/boot/dts/qcom/qcs6490.dtsi` 文件中的 QCS6490 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

检查 `arch/arm64/boot/dts/qcom/sa8775p.dtsi` 路径中的 QCS9075 设备树配置文件。

Note

要获取所有 Qualcomm SoC 的设备树配置文件，参见相应的平台 DTSI 文件。

所有固件文件都位于 `rootfs` 中的 `/lib/firmware` 目录中并在相应板卡设备树 `arch/arm64/boot/dts/qcom/qcs6490-rb3gen2.dts` 文件中进行相关配置。对于其他 Qualcomm 硬件 SoC，请参阅 `arch/arm64/boot/dts/qcom/<SoC>-<board>.dts` 文件。

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

&remoteproc_adsp {
    firmware-name = "qcom/qcs6490/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/qcs6490/modem.mdt failed with error -2"
    
    # Caused by: error loading firmware.
    # Solution: ensure that the modem firmware is copied to /lib/firmware/qcom/qcs6490 in rootfs.
    Copy to clipboard

## 内存管理和配置

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

有关 Linux 内核内存管理的详细信息，参见 [Memory management](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/qcs6490.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

Note

对于 Qualcomm SoC ，参见 SoC 特定的 Qualcomm DTSI 文件以获取此信息。

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

[    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@86100000
    Copy to clipboard

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.c
    Copy 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-heap
    Copy to clipboard

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

### 支持的堆

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

表：默认支持的堆

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

### 使用 DMA-BUF 堆

下面是一个示例程序，演示了如何使用 Qualcomm Linux 内核创建的 DMA-BUF 系统堆 `/dev/dma_heap/system`:

include <stdio.h>
    include <stdlib.h>
    include <fcntl.h>
    include <errno.h>
    include <unistd.h>
    include <sys/ioctl.h>
    include <linux/dma-buf.h>
    #include <linux/dma-heap.h>
    
    define DMA_HEAP_NAME "system"
    define SZ_4 0x00000004  // to allocate a 4K buffer
    
    int main()
    {
    int fd, dma_buf_fd;
    
    struct dma_heap_allocation_data dma_alloc_data = {
       .len = SZ_4,
       .fd_flags = O_RDWR | O_CLOEXEC,
    };
    
    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, &dma_alloc_data);
    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;
    }
    
    if (close(dma_buf_fd)) {
       perror("close");
       return errno;
    }
    
    if (close(fd)) {
       perror("close");
       return errno;
    }
    
    return 0;
    }
    Copy to clipboard

## 调度器

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

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

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

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

### CPU 拓扑和 EAS

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

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

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

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

> 
> 
> 表：CPU 拓扑和容量
> 
> 
> | 命令 | 目的 |
> | --- | --- |
> | cat /sys/devices/system/cpu/cpu*/cpu_capacity<br>    Copy to clipboard | 获取系统中每个 CPU 的相关容量。 |
> | cat /sys/devices/system/cpu/cpufreq/policy*/related_cpus<br>    Copy to clipboard | 获取与系统中每个群集相关的 CPU 列表。 |

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

### 实体负载跟踪

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

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

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

半衰期越短，任务的 CPU 利用率累积得越快。这些任务被分配给性能 CPU，从而以更高的功耗实现更好的性能。此外，CPU 利用率也会累积起来，以便在更短的时间内选择更高的 CPU 频率。

Note

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

有关 PELT 的详细信息，参见 [Per-entity load tracking](https://lwn.net/Articles/531853/)。

### SchedUtil 调节器

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

SchedUtil CPU 频率调节器与 EAS 相关联，它试图预测所有 CPU 下一步将在哪个 OPP 下运行以估算它们的能耗。

有关更多信息，请参阅 [SchedUtil](https://www.kernel.org/doc/html/next/scheduler/schedutil.html)。

### 利用率限制 (UCLAMP)

UCLAMP 操作允许从用户空间对任务/任务组进行性能管理。

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

有关更多信息，请参阅 [UCLAMP](https://www.kernel.org/doc/html/next/scheduler/sched-util-clamp.html)。

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

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

### CPU DVFS 调节器

您可以选择一个调速器来调整系统的功率或性能，同时更改 `CPUfreq` 调节器（`powersave/performace/schedutil`）。默认情况下，在 Qualcomm Linux 内核上，将 CPU 频率调节器设置为 `performance`。

表：CPU DVFS 变量

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

有关 `CPUfreq` 的更多信息，请参阅 [CPU frequency and voltage scaling code in the Linux(TM) kernel](https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt)。

### 缓存和内存 DVFS 调节器

静态映射 DVFS 调节器将 CPU 工作频率与以下各项保持一致：

- 三级缓存 (L3)
- 最后一级缓存控制器 (LLCC)
- DDR RAM

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

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

Note

对于 Qualcomm SoC，请参阅特定于平台的 DTSI 文件以获取此信息。

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

Last Published: May 05, 2025

[Previous Topic
Qualcomm Linux 内核入门指南](https://docs.qualcomm.com/bundle/publicresource/80-70018-3SC/topics/getting_started_chapter2.md) [Next Topic
启用虚拟化](https://docs.qualcomm.com/bundle/publicresource/80-70018-3SC/topics/virtualization.md)