Skip to main content
Qualcomm® Linux 内核基线支持所有内存管理特性和分配器。以下信息概述了如何自定义内存映射(memory map)以及执行堆(heap)管理。 有关 Linux 内核内存管理的更多信息,请参阅 Memory management 内存映射 内存映射描述了在内核启动期间为调制解调器、摄像头、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 allocator)用于可移动(movable)分配。 要更改默认 CMA 区域的大小,请在内核命令行参数中使用 cma=size_in_MB。有关如何使用该内核参数的更多信息,请参阅以下示例:
自定义 CMA 区域在 reserved-memory 节点下定义,并带有表示 CMA 区域的 shared-dma-pool compatible 标记:
以下是启动时保留的 aDSP CMA 内存区域的示例日志:

支持的堆

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

使用 DMA-BUF 堆

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

将 ZRAM 配置为交换设备

ZRAM 是一种压缩交换机制,它在 RAM 中创建一个虚拟块设备。ZRAM 在内核 defconfig 中作为模块启用。 ZRAM 在 Yocto 构建中的 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 区域的语法