# 功能

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

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

## 启动

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

### 启动流程和架构

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

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

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

### Systemd-boot

Systemd-boot 是一种 UEFI 启动管理器，用于执行 EFI 镜像、提供启动项并支持统一内核镜像。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](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-27/platform_software_features.html#sub$systemd_boot)。

### 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 stub 链接到内核中。

有关将 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-70017-27/platform_software_features.html#sub$systemd_boot)。

### DTB 的选择

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

要了解启动时 DTB 选择，可参见 [平台支持](https://docs.qualcomm.com/doc/80-70017-3SC/topic/customize.html#platform-support-0)。

## 平台支持

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

### 平台设备树

Qualcomm Linux 支持设备树覆盖功能，该功能支持设备树外 blob 的维护及其与基础设备树 blob 的合并。SoC 设备树由 `arch/arm64/boot/dts/qcom` 目录下的内核源代码提供支持。

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

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

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

Note

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

![../_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. 通过 `KERNEL_DEVICETREE` 变量遍历 DTBO 文件名。
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

有关不同配置片段的详细信息，参见[入门指南](https://docs.qualcomm.com/doc/80-70017-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` 节点来启用和禁用恢复，请执行以下操作：

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

### Coredump

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

当子系统崩溃时，devcoredump 会将正在恢复的 remoteproc 的内存快照提供在 `/sys/class/devcoredump/devcdN/data` 节点中，同时将相关的崩溃 `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 处于禁用状态时才会启用。

仅当为子系统启用了核心转储时才会在子系统崩溃时创建 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.epresents the index of coredump. It is incremented each time a new coredump is generated.
    Copy to clipboard

要将 coredump 文件传输到主机并进行调试，使用 Crash Analysis Portal (QCAP) 。

Note

有关 QCAP 的更多信息，请参阅 [Parse RAM dumps using QCAP](https://docs.qualcomm.com/bundle/resource/topics/80-70017-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 内核内存管理的详细信息，参见[内存管理](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

### 连续内存分配器 (Contiguous memory allocator)

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

### DMA-BUF 堆

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 内存管理伙伴分配器。 |
| 保留堆 | /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 调度器方案。内核使用[节能调度 (EAS)](https://www.kernel.org/doc/html/next/scheduler/sched-energy.html) 功能根据 CPU 能耗选择适合放置任务的目标 CPU。

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

有关调度器的基本文档，参见[调度器](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)。

### 实体负载跟踪 (Per entity load tracking)

实体负载跟踪 (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)。

### 利用率夹紧 (Utilization clamping)

利用率夹紧（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` 的信息，请参阅 [https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt](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` 文件。

## 虚拟化

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

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

![../_images/virtualization-3.png](data:image/png;base64,UklGRogOAABXRUJQVlA4THsOAAAvYIJ0AN8Et7ZtVdXC3aEAdwspgbYpgJDIc/kf51xvw41t22pycHeo4wOAiqkwVBYToKJzp/YkEHkxx7VtK82Je0aZuWsFaTu9uJeA8//nwZv/AIZMqSCjJBXSEgkN45X5fCJkKlYs+/lGSGHjTED5JGcTocUJUmcTEfKWS4URIYERMqU8JUGKolCBoX31Fd/7F3Jx4fOzbGLcbY/4mUgud7d9OhQ+E0aES4WLCzZ27rbHJcpEjgqMu+GhDDRQxxIYD5hItDEGMkC6DziRt0i/qsQRsJdu1w0BFjDRBY+6wx0lu+7RmWkCFMAKd1RHbcV6AhYaXhcGDgDe2oAzOK3AygFgog0ujwBXnAFXVNt98LYHWHi8IywAX0eQr7fBytuLsEe+3AVvb0nsQLrcBi8iKXhKl+u2APZYwpBK8AcXBrEBUAVrUMcUcIEIxlVLYDyRmFStBgINebsKE13jiPNeB2CAOYrvoeerbb8DrMDKwwus6wPbNYxgsToTEvDWnQEe//97mzbbv0+O8zx97n12771bhDij0+5uoc1OVJSYCoK7SVH3MCTI6i6VU58DcxK5/W+Pz5Aw9iFzZCii/5IgSZLbpsYXaACqxQA7yyUp4X3gF7YrDhz4i+0KS8aff2Ov4k+UPyp7Fb+r/Kfyn30OgZs0BYV4px0KvFIY32uHBdiV49Bsu3FLqQaTC9z+SFFiGZr/BiD+MDTdHw2IGCm850m8+EVzzEi1l+/RYxDMwGhRXhnqOYCx3jQcPYcdR9+LW3Iak5FheKdNJnSYFx0YMUorQ74HW3oFDyJzkZelnpOpscX3gEem/O9g/fkRo7QyFLik+XpPplslhYhVnj45ur6XpRA7AJDRo023m90BiFdCmUb71NMQn1P+0wAfSmrI/AzA5wvIKU+rUVv9+I8zaEHMniaSRQi+Xgm7I0Z5ZUgpQxK47ZDtiXHegfWZXFIgEeXxL3TZ8oiRpMZHJUnT90gDIGLkm4GQky52Pw2uMWqUVYYED+MtKNWIW+z4MCBiBUcicJMFpXo6szLQXlAXHdxuFtqnZTVsxA/YwaDUi5BxMkx8Rpzf035PQj9vzRGlpDIkj0hNhjSU8T2WHmJQAC3yhxue24E84hYTJjKCGlYLabgkdTWoyPqfnpNRryxvzRGl3DLUc+KWMhz0gPOcsXQUgBWIXHiiKEyNSEaIJEXJbQazzB3RjCSllqEU1hdM+ApCCn28tndH4MKnK28cd3fFaaY2bJLmOFBaGSIWumUmJHAzHDcXQaoQ9EwLdscsU6MFZ3eICS0yYh5JyipD5HdkytdAG8nL0Fe5kBdCyDgakCzEZ/K7Q1BjU48XnWwX+F58TjvMOlnOiHlUKa8MNaCvTEnPgaSZS4qdfxd0rM9gweH1YTcFR1Jj9SRuFYeYUTUlDJ17Tn9UKasMyUXbbAh9fC4BubJfdOCjU16bXOhwfkt3ErsglNQU0VxfUMVh05bw0QIveRF58XhUKa0MdUHAgr0PrfKfyn+uXOC2OyaDGArXTQgJum4PeBQmgxgKd8BkEHfYSR5QpR93D4/rVNnH7yv/qfynOp9bSuRTOKNPiXywy0Zz9x0lEHeNCY/eUQbxyFhyXSmMWcaEB8phGFz5T+U/lf/sNWncIvScrFTZ6wRd4wL/SQfgswVk/mmAeCVUvpelkCxoZK1GcuZJpjC7QwRRdQbgc1naZBgnQSVKAzDQpOcQhUxz3oF2qJG0kP8zhRRIRFw1aUrSJsM4CSpPAhcTMwsRpua9UPlPQt/3tAaJPK34ddTKAhc7i542IoL+D9AXpQ2GeRJUosQf3fCqOMDxvcz3kiZF0tIQW+r0hxue24F2GLjYAeRJGwzzJKg8F1IAOhbpOUCjfcpj5UaJWqqRNJk0NdT0nIgiSofmWjBQgsoQeriPP00PvkByRkDUkvivC5+uvHHcLUjSNBcGSlCZ0WUjlpQPQF65OBO3pIPvC4haUsV5megGbl7Ficy3IwMlqMwIXDLAfdFJmlh1XlVq3otbvhefw/Gxk0kIWgisL5AxcxeyEJ/ukzHzllIXnUxJ0gbDPAkqNVQKNLaEp/WQCVUjbgkdQo5WI96hJSVweXFhqnFLlDYY5klQuaEufqP57HWl8V9wAM5v8alH+GhBcUQtOm/5tNYKcbISVXQFogrrC7K0wTBPggzKmAShafi3CRknQVf/YcHeql35T+U/1X/cdl0JxM1jwiPXlUHcZ8Hu+slC8+vrSiN+P/pcVx4xmpRjjAqlGJX/XMuU6x8ojbhl9HmgPOLKr/ehWbAPm1T+U/lP5T9XPuJ77bCUGNkMTQAELujoTwIML0MTFylESqkuZEOiG7dUbgzP14AYJEMlQ8+J6PGEfvkzzAxNVjSSplBE0vZpFyCi2QPSQ6TJvx00aQAK+R6gDyk4giSVYgpELWnq1tAcUY8z1FdqTqP9owPQR+PIIBgwQ2bG99qhkLcU9PHtQkR6B9pToApKURd2XVNApySFPs14GrdYOzApGe1dGu2QeZD+QGxOA6UbAH3sh8yBCTNkZAI3UxI5B1mlJB+RqJgDGgRuhI8TASYXsayJUor5Cs2hvVAXiHBmDkyYoRIAywTmoef06SFm1zm71HPQksRFgMmR/KIvrzeRgNAchGn4nkEwYIbMjO8JtEMRwJDwyZCkIELB4f4ASRPLCraEe1BYc8yFCTNk7FWEjoGRNPHCJUFg+fG9ovgeTYEQPSdparXTbiR5kP5AaI6pMFOGSgBhyJoKF3+jHeryIUOGubug92Urvy2kDc/HLcmDoJtjNkyTofJANTBfdGhMn5OhBxk8d9shwsc9DchI4ooUHNBBsk5cqVbgQjuUPHDySmqOqTBThsoAOtMDSZNPIUGfyeDhpiMVOhaJGhk54pDlQK5yJki9gI1k+pIH9RWaYyrMlCEzMrQgNBWLPbDtOf0CQyXjvshuwgyVNV0gl3WOM50tMi5jnaEJB9UFUmRy2xC3zMs4Z8iCvdGx8p/KfyrvsWA3ZWShuf6B0ohbRp8HyiNGk3KMUaEUo/Kfyn8q/6n854pUnnig9OPx4fFI6Sfoob1iEoihMQnE3nDvA5NBDIVbJoQE3bJ7LFBU/lP5T+U/lf+MH7fdYWniV0P9tlGWJn5vF3nkOvsSdw+bB5R9iTsq/6kOI3CTpqAQ77RDgVcK43vtEB+XyZFlUrvS3mf/0YCIkcJ7nsSLXzSHiShrIeg57ETzvbgln/BJc2hnZjFZW0De+dxzMmWnUClbbECfnHS+l6UQOwCQ0ZOQbje7AxCvhNJCF0jELcHJ91CWec4/7QB8tIAWP85AfI6S34ouaXTgZihKG0YbnizsIwncdsj2xDjvwPpMLimQiAohOMn0HOKSNH2PGRNyW0G3VV3oc9FM0Ya3w/3kjhq4SPowBkSsykoELnZlPbcdCqsIT00kJ7JAacCHWvFJyDQZnsmZSK4pWa8B7xHRPm/4fpKeQ7ordiITgwJokT/c8NwO5JLCh0pxJxnSHZPWnCHNYB4qvxW4Pq5OR55kNdLwfSV0XbIqpx0WgFXOPFh/yJxy6Dm080vj19jFISOZ4v8Jy8wFHfebryCk0MeNdkfgwqcrbxx3c+gCMeROw0Q0VWnS1LYSSXM/SuBmWDoLIZTVLvRRUIb/Vtyp8EIhmCmh5/zPzZRGGO/tPyEn8cvQVznQrrRBnnEAkoVqfgZEeg4boklO2P8WWKUQkil9rton04DncNrEyfan9BxImrmkADgq07E+g8WUF07OKY8P1k5LTmn+juJWEeRWYAPJniTRfSl0QiKXgHRsLzrw0SmvTfo5OL+le8YihIITlUVxNl/74auqADmtEF65IKJkRngyYMKMLvSLvERllZj32qHVAkeBkbJa+B58aMHeql35T/UW1vGHcFmZsIz8/TpLE7+0YD+MvvKfyn8q/6m4w4J9Vx+7yGN32pd4cNg8WLMvcWflP5X/5LK5sUw4MjUoBne6phYvXQLYeGexVjt5cLAJnbO1o98CfHB46qeDa1pmDlbRaG1REJT8niHC9oNNILGKXJiCtcUjU+hxYWpA9Oqg3U5Mr0qCeX4wsBMAj4E+Z3UfWDsyvbaooZvC+4u1Q1MwmINtbfFwZ6k2t7EsClK/Wh39Tj4F27YDHX+76dlLQOgsCV9kDgYnpgfa4uevlmv1zpIoKPthnbYeC7TCUtYWkVUEH6mvLW52/jO9jQ6iIPcDYMZWA1yAT95589h0MeY6S3W96eDI1HZNECxAZ8lyMEfGbic48oJWeFt/tc217/W5ywVFVvmOrAeDxdrRf4JArc5XwW30SnMblwa1miDI0FIb7+KcydSgZj0WeIGl8Jr7CZk60TraDLcXBXP8YGPZdoCdIVx4q76xzNETt2SCd8DETh5ETVFQ9oOPz1qwtwlV/lP5z9WDXFH3cyrvfcDSxK8t2M8Kr/yn8p+rJrBbYcn4re2KA9fejn/cPo6xz+Z2GMe4AoVbbxyvuH8/zl9r4xX3XKXFXt3q1DW1eOkSwMY75MZZBpvQOVs7+i25SY2fyL1ozJH769IKgqDk9wwRth9sAolV5MIUrC3S22e5MDUgenXQbiemVyXBPD8Y2AmAB97Hje4Da0fonSjRTfmNAs3BNt4rUGepNrexLAqiH7+hoJNPwbbtQMffbnr2EhA6S/KtTp2YHmiLn79artU7S6Kg7Id12nossAor3kvXKoKP1NcWNzv/md5GB1GQ+wEwY6sBLsAn77x5bLoYc52lut50cGRquyYIFqCzZDmYozfKxZEXtMLb+qttrn2vz10uKLLKd2Q9GCzibXIJ1Op8FdxGrzS3cWlQqwmCnJMHN97FOZOpQc16LPACS+E19xMydaJ1tBluLwrm+MHGsu0AO0O48FZ9Y5mjJ27JBO+AiZ08iJqioOwHH5+1YG8TulY/FuzzmBbsE+VWDBv2XX2uCRYHAAA=)

**图：虚拟化**

Note

仅在定制 BSP 版本上支持虚拟化。

### Qualcomm 虚拟化解决方案

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

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

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

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

**图：Qualcomm 虚拟化解决方案架构**

Gunyah 提供了以下功能：

表：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 hypervisor。crosvm 通过 `/dev/gunyah` 接口与内核中的 Gunyah 虚拟机管理器交互并创建虚拟机。

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

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

**图：Qualcomm 虚拟化解决方案**

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

### Guest VM 编译支持

按照以下步骤编译 Guest VM 内核和 initrd 镜像：

在 Guest VM 内核编译期间，guest 内核和最小 `rootfs` 均被编译。`qcom_vm_defconfig` 用作 Guest VM 内核编译的基础配置。`qcom_vm_debug.config` 搭建客户虚拟机的调试版本。

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

**搭建客户虚拟机**

`crosvm` 支持的更多信息，请参阅[辅助虚拟机](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-27/platform_software_features.html#sub$secondary_virtual_machine)。

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

使用以下命令编译 Guest VM：

export SHELL=/bin/bash && MACHINE=SOC DISTRO=qcom-wayland source setup-environment
    
    bitbake qcom-console-image
    Copy to clipboard

**Guest VM  initrd 镜像**

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

**Guest VM 内核镜像**

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

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

### 启动 Guest VM

使用 `crosvm` VMM 和 Gunyah hypervisor 启动客户虚拟机。

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

# /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/Image
    Copy to clipboard

下表列出了启动客户虚拟机的 `crosvm` 命令支持的参数。

表：支持的参数

| 参数 | 说明 |
| --- | --- |
| /usr/bin/crosvm<br>    Copy to clipboard | 显示 `crosvm` 二进制文件的路径 |
| --log-level=debug<br>    Copy to clipboard | 在运行 `crosvm` 时将日志级别设置为 debug |
| --no-syslog<br>    Copy to clipboard | 禁用 syslog |
| --disable-sandbox<br>    Copy to clipboard | 禁用 sandboxing |
| --hypervisor gunyah<br>    Copy to clipboard | 指定要使用的 hypervisor（在本例中为 `gunyah`） |
| --protected-vm-without-firmware<br>    Copy to clipboard | 指示虚拟机已受到保护，不需要固件 |
| --serial=...<br>    Copy to clipboard | 配置串行输入/输出设备 |
| --initrd /var/gunyah/initrd.img<br>    Copy to clipboard | 指定初始 RAM 磁盘 (initrd) 镜像 |
| --no-balloon<br>    Copy to clipboard | 禁用 memory ballooning |
| --no-rng<br>    Copy to clipboard | 禁用用于注入 guest 操作系统熵池的熵源 |
| --params "..."<br>    Copy to clipboard | 指定内核命令行选项 |
| /var/gunyah/Image<br>    Copy to clipboard | 指定内核镜像的路径 |

**查看虚拟机和启动日志**

以下示例输出显示了 VM 日志：

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 kB
    Copy 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/Image
    Copy 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 kB
    Copy to clipboard

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

要启动具有两个 CPU 和 512 MB RAM 的 Guest VM ，请使用 `--cpus num-cores=2 --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/Image
    Copy 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 kB
    Copy 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/Image
    Copy to clipboard

- 使用 `--block` 标志来指定块设备名称（在本例中为 disk.img）。
- 此标志在 Guest VM 中创建 `/dev/vda, /dev/vdb` 和 `/dev/vd*` 节点。

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 -> ../loop1
    Copy to clipboard

要在 Guest VM 中挂载设备，请使用以下命令：`mount -t ext4 /dev/vda /mount-point`。

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

### KVM 概述

基于内核的虚拟机 (KVM) 是一个集成到 Linux 内核中的开源虚拟化模块。 这种集成使 KVM 能够充当 hypervisor。KVM 促进了对 guest 操作系统的硬件辅助虚拟化。

Note

KVM 仅支持 QCS8275 和 QCS9075 SoC。

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

**图：KVM/QEMU 虚拟化的 high-level 概述**

以下是在基于 Arm CPU 的系统上启用 KVM Hypervisor 的先决条件：

- Boot loader 在异常级别 2 (EL2) 启动 Linux 内核
- `CONFIG_KVM` 在内核配置中启用

要验证设备上是否可用 KVM，请使用以下命令检查 `/dev/kvm` 是否存在：

ls -l /dev/kvm
    Copy to clipboard

在 Qualcomm Linux 默认启动流程中，Linux 内核在 EL1 启动，而 Gunyah 承担 Hypervisor 的角色。有关在 EL2 启动 Linux 内核以启用 KVM Hypervisor 的说明，请参阅 [UEFI](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-4/boot-developer-touchpoints.html#uefi)。

启用 KVM 时请考虑以下事项：

- 虚拟主机扩展 (VHE) 默认在所有支持 Arm (v8.1) 或更高指令集的 Qualcomm Linux SoC 上启用。此配置允许整个 Linux 内核稍作修改后在 EL2 运行。Guest 操作系统内核和用户空间在 EL1 和 EL0 运行。使用 VHE，guest 和 host 之间的转换开销较小，因为 guest 和 host 内核在不同的异常级别运行。
- Linux 内核管理所有可访问的非安全内存。它不支持需要与 Linux 内核特定隔离的受保护用例。在默认启动流程中，Gunyah hypervisor 控制 Linux 内核的 S2 页表。
- 不支持外设镜像加载 (PIL) 服务。因此，当启用 KVM 时，任何需要 aDSP、cDSP 和神经信号处理器 (NSP) 的应用程序都无法工作。
- Linux 内核支持 KVM 的电源状态协调接口 (PSCI)。PSCI 确保 CPU 热插拔和低功耗模式 (LPM) 在 KVM 下正常运行。

在 Qualcomm Linux 默认启动流程中，Linux 内核在 EL1 中启动，而 Gunyah 则承担了 Hypervisor 的角色。有关在 EL2 中启动 Linux 内核以启用 KVM Hypervisor 的说明，请参阅 TBD 指南。

### 虚拟机管理器

快速仿真器 (QEMU) 用作虚拟化的虚拟机管理器 (VMM)。 Libvirt 作为管理层，与 QEMU 交互以启动、停止和管理虚拟机。

### QEMU

使用 QEMU 作为虚拟机管理器 (VMM) 结合 KVM 以接近原生的性能运行虚拟机。QEMU 支持模拟设备，例如 virtio 设备，这些设备提供高性能的 I/O 操作，并允许从虚拟机访问 USB 和外设组件互连 (PCI) 设备。
QEMU 进程及其线程管理单个虚拟机。直接调用 QEMU 来创建虚拟机。有关更多信息，请参阅 [QEMU](https://qemu-project.gitlab.io/qemu/index.html).

### Libvirt

Libvirt 是一套工具，包括一个 API 库、一个守护进程 (libvirtd) 和一个命令行实用程序 (virsh)，用于管理虚拟机。virsh 工具对于管理多个虚拟机非常有用。 有关更多信息，请参阅 [virsh](https://www.libvirt.org/manpages/virsh.html)。

### 启动 Guest VM

要启动基于 ARM64 的虚拟机，请使用 QEMU 或 virsh 命令，这些命令在内部与 libvirt 一起工作。这些命令允许您配置虚拟机的 CPU、内存和存储。 指定分配给虚拟机的虚拟 CPU 数量和内存量。此外，虚拟机可以使用 ramdisk (initrd) 和 `.ext4` 根文件系统启动。

Note

在启动虚拟机之前，请确保主机文件系统中的 `/mnt/overlay/guest` 目录中存在 guest 内核镜像（`Image`）、根文件系统 CPIO（`rootfs.cpio.gz`）和根文件系统镜像（`rootfs.ext4`）。这些文件路径和格式仅供参考。

### QEMU

使用以下步骤启动具有各种配置的虚拟机：

### 使用 ramdisk 启动

qemu-system-aarch64 \
       -M virt -m 2G \
       -kernel /mnt/overlay/guest/Image \
       -initrd /mnt/overlay/guest/rootfs.cpio.gz \
       -cpu host --enable-kvm -smp 4 -nographic
    Copy to clipboard

### 使用 rootfs 镜像启动

qemu-system-aarch64 \
       -M virt -m 2G \
       -kernel /mnt/overlay/guest/Image \
       -drive file=/mnt/overlay/guest/rootfs.ext4,if=virtio,format=raw \
       -append "root=/dev/vda" \
       -cpu host --enable-kvm -smp 4 -nographic
    Copy to clipboard

### Libvirt

Libvirt 使您能够使用 QEMU 和 KVM 创建、交互和管理虚拟机。

### 使用 virsh 进行虚拟机管理

virsh 提供了一系列用于创建、控制和监控虚拟机的命令。

以下是用于虚拟机管理的 virsh 命令：

# Define a new VM domain called initrd_simple
    virsh define /mnt/overlay/libvirt_initrd_simple.xml
    Copy to clipboard

# List all domains and check the state of initrd_simple, it is not started yet
    virsh list --all
    Copy to clipboard

# start the initrd_simple VM
    virsh start initrd_simple
    Copy to clipboard

# connect to console
    virsh console initrd_simple
    Copy to clipboard

# Disconnect from console by pressing (Ctrl + ]) key combination
    Copy to clipboard

# shutdown the VM
    Copy to clipboard

virsh shutdown initrd_simple
    Copy to clipboard

# Undefine the VM if there is no intention to restart/resue it
    virsh undefine initrd_simple
    Copy to clipboard

### 使用 ramdisk 启动

将 XML 内容复制到主机上的 `/mnt/overlay/guest/libvirt_initrd_simple.xml`：

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
      <name>simple_initrd</name>
       <!-- specify VM memory in KB  -->
      <memory unit='KiB'>2097152</memory>
       <!-- 4 vCPUs affined to all host CPUs  -->
      <vcpu placement='static'>4</vcpu>
      <resource>
        <partition>/machine</partition>
      </resource>
      <os>
        <type arch='aarch64' machine='virt-6.2'>hvm</type>
        <!-- specify kernel/initrd file  -->
        <kernel>/mnt/overlay/guest/Image</kernel>
        <initrd>/mnt/overlay/guest/rootfs.cpio.gz</initrd>
        <boot dev='hd'/>
      </os>
      <features>
        <gic version='3'/>
      </features>
      <cpu mode='host-passthrough' check='none'/>
      <devices>
        <!-- Guest console will be available over pty on the host -->
        <console type='pty'>
        </console>
      </devices>
    </domain>
    Copy to clipboard

### 使用 rootfs 镜像启动

将以下 XML 文件复制到主机文件系统中的 `/mnt/overlay/guest/libvirt_rootfs_simple.xml` 文件。使用虚拟机管理命令时，将 `rootfs_simple` 作为虚拟机域/名称，而不是 `initrd_simple`。

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
      <name>simple_rootfs</name>
      <memory unit='KiB'>2097152</memory>
      <vcpu placement='static'>4</vcpu>
      <resource>
        <partition>/machine</partition>
      </resource>
      <os>
        <type arch='aarch64' machine='virt-6.2'>hvm</type>
        <kernel>/mnt/overlay/guest/Image</kernel>
        <cmdline>root=/dev/vda</cmdline>
        <boot dev='hd'/>
      </os>
      <features>
        <gic version='3'/>
      </features>
      <cpu mode='host-passthrough' check='none'/>
      <devices>
        <console type='pty'>
        </console>
        <disk type="file" device="disk">
          <driver name="qemu" type="raw"/>
          <!-- specify rootfs image file  -->
          <source file="/mnt/overlay/guest/rootfs.ext4"/>
          <target dev="vda" bus="virtio"/>
        </disk>
      </devices>
    </domain>
    Copy to clipboard

### Virtio 框架

Virtio 在半虚拟化的 hypervisor 环境中抽象设备。它提供了一个 I/O 半虚拟化框架，用于与半虚拟化（paravirt）设备交互。虚拟机监视器（VMM）或 hypervisor（HYP）使用 virtio 模拟提供给虚拟机（VM）的大多数设备。

### 关键功能

以下是虚拟网络的主要功能：

- 半虚拟化和完全虚拟化

> 
> 
> - 完全虚拟化: 在完全虚拟化环境中，Guest VM 不识别 hypervisor，它无需修改即可运行。然而，由于设备仿真，完全虚拟化会导致更高的开销。
>     - 半虚拟化: 在半虚拟化环境中，虚拟机识别 hypervisor，并需要对操作系统进行修改。半虚拟化允许 guest 和 host 之间进行高效通信。
- Virtio 框架

> 
> 
> ![../_images/virtio_arch.png](data:image/png;base64,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)
> 
> **图 : Virtio 框架的 High-level 概览**
> 
>     - 前端驱动程序：这些驱动程序在 guest 操作系统中实现，并与 hypervisor 中的后端驱动程序交互。
>     - 后端驱动程序：这些驱动程序在 VMM/HYP 中实现，处理实际的设备模拟并通过虚拟队列与前端驱动程序交互。
>     - 虚拟队列：Virtio 使用虚拟队列（virtqueues）来促进前端和后端驱动程序之间的通信。这些队列以环的形式实现，以有效地管理 guest 到 hypervisor 的转换。
- Vhost

> 
> 
> Vhost 是一种协议，它将 virtio 数据平面实现分流到另一个元素（用户进程或内核模块）以提高性能。这减少了 Guest VM 和 hypervisor 之间的上下文切换的开销。

    - Vhost-net: 一种内核级实现，允许数据平面绕过 QEMU 进程，以减少延迟并提高性能。有关 vhost-net 的更多信息，请参阅 [Introduction to
virtio-networking and vhost-net](https://www.redhat.com/en/blog/introduction-virtio-networking-and-vhost-net)。
    - Vhost-user: 一种用户空间实现，通过单独的进程处理数据平面，以提供灵活性并为工作负载提供更好的性能。有关 vhost-user 的更多信息，请参阅 [Vhost-user Protocol](https://www.qemu.org/docs/master/interop/vhost-user.html).

### 优点

以下是使用 virtio 框架的优势：

- 标准化：Virtio 为设备模拟提供了一个通用接口。它促进了不同虚拟化平台之间的代码重用和效率。
- 灵活性：Virtio 支持块设备和网络设备。

### Virtio 接口

以下是 Virtio 支持的接口：

### 9p 传输概述

`virtio-9p` 使您能够在主机和虚拟机之间使用 9P（Plan 9 文件系统）协议共享文件，以增强 virtio 框架内的性能。

Note

确保 host 和 guest 内核中启用了下面提到的配置。

Host 端：CONFIG_NET_9P、CONFIG_NET_9P_VIRTIO
    Copy to clipboard

Guest 端：CONFIG_NET_9P、CONFIG_NET_9P_VIRTIO、CONFIG_9P_FS
    Copy to clipboard

要创建一个 `virtio-9p` 共享目录，请在主机上定义它，并配置 Guest VM 以挂载它。请参阅以下示例：

> 
> 
> root@qcs9100-ride-sx:~# ls -la /mnt/overlay/test_dir
>     total 12
>     drwxr-xr-x. 2 root root 4096 Apr 29 21:36 .
>     drwxr-xr-x. 7 root root 4096 Apr 29 21:36 ..
>     -rw-r--r--. 1 root root    8 Apr 29 21:36 file.txt
>     root@qcs9100-ride-sx:~# cat /mnt/overlay/test_dir/file.txt
>     testing
>     root@qcs9100-ride-sx:~#
>     Copy to clipboard

在主机上创建一个目录 `/mnt/overlay/test_dir` 以和 Guest VM 共享。将此信息传递到 libvirt XML 配置中或作为 QEMU 参数。 要配置 9P 传输，请运行以下命令：

qemu-system-aarch64 \
    -M virt -m 2G \
    -kernel /mnt/overlay/guest/Image \
    -drive file=/mnt/overlay/guest/rootfs.ext4,if=virtio,format=raw \
    -append "root=/dev/vda" \
    -cpu host --enable-kvm -smp 4 -nographic \
    -fsdev local,id=fsdev0,path=/mnt/overlay/test_dir,security_model=passthrough \
    -device virtio-9p-pci,fsdev=fsdev0,mount_tag=hostshare
    Copy to clipboard

要在虚拟机上识别并挂载共享目录，请使用 `fsdev0` 和 `hostshare` 文件系统设备。

要从 libvirt 界面使用以下示例 XML 启动 Libvirt Guest VM，参见 [Libvirt](https://docs.qualcomm.com/doc/80-70017-3SC/topic/features.html#id22)。

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
      <name>simple_9p</name>
      <memory unit='KiB'>2097152</memory>
      <vcpu placement='static'>4</vcpu>
      <resource>
        <partition>/machine</partition>
      </resource>
      <os>
        <type arch='aarch64' machine='virt-6.2'>hvm</type>
        <kernel>/mnt/overlay/guest/Image</kernel>
        <cmdline>root=/dev/vda</cmdline>
        <boot dev='hd'/>
      </os>
      <features>
        <gic version='3'/>
      </features>
      <cpu mode='host-passthrough' check='none'/>
      <devices>
        <console type='pty'>
        </console>
        <disk type="file" device="disk">
          <driver name="qemu" type="raw"/><!-- Specify rootfs image file here -->
          <source file="/mnt/overlay/guest/rootfs.ext4"/>
          <target dev="vda" bus="virtio"/>
        </disk>
        <filesystem type='mount' accessmode='mapped' fmode='644' dmode='755'>
          <!-- Specify the directory to be shared -->
          <source dir='/mnt/overlay/test_dir'/>
          <!-- Specify the mount_tag to identify the mount point -->
          <target dir='hostshare'/>
        </filesystem>
      </devices>
    </domain>
    Copy to clipboard

Note

将 XML 文件内容复制到主机文件系统上的 `/mnt/overlay/guest/libvirt_virtio_9p.xml` 文件。

当 Guest VM 启动后，请检查 virtio 设备是否被成功探测。

> 
> 
> root@v8a-arm64:~# lspci
>     00:00.0 Host bridge: Red Hat, Inc. QEMU PCIe Host bridge
>     00:01.0 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>     00:01.1 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>     00:01.2 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>     01:00.0 Unclassified device [0002]: Red Hat, Inc. Virtio 1.0 filesystem (rev 01)
>     02:00.0 SCSI storage controller: Red Hat, Inc. Virtio 1.0 block device (rev 01)
>     root@v8a-arm64:~#root@v8a-arm64:~# cat /sys/bus/pci/devices/0000\:01\:00.0/virtio0/uevent
>     DRIVER=9pnet_virtio
>     MODALIAS=virtio:d00000009v00001AF4
>     root@v8a-arm64:~#
>     Copy to clipboard

要在 Guest VM 中挂载共享目录，请运行以下命令：

mount -t 9p -o trans=virtio hostshare mountpoint
    Copy to clipboard

### VSOCK 概述

VSOCK 是一个虚拟套接字接口，允许虚拟机 (VM) 和主机操作系统之间的通信。
它用于 KVM 和 QEMU。VSOCK 通过 virtio 接口支持。virtio-vsock 是一种基于 vhost 的 virtio 设备，其中主机内核管理所有数据传输，而 KVM hypervisor 控制信息。

要在 KVM 和 QEMU 环境中创建 VSOCK 连接，请指定上下文标识符 (CID) 和端口号。CID 是在 VSOCK 环境中分配给每个虚拟机的唯一标识符，用于在主机和虚拟机之间路由通信。主机的 CID 为 2，而虚拟机的 CID 从 3 开始分配。

下表列出了 CID 值：

Table: CID 值

| CID | 说明 |
| --- | --- |
| -1 | 任意地址绑定 |
| 0 | Hypervisor |
| 1 | 回送 |
| 2 | 主机 |

Note

确保在主机和 guest 内核中启用以下配置。

Host 端: CONFIG_VSOCKETS, CONFIG_VHOST_VSOCK
    
    Guest 端: CONFIG_VSOCKETS, CONFIG_VIRTIO_VSOCKETS
    Copy to clipboard

- 启用 VSOCK 设备：要启用 VSOCK 设备，请在虚拟机配置文件（libvirt XML）中指定设备，或向 QEMU 传递参数。

qemu-system-aarch64 \
        -machine virt -m 2G \
        -kernel /mnt/overlay/guest/Image \
        -drive file=/mnt/overlay/guest/rootfs.ext4,if=virtio,format=raw \
        -append "root=/dev/vda" \
        -cpu host --enable-kvm -smp 4 -nographic \
        -device vhost-vsock-pci,guest-cid=73
        Copy to clipboard

    这个命令中, `guest-cid=73` 指定虚拟机的 CID.
- 使用 libvirt 界面启动 Guest VM：要在 libvirt 中使用 VSOCK 设备，请在虚拟机 XML 配置文件中定义 VSOCK 设备。 要使用 libvirt 界面启动 Guest VM，请参阅 [Libvirt](https://docs.qualcomm.com/doc/80-70017-3SC/topic/features.html#id22)。

将 XML 内容复制到主机上的 `/mnt/overlay/guest/libvirt_virtio_vsock.xml`。Guest VM 启动后，验证设备是否被成功探测。

> 
> 
> root@v8a-arm64:~# lspci
>     00:00.0 Host bridge: Red Hat, Inc. QEMU PCIe Host bridge
>     00:01.0 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>     00:01.1 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>     00:01.2 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>     01:00.0 SCSI storage controller: Red Hat, Inc. Virtio 1.0 block device (rev 01)
>     02:00.0 Communication controller: Red Hat, Inc. Virtio 1.0 socket (rev 01)
>     root@v8a-arm64:~#
>     root@v8a-arm64:~# cat /sys/bus/pci/devices/0000\:02\:00.0/virtio1/uevent
>     DRIVER=vmw_vsock_virtio_transport
>     MODALIAS=virtio:d00000013v00001AF4
>     root@v8a-arm64:~#
>     Copy to clipboard

要验证 host 到 guest 和 guest 到 host 的交互，请使用 `socat` 工具。确保 host 和 guest 上支持 `socat` 工具。

- 在 host 上，验证以下端口：

socat STDIN VSOCK-LISTEN:1234
        Copy to clipboard
- 在 guest 上, 使用 host CID (2) 连接到 host：

socat STDOUT VSOCK-CONNECT:2:1234
        Copy to clipboard
- 在此设置中，guest 和 host 显示相同的值。

### Virtio block 概述

Virtio block 是一种将块设备呈现给虚拟机的标准化方式。每个 virtio 块设备在 Guest VM 内都显示为一个磁盘。virtio block 允许虚拟机进行读写操作。

<cite>virtio-block</cite> 设备有如下关键特征：

- 简单：设备模型简单明了，易于实现和使用。
- 性能：旨在最小化开销并最大化吞吐量。
- 灵活性：设计用于各种类型的存储后端。

Note

确保在 guest 内核中启用了 CONFIG\_VIRTIO\_BLK。

要使用 virtio-block 设备，请按照下列步骤操作：

1. 要配置虚拟机以包含 virtio-block 设备，在虚拟机配置文件（libvirt XML）中指定设备，或向 QEMU 传递参数。

    1. 要在虚拟机中启用 virtio-block 设备，请使用以下 QEMU 命令：

qemu-system-aarch64 \
            -M virt -m 2G \
            -kernel /mnt/overlay/guest/Image \
            -drive file=/mnt/overlay/guest/rootfs.ext4,if=virtio,format=raw \
            -append "root=/dev/vda" \
            -cpu host --enable-kvm -smp 4 -nographic \
            -drive file=/mnt/overlay/guest/disk.img,if=virtio,format=raw
            Copy to clipboard

        在此命令中, `rootfs.ext4` 和 `disk.img` 是 Guest VM 中的磁盘.
    2. 使用 libvirt 界面启动 Guest VM。要使用以下示例 XML 启动虚拟机，请参阅 [Libvirt](https://docs.qualcomm.com/doc/80-70017-3SC/topic/features.html#id22)：

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
              <name>simple_block_device</name>
              <memory unit='KiB'>2097152</memory>
              <vcpu placement='static'>4</vcpu>
              <resource>
                <partition>/machine</partition>
              </resource>
              <os>
                <type arch='aarch64' machine='virt-6.2'>hvm</type>
                <kernel>/mnt/overlay/guest/Image</kernel>
                <cmdline>root=/dev/vda</cmdline>
                <boot dev='hd'/>
              </os>
              <features>
                <gic version='3'/>
              </features>
              <cpu mode='host-passthrough' check='none'/>
              <devices>
                <console type='pty'>
                </console>
                <disk type="file" device="disk">
                  <driver name="qemu" type="raw"/>
                  <!-- specify rootfs image file  -->
                  <source file="/mnt/overlay/guest/rootfs.ext4"/>
                  <target dev="vda" bus="virtio"/>
                </disk>
                <disk type="file" device="disk">
                  <driver name="qemu" type="raw"/>
                  <!-- specify a different disk image file -->
                  <source file="/mnt/overlay/guest/disk.img"/>
                  <target dev="vdb" bus="virtio"/>
                </disk>
              </devices>
            </domain>
            Copy to clipboard

Note

将 XML 的内容复制到主机的 `/mnt/overlay/guest/libvirt_virtio_blk.xml` 中.
2. Guest 操作系统将检测 <cite>virtio-block</cite> 设备并对其进行初始化。在此过程中，guest 驱动程序与设备通信以设置必要的数据结构和队列。

> 
> 
> root@v8a-arm64:~# dmesg | grep virtio
>         [    0.225425] virtio-pci 0000:01:00.0: enabling device (0000 -> 0002)
>         [    0.227073] virtio-pci 0000:02:00.0: enabling device (0000 -> 0002)
>         [    0.234012] virtio_blk virtio0: 4/0/0 default/read/poll queues
>         [    0.235405] virtio_blk virtio0: [vda] 2220734 512-byte logical blocks (1.14 GB/1.06 GiB)
>         [    0.241213] virtio_blk virtio1: 4/0/0 default/read/poll queues
>         [    0.242418] virtio_blk virtio1: [vdb] 8192000 512-byte logical blocks (4.19 GB/3.91 GiB)
>         root@v8a-arm64:~#
>         root@v8a-arm64:~# lspci
>         00:00.0 Host bridge: Red Hat, Inc. QEMU PCIe Host bridge
>         00:01.0 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>         00:01.1 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>         00:01.2 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>         01:00.0 SCSI storage controller: Red Hat, Inc. Virtio 1.0 block device (rev 01)
>         02:00.0 SCSI storage controller: Red Hat, Inc. Virtio 1.0 block device (rev 01)
>         root@v8a-arm64:~#
>         Copy to clipboard
3. 初始化后可以使用 virtio-block 和其他块设备。Guest 操作系统在 virtio 驱动程序上执行读写操作，并将操作传递给主机进行处理。
4. 要管理 virtio-block 设备，请使用 Guest 操作系统中可用的标准工具和命令。例如， `lsblk` 和 `df`。

### Virtio-IOMMU 概述

Virtio-IOMMU 是一种半虚拟化输入/输出内存管理单元 (IOMMU)，在虚拟环境中提供直接内存访问 (DMA) 管理。Virtio-IOMMU 与现有的软件 API（如 VFIO）集成，消除了页表仿真的需求，使其成为一种轻量级且高性能的解决方案。Virtio-IOMMU 充当物理 IOMMU 的代理，管理分配给虚拟机的设备。作为虚拟 IOMMU，它管理、仿真和半虚拟化设备。

以下是 Virtio-IOMMU 的主要功能：

- 半虚拟化：利用现有的传输机制并减少开销。
- 灵活性：支持 PCI 直通和共享虚拟内存。
- 集成：与软件 API 集成，增强兼容性。例如，虚拟功能 I/O（VFIO）。

Note

确保在 guest 内核中启用了 `CONFIG_VIRTIO_IOMMU`。

要使用 Virtio-iommu 设备，请执行以下操作：

1. 要配置虚拟机以包含 Virtio-IOMMU 设备，在虚拟机配置文件（XML）中指定设备，或向 QEMU 传递参数。

> 
> 
> 1. 启用 Virtio-IOMMU 设备。要在虚拟机中启用 Virtio-IOMMU 设备，请使用以下 QEMU 命令：
> 
> 
> 
> > 
> > 
> > qemu-system-aarch64 \
> >             -M virt -m 2G \
> >             -kernel /mnt/overlay/guest/Image \
> >             -drive file=/mnt/overlay/guest/rootfs.ext4,if=virtio,format=raw \
> >             -append "root=/dev/vda" \
> >             -cpu host --enable-kvm -smp 4 -nographic \
> >             -device virtio-iommu-pci
> >             Copy to clipboard
>     2. 使用 libvirt 界面启动虚拟机。要使用以下示例 XML 启动虚拟机，请参阅 [Libvirt](https://docs.qualcomm.com/doc/80-70017-3SC/topic/features.html#id22)。
> 
> 
> 
> > 
> > 
> > <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
> >               <name>simple_iommu</name>
> >               <memory unit='KiB'>2097152</memory>
> >               <vcpu placement='static'>4</vcpu>
> >               <resource>
> >                 <partition>/machine</partition>
> >               </resource>
> >               <os>
> >                 <type arch='aarch64' machine='virt-6.2'>hvm</type>
> >                 <kernel>/mnt/overlay/guest/Image</kernel>
> >                 <cmdline>root=/dev/vda</cmdline>
> >                 <boot dev='hd'/>
> >               </os>
> >               <features>
> >                 <gic version='3'/>
> >               </features>
> >               <cpu mode='host-passthrough' check='none'/>
> >               <devices>
> >                 <controller type='pci' index='0' model='pcie-root'>
> >                   <alias name='pcie.0'/>
> >                 </controller>
> >                 <console type='pty'>
> >                 </console>
> >                 <disk type="file" device="disk">
> >                   <driver name="qemu" type="raw"/>
> >                   <!-- specify rootfs image file  -->
> >                   <source file="/mnt/overlay/guest/rootfs.ext4"/>
> >                   <target dev="vda" bus="virtio"/>
> >                 </disk>
> >               </devices>
> >               <qemu:commandline>
> >                 <qemu:arg value="-device"/>
> >                 <qemu:arg value='{"driver":"virtio-iommu-pci","bus":"pcie.0","addr":"0x3"}'/>
> >               </qemu:commandline>
> >             </domain>
> >             Copy to clipboard
> > 
> > 
> > Note
> > 
> > 
> > 将 XML 的内容复制到主机上的 `/mnt/overlay/guest/libvirt_virtio_iommu.xml`。
2. Guest 操作系统检测到 Virtio-IOMMU 设备并初始化它。在此过程中，guest 驱动程序与设备通信，以建立必要的数据结构和映射。

> 
> 
> root@v8a-arm64:~# dmesg | grep virtio
>         [    0.184166] virtio-pci 0000:00:03.0: enabling device (0000 -> 0002)
>         [    0.189122] virtio_iommu virtio0: input address: 64 bits
>         [    0.189516] virtio_iommu virtio0: page mask: 0xfffffffffffff000
>         [    0.220135] virtio-pci 0000:01:00.0: Adding to iommu group 0
>         [    0.220676] virtio-pci 0000:01:00.0: enabling device (0000 -> 0002)
>         [    0.223065] virtio_blk virtio1: 4/0/0 default/read/poll queues
>         [    0.224713] virtio_blk virtio1: [vda] 2220734 512-byte logical blocks (1.14 GB/1.06 GiB)
>         root@v8a-arm64:~#
>         Copy to clipboard
> 
> 
> DMESG 日志显示，virtio-block 设备已附加到 IOMMU 域，该域是 iommu 组 0 的一部分。
3. 初始化后，Virtio-IOMMU 设备管理附加设备的 DMA 操作。Guest 操作系统使用 virtio 驱动程序执行映射和取消映射操作，并将操作传递给主机进行处理。

> 
> 
> 以下示例显示了 Virtio-IOMMU 设备操作：
> 
> 
> root@v8a-arm64:~# cat /sys/kernel/iommu_groups/0/devices/0000\:01\:00.0/virtio1/uevent
>     DRIVER=virtio_blk
>     MODALIAS=virtio:d00000002v00001AF4
>     root@v8a-arm64:~#
>     Copy to clipboard

### Virtio-net 概述

virtio-net 设备是一种虚拟网络设备，为虚拟化环境中的网络操作提供接口。它具有高性能和低开销。

以下是 virtio-net 设备的关键特征：

- 效率：最小化开销并最大化吞吐量。
- 简单：易于实施和使用。
- 灵活性：支持与各种网络配置和后端一起使用。

Note

确保在 guest 内核中启用了 `CONFIG_VIRTIO_NET`。

要使用 virtio-net 设备，请按照以下步骤操作：

1. 要配置虚拟机以包含 virtio-net 设备，在虚拟机配置文件（libvirt XML）中指定设备，或向 QEMU 传递参数。

> 
> 
> 1. 要在虚拟机中启用 virtio-net 设备，请使用以下 QEMU 命令：
> 
> 
> 
> > 
> > 
> > qemu-system-aarch64 \
> >             -M virt -m 2G \
> >             -kernel /mnt/overlay/guest/Image \
> >             -drive file=/mnt/overlay/guest/rootfs.ext4,if=virtio,format=raw \
> >             -append "root=/dev/vda" \
> >             -cpu host --enable-kvm -smp 4 -nographic \
> >             -netdev tap,id=net0,ifname=tap0,script=no,downscript=no \
> >             -device virtio-net-pci,netdev=net0
> >             Copy to clipboard
> > 
> > 
> > Note
> > 
> > 
> > 此命令在主机上创建一个 Tap 接口。要手动创建 Tap 接口，请使用以下命令：
> > 
> > 
> > ip tuntap add dev tap0 mode tap
> >             Copy to clipboard
>     2. 要使用以下示例 XML 启动虚拟机，请参阅 [Libvirt](https://docs.qualcomm.com/doc/80-70017-3SC/topic/features.html#id22).
> 
> 
> 
> > 
> > 
> > <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
> >               <name>simple_net</name>
> >               <memory unit='KiB'>2097152</memory>
> >               <vcpu placement='static'>4</vcpu>
> >               <resource>
> >                 <partition>/machine</partition>
> >               </resource>
> >               <os>
> >                 <type arch='aarch64' machine='virt-6.2'>hvm</type>
> >                 <kernel>/mnt/overlay/guest/Image</kernel>
> >                 <cmdline>root=/dev/vda</cmdline>
> >                 <boot dev='hd'/>
> >               </os>
> >               <features>
> >                 <gic version='3'/>
> >               </features>
> >               <cpu mode='host-passthrough' check='none'/>
> >               <devices>
> >                 <console type='pty'>
> >                 </console>
> >                 <disk type="file" device="disk">
> >                   <driver name="qemu" type="raw"/><!-- Specify rootfs image file here -->
> >                   <source file="/mnt/overlay/guest/rootfs.ext4"/>
> >                   <target dev="vda" bus="virtio"/>
> >                 </disk>
> >                 <interface type='ethernet'>
> >                   <target dev='tap0'/>
> >                   <model type='virtio'/>
> >                 </interface>
> >               </devices>
> >             </domain>
> >             Copy to clipboard
> 
> 
> 
> 
> > 
> > 
> > Note
> > 
> > 
> > 要创建 Host VM 和 Guest VM 之间直接通信的 tap 接口。 将 XML 内容复制到主机上的 `/mnt/overlay/guest/libvirt_virtio_net.xml`。
2. Guest 操作系统检测到 virtio-net 设备并初始化它。在此过程中，guest 驱动程序与设备通信，以建立必要的数据结构和队列。

> 
> 
> root@v8a-arm64:~# dmesg | grep virtio
>           [    0.394365] virtio-pci 0000:01:00.0: enabling device (0000 -> 0002)
>           [    0.396364] virtio-pci 0000:02:00.0: enabling device (0000 -> 0002)
>         [    0.404496] virtio_blk virtio1: 4/0/0 default/read/poll queues
>         [    0.406048] virtio_blk virtio1: [vda] 2220734 512-byte logical blocks (1.14 GB/1.06 GiB)
>         [    0.980919] virtio_net virtio0 enp1s0: renamed from eth0
>         root@v8a-arm64:~# lspci
>         00:00.0 Host bridge: Red Hat, Inc. QEMU PCIe Host bridge
>         00:01.0 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>         00:01.1 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>         00:01.2 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
>         01:00.0 Ethernet controller: Red Hat, Inc. Virtio 1.0 network device (rev 01)
>         02:00.0 SCSI storage controller: Red Hat, Inc. Virtio 1.0 block device (rev 01)
>         root@v8a-arm64:~#
>         Copy to clipboard
3. 操作：初始化和配置 virtio-net 设备后，将其用作其他网络接口。Guest 操作系统使用 virtio 驱动程序执行标准网络操作，并将操作传递给主机进行处理。

要使用 Tap 接口，请在 Host VM 和 Guest VM上运行以下网络配置：

- Host 配置:

root@qcs9100-ride-sx:~# ip addr add 192.168.100.1/24 dev tap0
        root@qcs9100-ride-sx:~# ip link set dev tap0 up
        Copy to clipboard
- Guest 配置:

root@v8a-arm64:~# ip addr add 192.168.100.2/24 dev enp1s0
        root@v8a-arm64:~# ip link set dev enp1s0 up
        Copy to clipboard

要在此接口上运行网络流量，使用以下示例：

> 
> 
> root@v8a-arm64:~# ping 192.168.100.1
>     PING 192.168.100.1 (192.168.100.1): 56 data bytes
>     64 bytes from 192.168.100.1: seq=0 ttl=64 time=0.364 ms
>     64 bytes from 192.168.100.1: seq=1 ttl=64 time=0.156 ms
>     Copy to clipboard

### Virtio-serial 和 virtio-console 概述

Virtio-serial 设备在虚拟环境中提供 Host VM 和 Guest VM 之间的串行通信接口。

以下是 virtio-serial 设备的关键特征：

- 多个端口：支持多个串口，实现多种通讯通道。
- 效率：最小化开销并最大化吞吐量。
- 灵活性：支持不同类型的数据交换，例如控制台访问和文件传输。

Note

确保在 guest 内核中启用了 `CONFIG_VIRTIO_CONSOLE`。

要使用 virtio-serial 设备，请按照下列步骤操作：

1. 要配置虚拟机以包含 virtio-serial 设备，在虚拟机配置文件（libvirt XML）中指定设备，或向 QEMU 传递参数。

    1. 要在虚拟机中启用 virtio-net 设备，请使用以下 QEMU 命令：

> 
> 
> qemu-system-aarch64 \
>         -M virt -m 2G \
>         -kernel /mnt/overlay/guest/Image \
>         -drive file=/mnt/overlay/guest/rootfs.ext4,if=virtio,format=raw \
>         -append "root=/dev/vda" \
>         -cpu host --enable-kvm -smp 4 -nographic \
>         -device virtio-serial-pci,id=virtio-serial0 \
>         -chardev pty,id=charconsole0 \
>         -device virtconsole,chardev=charconsole0,id=console0 \
>         -chardev socket,path=/tmp/qemu.sock,server=on,wait=off,id=charchannel0 \
>         -device virtserialport,chardev=charchannel0,name=org.qemu.guest_agent.0
>         Copy to clipboard

    2. 要使用以下示例 XML 启动 Guest VM，请参阅 [Libvirt](https://docs.qualcomm.com/doc/80-70017-3SC/topic/features.html#id22).

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
          <name>simple_serial</name>
          <memory unit='KiB'>2097152</memory>
          <vcpu placement='static'>4</vcpu>
          <resource>
            <partition>/machine</partition>
          </resource>
          <os>
            <type arch='aarch64' machine='virt-6.2'>hvm</type>
            <kernel>/mnt/overlay/guest/Image</kernel>
            <cmdline>root=/dev/vda</cmdline>
            <boot dev='hd'/>
          </os>
          <features>
            <gic version='3'/>
          </features>
          <cpu mode='host-passthrough' check='none'/>
          <devices>
            <console type='pty'>
            </console>
            <disk type="file" device="disk">
              <driver name="qemu" type="raw"/><!-- Specify rootfs image file here -->
              <source file="/mnt/overlay/guest/rootfs.ext4"/>
              <target dev="vda" bus="virtio"/>
            </disk>
            <controller type='virtio-serial' index='0'>
              <alias name='virtio-serial0'/>
            </controller>
            <console type='pty'>
              <target type='virtio' port='0'/>
            </console>
            <channel type='unix'>
              <target type='virtio' name='org.qemu.guest_agent.0'/>
              <address type='virtio-serial' controller='0' bus='0' port='1'/>
            </channel>
          </devices>
        </domain>
        Copy to clipboard

Note

将 XML 内容复制到主机上的 `/mnt/overlay/guest/virtio_serial.xml`.
2. Guest 操作系统将检测 virtio-serial 设备并对其进行初始化。在此过程中，guest 驱动程序与设备通信以建立必要的数据结构和端口。

root@v8a-arm64:~# lspci
        00:00.0 Host bridge: Red Hat, Inc. QEMU PCIe Host bridge
        00:01.0 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
        00:01.1 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
        00:01.2 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
        01:00.0 Communication controller: Red Hat, Inc. Virtio 1.0 console (rev 01)
        02:00.0 SCSI storage controller: Red Hat, Inc. Virtio 1.0 block device (rev 01)
        root@v8a-arm64:~#
        root@v8a-arm64:~# cat /sys/bus/virtio/devices/virtio0/uevent
        DRIVER=virtio_console
        MODALIAS=virtio:d00000003v00001AF4
        root@v8a-arm64:~#
        Copy to clipboard
3. 初始化后，可以将 virtio-serial 用作串行设备。Guest 操作系统使用 virtio 驱动程序执行读写操作，并将操作传递给主机进行处理。
4. 要管理 virtio-serial 设备，请执行以下操作：

    - 监控性能
    - 验证设备状态
    - 执行维护任务
    - 使用 guest 操作系统中可用的标准工具和命令

### 内存 Balloon 设备

传统的 virtio 内存 Balloon 设备管理 guest 的内存。它允许主机系统从虚拟机中回收内存。内存 Balloon 指示虚拟机将其部分内存返回给主机。这个过程涉及在 Guest VM 内部扩张内存 Balloon，从而减少虚拟机内可用于其他任务的内存。Guest 操作系统决定将哪些内存页返回给主机，指示哪些页不需要或不访问。然后，主机将这些页从 Guest VM 中取消映射，并将其标记为 Guest VM 不可用且允许主机系统使用它们。如果 Guest VM 稍后需要更多内存，主机会缩小 Balloon 以返回这些页。此功能允许每个 Guest VM 在其可用内存被管理的情况下继续运行。

virtio-balloon 设备在 Guest VM 和主机之间用如下方法重新分配物理内存：

1. Balloon 扩张：guest 驱动程序分配内存并将此情况通知 host。Host 可以将扩张的内存重新用于其他虚拟机。
2. Balloon 收缩：在通知 host 后，guest 程序释放先前分配的内存，并使 Guest VM 能够使用收缩的内存。

`Target balloon size` 通过请求更改虚拟机内存大小来控制内存气球的扩张或收缩。调整请求通过 QEMU 监控模式或 virsh 命令发送。

以下是 virtio-balloon 设备的主要功能：

- 内存管理：根据需求实时调整内存分配。
- 效率：从空闲虚拟机中回收未使用的内存，并将其重新分配给活跃的虚拟机。
- 灵活性：支持各种虚拟化设置，以优化资源使用。

Note

确保在 guest 内核中启用了 `CONFIG_VIRTIO_BALLOON`。

要使用 virtio-balloon 设备，请按照下列步骤操作：

1. 配置虚拟机以包含 virtio-balloon 设备，在虚拟机配置文件（libvirt XML）中指定设备，或向 QEMU 传递参数。

    1. 要在虚拟机中启用 virtio-balloon 设备，请使用以下 QEMU 命令：

qemu-system-aarch64 \
            -M virt -m 2G \
            -kernel /mnt/overlay/guest/Image \
            -drive file=/mnt/overlay/guest/rootfs.ext4,if=virtio,format=raw \
            -append "root=/dev/vda" \
            -cpu host --enable-kvm -smp 4 -nographic \
            -device virtio-balloon-pci,id=balloon0
            Copy to clipboard
    2. 要使用以下示例 XML 启动虚拟机，请参阅 [Libvirt](https://docs.qualcomm.com/doc/80-70017-3SC/topic/features.html#id22):

> 
> 
> <domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
>               <name>simple_balloon</name>
>               <memory unit='KiB'>2097152</memory>
>               <vcpu placement='static'>4</vcpu>
>               <resource>
>                 <partition>/machine</partition>
>               </resource>
>               <os>
>                 <type arch='aarch64' machine='virt-6.2'>hvm</type>
>                 <kernel>/mnt/overlay/guest/Image</kernel>
>                 <cmdline>root=/dev/vda</cmdline>
>                 <boot dev='hd'/>
>               </os>
>               <features>
>                 <gic version='3'/>
>               </features>
>               <cpu mode='host-passthrough' check='none'/>
>               <devices>
>                 <console type='pty'>
>                 </console>
>                 <disk type="file" device="disk">
>                   <driver name="qemu" type="raw"/><!-- Specify rootfs image file here -->
>                   <source file="/mnt/overlay/guest/rootfs.ext4"/>
>                   <target dev="vda" bus="virtio"/>
>                 </disk>
>                 <memballoon model='virtio'/>
>               </devices>
>             </domain>
>             Copy to clipboard

Note

将 XML 内容复制到主机上的 `/mnt/overlay/guest/libvirt_virtio_balloon.xml` 文件。
2. Guest 操作系统检测到 virtio-balloon 设备并对其进行初始化。在此过程中，guest 驱动程序与设备通信，以建立必要的数据结构和内存管理机制。

root@v8a-arm64:~# lspci
        00:00.0 Host bridge: Red Hat, Inc. QEMU PCIe Host bridge
        00:01.0 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
        00:01.1 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
        00:01.2 PCI bridge: Red Hat, Inc. QEMU PCIe Root port
        01:00.0 SCSI storage controller: Red Hat, Inc. Virtio 1.0 block device (rev 01)
        02:00.0 Unclassified device [00ff]: Red Hat, Inc. Virtio 1.0 memory balloon (rev 01)
        root@v8a-arm64:~#
        Copy to clipboard
3. 初始化后，virtio-balloon 设备调整分配给 VM 的内存。guest 操作系统可以执行内存扩张和收缩操作，这些操由 virtio 驱动程序负责并传递给 host 进行处理。

要调整 guest 内存，请在主机上运行以下 virsh 命令：

- 要验证 Guest VM 的初始内存（2 GB），请使用以下命令：

> 
> 
> root@v8a-arm64:~# cat /proc/meminfo  | grep Mem
>         MemTotal:        1966180 kB
>         MemFree:         1807432 kB
>         MemAvailable:    1817552 kB
>         root@v8a-arm64:~#
>         Copy to clipboard
- 要扩张 Balloon 并将 Guest VM 的内存减少到 512 MB, 请使用以下命令：

root@qcs9100-ride-sx:~# virsh setmem simple_balloon 512M --live
        Copy to clipboard
- 要验证扩张后的 Guest VM 内存, 请使用以下命令：

root@v8a-arm64:~# cat /proc/meminfo  | grep Mem
        MemTotal:         393316 kB
        MemFree:          235708 kB
        MemAvailable:     245836 kB
        root@v8a-arm64:~#
        Copy to clipboard
- 要收缩 Balloon（Guest VM 内存恢复为 2 GB）：

root@qcs9100-ride-sx:~# virsh setmem simple_balloon 2G --live
        Copy to clipboard
- 要验证收缩后的 Guest VM 内存：

root@v8a-arm64:~# cat /proc/meminfo  | grep Mem
        MemTotal:        1966180 kB
        MemFree:         1811844 kB
        MemAvailable:    1821988 kB
        root@v8a-arm64:~#
        Copy to clipboard

### 主机设备访问

可以从 guest 使用 host 系统上枚举的设备。设备分配接口连接到 guest 的使用方式因设备类型的不同而不同。某些设备充当 QEMU 模拟设备的后端，例如 UART。将通用异步接收器传输器 (UART) 配置为主机上的字符设备 (chardev) 后端。 有关 QEMU chardev 的更多信息，参见 [Character device options](https://www.qemu.org/docs/master/system/invocation.html#hxtool-6)。

PCI 和 USB 设备在内核 VFIO 框架上工作。

- PCI 直通允许 Guest VM 直接访问主机上的物理 PCI 设备。Linux 内核中的 VFIO 框架用于设备分配。有关 VFIO 的更多信息，请参阅  [VFIO - “Virtual Function I/O”](https://docs.kernel.org/driver-api/vfio.html)。
- USB 设备在直通模式下运行，从而允许 guest 使用连接到主机的 USB 外设。QEMU 模拟 USB 控制器并与 host 上的 libusb 协作向客户机呈现 USB 外设。更多详细信息请参阅 [USB emulation](https://qemu-project.gitlab.io/qemu/system/devices/usb.html)。

### USB 直通概述

识别在主机上枚举的 USB 设备，以将其分配给 guest。要查看主机上枚举的所有 USB 设备，请使用 `lusb` 命令。通过其 `vendor id` 和 `product id` 找到设备。

在以下示例中，USB 闪存盘的 `vendor id` 是 0x0781， `product id` is 0x5567。

sh-5.1# lsusb
    Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
    Bus 001 Device 004: ID 0781:5567 SanDisk Corp. Cruzer Blade
    Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    Copy to clipboard

Note

复制以下主机文件系统中的 `/mnt/overlay/guest/libvirt_usb.xml` 的 XML 文件，并根据 `vendor id` 和 `product id` 修改此 XML 文件。

使用以下示例 XML 启动 Guest VM。启动后，连接到控制台，并验证虚拟机中的 `lsusb` 输出。确保输出列出了分配给虚拟机的 USB 设备。

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
      <name>simple_usb</name>
      <memory unit='KiB'>2097152</memory>
      <vcpu placement='static'>4</vcpu>
      <resource>
        <partition>/machine</partition>
      </resource>
      <os>
        <type arch='aarch64' machine='virt-6.2'>hvm</type>
        <kernel>/mnt/overlay/guest/Image</kernel>
        <cmdline>root=/dev/vda</cmdline>
        <boot dev='hd'/>
      </os>
      <features>
        <gic version='3'/>
      </features>
      <cpu mode='host-passthrough' check='none'/>
      <devices>
        <console type='pty'>
        </console>
        <disk type="file" device="disk">
          <driver name="qemu" type="raw"/><!-- Specify rootfs image file here -->
          <source file="/mnt/overlay/guest/rootfs.ext4"/>
          <target dev="vda" bus="virtio"/>
        </disk>
        <controller type='usb' index='0' model='qemu-xhci' ports='4'/>
        <hostdev mode='subsystem' type='usb' managed='yes'>
          <source><!-- Specify USB device VID/PID here -->
            <vendor id='0x0781'/>
            <product id='0x5567'/>
          </source>
        </hostdev>
      </devices>
    </domain>
    Copy to clipboard

### PCI 概述

识别在主机上枚举的 PCI 设备，以将其分配给 guest。要查看主机上枚举的所有 PCI 设备，请使用  <cite>lspci</cite> 命令。通过其 `[domain:]bus:device.function`  查找该设备。更多信息请参阅 [lspci(8) — Linux manual page](https://man7.org/linux/man-pages/man8/lspci.8.html)。

以下示例显示了 `Ethernet controller: Aquantia Corp. AQC107 NBase-T/IEEE 802.3bz` 设备的域、总线、设备和功能的支持值：

- 域为 0001
- 总线为 01
- 设备为 00
- 功能为 0

sh-5.1# lspci
    0000:00:00.0 PCI bridge: Qualcomm Device 0115
    0000:01:00.0 Network controller: Qualcomm QCNFA765 Wireless Network Adapter (rev 01)
    0001:00:00.0 PCI bridge: Qualcomm Device 0115
    0001:01:00.0 Ethernet controller: Aquantia Corp. AQC107 NBase-T/IEEE 802.3bz
    Copy to clipboard

Note

将 XML 内容复制到 `/mnt/overlay/guest/libvirt_pci.xml` 文件，并根据设备要求修改 XML 文件中的 `hostdev` 部分。

要启动虚拟机，请参阅 [Libvirt](https://docs.qualcomm.com/doc/80-70017-3SC/topic/features.html#id22)。启动 Guest VM 后，连接到控制台并验证 guest 中的 `lspci` 输出。确保输出列出了分配给 guest 的 PCI 设备。

Note

输出会根据 QEMU 和 Libvirt 选择的 guest PCI 拓扑显示不同的插槽。

在下面的 XML 文件中，当 `managed` 在 `hostdev` 中被标为 *yes* 时，PCI 设备在传递给 guest 之前会与主机分离，并在 guest 退出后重新连接到主机。有关更多详细信息，请参阅 [USB / PCI / SCSI devices](https://libvirt.org/formatdomain.html#usb-pci-scsi-devices)。

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
      <name>simple_pci</name>
      <memory unit='KiB'>2097152</memory>
      <vcpu placement='static'>4</vcpu>
      <resource>
        <partition>/machine</partition>
      </resource>
      <os>
        <type arch='aarch64' machine='virt-6.2'>hvm</type>
        <kernel>/mnt/overlay/guest/Image</kernel>
        <cmdline>root=/dev/vda</cmdline>
        <boot dev='hd'/>
      </os>
      <features>
        <gic version='3'/>
      </features>
      <cpu mode='host-passthrough' check='none'/>
      <devices>
        <console type='pty'>
        </console>
        <disk type="file" device="disk">
          <driver name="qemu" type="raw"/>
          <source file="/mnt/overlay/guest/rootfs.ext4"/>
          <target dev="vda" bus="virtio"/>
        </disk>
        <hostdev mode='subsystem' type='pci' managed='yes'>
          <source><!-- specify your PCI device details here -->
            <address domain='0x0001' bus='0x01' slot='0x00' function='0x0'/>
          </source>
        </hostdev>
      </devices>
    </domain>
    Copy to clipboard

### UART 直通概述

识别与 UART 对应的 `/dev/ttyX` teletype (TTY) 设备文件，以便从虚拟机中使用它。 确保主机上没有应用程序在使用此接口。

Note

将 XML 内容复制到主机上的 `/mnt/overlay/guest/libvirt_uart.xml` 文件，并根据设备要求修改 TTY 设备文件。

启动 Guest VM 并连接到控制台。位于 `/dev/virtio-ports/hostserial` 的串行接口充当主机上真实 UART 的前端。使用以下 XML 文件：

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
      <name>simple_uart</name>
      <memory unit='KiB'>2097152</memory>
      <vcpu placement='static'>4</vcpu>
      <resource>
        <partition>/machine</partition>
      </resource>
      <os>
        <type arch='aarch64' machine='virt-6.2'>hvm</type>
        <kernel>/mnt/overlay/guest/Image</kernel>
        <cmdline>root=/dev/vda</cmdline>
        <boot dev='hd'/>
      </os>
      <features>
        <gic version='3'/>
      </features>
      <cpu mode='host-passthrough' check='none'/>
      <devices>
        <console type='pty'>
        </console>
        <channel type='dev'>
          <source path='/dev/ttyMSM0'/>
          <target type='virtio' name='hostserial'/>
          <address type='virtio-serial' controller='0' bus='0' port='1'/>
        </channel>
        <disk type="file" device="disk">
          <driver name="qemu" type="raw"/>
          <source file="/mnt/overlay/guest/rootfs.ext4"/>
          <target dev="vda" bus="virtio"/>
        </disk>
      </devices>
    </domain>
    Copy to clipboard

### KVM 定制

以下功能允许您修改 KVM hypervisor 以满足特定需求：

### 远程命令执行

要在 guest 操作系统用户空间中启用 QEMU 客户端代理，请从 host 上对 Guest VM 运行远程命令。 有关 `qemu-ga` 的更多信息，请参阅 [QEMU Guest Agent](https://qemu-project.gitlab.io/qemu/interop/qemu-ga.html)。

`qemu-agent-command` 是 virsh 命令，包括 `guest-exec` 和 `guest-exec-status` 子命令，用于执行和验证 Guest VM 的状态或输出。 有关如何通过 virtio-serial 接口配置 `qemu-ga` 的更多信息，请参阅 [QEMU Guest Agent](https://wiki.libvirt.org/Qemu_guest_agent.html)。

有关 `virt-exec` 如何包装 virsh 命令并提供接口的更多信息，请参阅 [kvm-qemu/virt-exec](https://github.com/ildar-shaimordanov/my-scripts/blob/master/kvm-qemu/virt-exec)。

以下示例显示了如何使用 `virt-exec` 工具从 host 在 Guest VM 上运行 `/proc/meminfo`。

sh-5.2# ./virt-exec testvm cat /proc/meminfo | grep -i total
    MemTotal:        1968056 kB
    SwapTotal:             0 kB
    VmallocTotal:   133141626880 kB
    CmaTotal:          32768 kB
    HugePages_Total:       0
    Copy to clipboard

### 看门狗配置

QEMU 模拟的 I6300 ESB 看门狗设备在 Guest VM 中受支持。Linux 内核有一个用于此看门狗的驱动程序，并提供标准的看门狗字符设备。要启用看门狗，请在 guest 内核配置中设置 `CONFIG_I6300ESB_WDT`。Guest 用户空间守护进程必须定期投喂看门狗。

Guest 的 Libvirt XML 有一个选项，可以在看门狗超时时选择 `poweroff` 或 `reset`。有关更多信息，请参阅 [Watchdog devices](https://libvirt.org/formatdomain.html#watchdog-devices)。

将以下代码片段添加到 guest XML 中，以在 QEMU 中启用 I6300 ESB 看门狗仿真。默认操作是  `reset`，即重新启动 guest。

<devices>
      <watchdog model='i6300esb'/>
    </devices>
    Copy to clipboard

### KVM 跟踪

要启用内核 KVM 跟踪，请运行以下命令：

echo 1 > /sys/kernel/tracing/events/kvm/enable
    Copy to clipboard

KVM guest 交互记录在内核函数跟踪 （ftrace） 中。要检查 KVM 和 Guest VM 之间的交互，请读取内核跟踪缓存。

QEMU 还支持跟踪事件，可以将其重定向到内核 ftrace。有关如何将 QEMU 跟踪后端事件重定向到 ftrace 缓存的更多信息，请参阅 [Trace backends](https://qemu-project.gitlab.io/qemu/devel/tracing.html#trace-backends)。此选项在 Qualcomm Linux 发布版本中默认选择。

以下命令启动了 guest，并在 QEMU 代码中启用了 virtio 追踪:

qemu-system-aarch64 \
        -M virt -m 2G \
        -kernel /mnt/overlay/guest/Image \
        -drive file=/mnt/overlay/guest/rootfs.ext4,if=virtio,format=raw \
        -append "root=/dev/vda" \
        -cpu host --enable-kvm -smp 4 -nographic \
        -trace "virtio*"
    Copy to clipboard

## 实时 (RT) 内核概述

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

足以下条件的系统可归类为与实时兼容：

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

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

当考虑将 Linux 作为 RTOS 时，应用 `PREEMPT_RT` 修补程序并启用完全可抢占内核的配置。

针对每个发布的内核版本，RT 内核维护者维护树外 `PREEMPT_RT` 补丁。

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by Microsoft Visio, SVG Export explore_QSC.svg Page-1 -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="4.7907in" height="2.55661in" viewbox="0 0 344.931 184.076" xml:space="preserve" color-interpolation-filters="sRGB" class="st7"><v:documentproperties v:langid="1033" v:viewmarkup="false"></v:documentproperties>
<style>.svg-1 .st1 { fill: none; stroke: none; stroke-linecap: round; stroke-linejoin: round; stroke-width: 0.75 }
.svg-1 .st2 { fill: #000000; fill-opacity: 0.6; stroke: none; stroke-linecap: butt; stroke-width: 1.25 }
.svg-1 .st3 { fill: #f3f3f2; stroke: none; stroke-linecap: butt; stroke-width: 1.25 }
.svg-1 .st4 { fill: #3253dc; stroke: #5d6e43; stroke-linecap: butt; stroke-width: 1.25 }
.svg-1 .st5 { fill: none; stroke: none; stroke-linecap: butt; stroke-width: 1.25 }
.svg-1 .st6 { fill: #ffffff; font-family: SimHei; font-size: 0.833336em; font-weight: bold }
.svg-1 .st7 { fill: none; fill-rule: evenodd; font-size: 12px; overflow: visible; stroke-linecap: square; stroke-miterlimit: 3 }</style>
<g v:mid="0" v:index="1" v:groupcontext="foregroundPage">	<title></title>	<v:pageproperties v:drawingscale="1" v:pagescale="1" v:drawingunits="19" v:shadowoffsetx="9" v:shadowoffsety="-9"></v:pageproperties>	<v:layer v:name="Flowchart" v:index="0"></v:layer>	<v:layer v:name="Connector" v:index="1"></v:layer>	<g id="group7-1" transform="translate(1.25,-1.25)" v:mid="7" v:groupcontext="group">		<title></title>		<a xlink:href="https://players.brightcove.net/1414329538001/4JiZQnWhg_default/index.html?videoId=6362756330112" target="_blank">			<g id="shape1-2" v:mid="1" v:groupcontext="shape">				<title></title>				<rect v:rectcontext="foreign" x="0" y="1.62501" width="342.431" height="182.451" class="st1"></rect>				<image x="0" y="1.62501" width="342.431" height="182.451" xlink:href="data:image/png;base64,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"></image>				<rect v:rectcontext="foreign" x="0" y="1.62501" width="342.431" height="182.451" class="st1"></rect>			</g>		</a>		<a xlink:href="https://players.brightcove.net/1414329538001/4JiZQnWhg_default/index.html?videoId=6362756330112" target="_blank">			<g id="group6-6" v:mid="6" v:groupcontext="group">				<title></title>				<g id="shape2-7" v:mid="2" v:groupcontext="shape" v:layermember="0">					<title></title>					<v:custprops>						<v:cp v:nameu="Cost" v:lbl="Cost" v:prompt="" v:type="7" v:format="@" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>						<v:cp v:nameu="ProcessNumber" v:lbl="Process Number" v:prompt="" v:type="2" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>						<v:cp v:nameu="Owner" v:lbl="Owner" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>						<v:cp v:nameu="Function" v:lbl="Function" v:prompt="" v:type="0" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>						<v:cp v:nameu="StartDate" v:lbl="Start Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>						<v:cp v:nameu="EndDate" v:lbl="End Date" v:prompt="" v:type="5" v:format="" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0"></v:cp>						<v:cp v:nameu="Status" v:lbl="Status" v:prompt="" v:type="4" v:format=";Not Started;In Progress;Completed;Deferred;Waiting on Input" v:sortkey="" v:invis="false" v:ask="false" v:langid="1033" v:cal="0" v:val="VT4()"></v:cp>					</v:custprops>					<v:userdefs>						<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>						<v:ud v:nameu="DefaultWidth" v:prompt="" v:val="VT0(1):0"></v:ud>						<v:ud v:nameu="DefaultHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>						<v:ud v:nameu="ResizeTxtHeight" v:prompt="" v:val="VT0(0.75):0"></v:ud>					</v:userdefs>					<rect x="0" y="140.778" width="342.431" height="43.2978" class="st2"></rect>				</g>				<g id="shape3-9" v:mid="3" v:groupcontext="shape" v:layermember="1;0" transform="translate(13.7155,-11.2357)">					<title></title>					<v:userdefs>						<v:ud v:nameu="visVersion" v:prompt="" v:val="VT0(15):26"></v:ud>					</v:userdefs>					<path d="M0 173.62 A10.4575 10.4575 0 1 1 20.92 173.62 A10.4575 10.4575 0 1 1 0 173.62 Z" class="st3"></path>				</g>				<g id="shape4-11" v:mid="4" v:groupcontext="shape" transform="translate(28.579,342.601) rotate(180)">					<title></title>					<v:userdefs>						<v:ud v:nameu="visVersion" v:val="VT0(15):26"></v:ud>					</v:userdefs>					<path d="M6.55 176 L0 180.41 L6.55 184.08 L6.55 176 Z" class="st4"></path>				</g>				<g id="shape5-13" v:mid="5" v:groupcontext="shape" transform="translate(38.779,-8.34862)">					<title></title>					<desc>Video: Explore Real-time Linux®</desc>					<v:textblock v:margins="rect(4,4,4,4)" v:verticalalign="0"></v:textblock>					<v:textrect cx="134.642" cy="172.11" width="269.29" height="23.9318"></v:textrect>					<rect x="0" y="160.144" width="269.284" height="23.9318" class="st5"></rect>					<text x="4" y="173.14" class="st6" v:langid="1033"><v:paragraph></v:paragraph><v:tablist></v:tablist>视频：探索实时 Linux®</text>					</g>			</g>		</a>	</g></g>
</svg>

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

Note

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

![../_images/RT-kernel-build-sequence.png](data:image/png;base64,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)

**图：编译顺序**

### 设置工作区

Qualcomm Linux 内核支持 LTS RT 内核 (6.6.x)，该内核在 `meta-qcom-realtime` 层的 `recipes-kernel/linux/linux-kernel-qcom-rt_6.6.bb` 文件中通过 Yocto 配方进行维护。

Qualcomm Linux 中的 Linux RT 内核配方称为 `linux-qcom-base-rt`。

有关克隆工作区和获取所有 Qualcomm Linux 元层以使用 Qualcomm RT Linux 的更多信息，请参阅[如何与实时 Linux 同步和编译？](https://docs.qualcomm.com/bundle/publicresource/topics/80-70017-254/how_to.html#how-to-sync-and-build-with-real-time-linux-)

### 启用实时内核

Qualcomm Linux `meta-qcom-realtime` 层支持 `linux-qcom-base-rt` 配方，它默认获取并编译受支持机器的 Qualcomm Linux 内核。

`meta-qcom-realtime` 层在现有层之上应用更改。在内核编译期间，`meta-qcom-realtime` 层根据内核版本附加上游 `PREEMPT_RT` 补丁，并允许实时配置。

Note

- 定制 BSP 使用 [linux-qcom-custom-rt_6.6.bb](https://github.com/quic-yocto/meta-qcom-realtime/blob/kirkstone/recipes-kernel/linux/linux-qcom-custom-rt_6.6.bb)。
- 基本 BSP 使用 [linux-qcom-base-rt_6.6.bb](https://github.com/quic-yocto/meta-qcom-realtime/blob/kirkstone/recipes-kernel/linux/linux-qcom-base-rt_6.6.bb)。

以下是 RT 基础参考文件的示例代码：

require recipes-kernel/linux/linux-qcom-base-rt_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-70017-3SC/topic/getting_started_chapter2.html#supported-machines)。

### 配置实时内核

- 按照以下步骤配置 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-qcom-base-rt/configs/qcom_rt.cfg` 配方的配置文件。
    - 将配置文件附加到 `meta-qcom-realtime/recipes-kernel/linux/linux-qcom-base-rt_6.6.bb` 文件中的 `KERNEL_CONFIG_FRAGMENTS`。
- 要将配置片段添加到 RT 内核，可进行以下更改：

KERNEL_CONFIG_FRAGMENTS:append = " ${WORKDIR}/qcom_rt.cfg"
        Copy to clipboard
- 若要修改内核命令行，可将命令行参数添加到 `meta-qcom-realtime/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 内核中使用了可选和必选内核配置。

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

`CONFIG_PREEMPT_RT` 标志默认为启用状态，作为 `linux-qcom-base-rt_6.6.bb` 配方的一部分。

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

# 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=y
    Copy 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=y
    Copy to clipboard

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

- `CONFIG_NO_HZ_FULL` - 启用后，它会配置内核以避免向具有单个可运行任务的 CPU 发送调度时钟中断信号。
- `CONFIG_CPUSETS` - 使用 `CONFIG_CPUSETS` 配置选项以启用 `cpuset`，其中 CPU 被分组形成一个集合。

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

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

**图：RT 内核验证**

### 编译实时内核

若要编译 RT 内核，可使用以下命令：

MACHINE=<SoC>-<board>-<variant> DISTRO=qcom-wayland QCOM_SELECTED_BSP=base 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-image
    Copy to clipboard

### 测试实时内核

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

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

1. 如需获取 RT 测试套件源代码，可访问 [rt-tests/rt-tests.git](https://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git/)。
2. 若要将 RT 测试套件包括在镜像中，可更改标准 Yocto 编译版本中的 `layer.conf` 文件：

IMAGE_INSTALL:append = "rt-tests numactl"
        Copy to clipboard
3. 运行以下周期性测试：

cgexec -g cpuset:core1-3 cyclictest -a 1-3 -t 3 -m -l 100000000 -i 1000 -p 99 -h 800
        Copy 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_RT
        Copy 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 内核。要进行切换，请更改 `meta-qcom-realtime/conf/layer.conf` 文件中 `linux-qcom-base-rt` 的虚拟/内核设置并再次编译。

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

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

有关 RT 内核锁定原语的详细信息，参见[Lock
types and their rules—The Linux Kernel
documentation](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.cpus
        Copy to clipboard

以下示例显示如何在 `meta-qcom-realtime/conf/layer.conf` 中添加内核命令行参数以禁用 RCU 回调（**rcu\_nocbs**）：

- 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: Jan 25, 2025

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