Skip to main content
Qualcomm® Linux 内核基线支持所有内存管理特性和分配器。以下信息概述了如何自定义内存映射并执行堆管理。 有关 Linux 内核内存管理的更多信息,请参阅内存管理。 内存映射 内存映射描述了在内核启动期间为各子系统(如调制解调器、相机、aDSP 和 cDSP)保留的区域。 内存映射会为 DTSI 中划出(carved out)的区域设置 no-map,使内核无法访问这些区域。 可配置的划出区域在 arch/arm64/boot/dts/qcom/kodiak.dtsi 文件的 reserved-memory 节点下定义。
对于 Qualcomm SoC,请查看 SoC 专属的 Qualcomm DTSI 文件以获取此信息。
以下早期启动日志显示了为不同子系统创建划出区域的过程:

连续内存分配器

Qualcomm Linux 发行版支持使用 CMA 来分配大块物理连续内存。CMA 在启动时保留一大块物理连续内存区域,并为 CMA 分配提供物理连续的内存。在不使用时,CMA 内存可供内核伙伴(buddy)分配器用于可移动分配。 要更改默认 CMA 区域的大小,请在内核命令行参数中使用 cma=size_in_MB。有关如何使用该内核参数的更多信息,请参阅以下示例:
自定义 CMA 区域在 reserved-memory 节点下定义,并带有 shared-dma-pool compatible 标记来指示 CMA 区域:
以下是启动时保留 aDSP CMA 内存区域的示例日志:

支持的堆

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

使用 DMA-BUF 堆

Qualcomm Linux 发行版支持通过 DMA-BUF 堆来分配自定义 CMA 堆。使用 DMA-BUF 堆时,/dev/dma_heap 文件系统中会为每个堆提供一个设备文件。除系统堆和通用的 CMA reserved 堆外,您还可以创建自己的 CMA 类型 DMA-BUF 堆。 以下示例程序演示了如何使用 Qualcomm Linux 内核在 /dev/dma_heap/system 中创建的 DMA-BUF 系统堆:

将 ZRAM 配置为交换设备

ZRAM 是一种压缩交换机制,它在 RAM 中创建一个虚拟块设备。ZRAM 在内核 defconfig 中作为模块启用。 在 Yocto 构建中,ZRAM 在 recipes-extended/zram/zram/zram-swap-init-update 文件中配置。 要启用或配置 ZRAM,请执行以下操作:
要将 ZRAM 配置为交换设备,请参阅 zram: Compressed RAM-based block devices。

扩展内存映射

要扩展内存映射,请在 DTSI 文件中调整内存区域的地址和大小。 使用以下信息来扩展划出区域: 使用以下语法,在 arch/arm64/boot/dts/qcom/<SoC>-<board>-<variant>.dts 文件的 reserved-memory 节点中添加划出区域:
例如:
表:划出区域的语法
  • 任何区域都不应重叠。如果必须增大某个区域的大小,请移动所有后续区域,并在设备树中进行配置以避免重叠。
  • 内核要求为内核使用而定义的所有内存区域边界都是 1 MB。
  • 现有划出区域受可信固件保护,内核无法访问。减小其大小或删除它们可能导致外部中止(external abort),从而导致内核崩溃。
添加 CMA 区域 要在 arch/arm64/boot/dts/qcom/<SoC>-<board>-<variant>.dts 文件的 reserved-memory 节点下添加 CMA 区域,请使用以下语法:
表:添加 CMA 区域的语法