You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux 5.15.68中CMA预留区域显示0KB问题排查求助

问题:CMA预留区域显示为0KB的排查与解决

环境与配置详情

测试环境:Linux 5.15.68,QEMU ARM64虚拟机,1GB内存(地址范围0x80000000 ~ 0xbfffffff),计划将3/4内存(768MB)分配给CMA区域,1/8(128MB)分配给设备驱动。

设备树/reserved-memory节点配置:

reserved-memory {
    #address-cells = <2>;
    #size-cells = <2>;
    ranges;

    axpu_reserved_mem: axpursvd@90000000 {
        no-map;
        reg = <0x0 0xc0000000 0x0 0x8000000>;
    };

    linux,cma {
        compatible = "shared-dma-pool";
        reusable;
        size = <0 0x30000000>;
        alloc-ranges = <0 0x90000000 0 0x30000000>;
        linux,cma-default;
    };
};

启动异常日志

系统启动时内存信息显示CMA预留为0KB:

Memory: 1020140K/1048576K available (3200K kernel code, 386K rwdata, 808K rodata, 7808K init, 106K bss, 28436K reserved, 0K cma-reserved)

已配置的内核参数

CONFIG_MEMORY_ISOLATION=y
CONFIG_CONTIG_ALLOC=y
CONFIG_CMA=y
CONFIG_CMA_DEBUG=y
CONFIG_CMA_DEBUGFS=y
CONFIG_CMA_SYSFS=y
CONFIG_CMA_AREAS=7
# CONFIG_DMA_CMA is not set

已尝试操作

  • 在启动参数中添加cma=768MB
  • 修改CONFIG_CMA_AREAS为1
    上述操作均未解决问题。

问题根源与解决方案

1. 缺失核心依赖配置:CONFIG_DMA_CMA

ARM64架构下,内核解析设备树中的linux,cma节点依赖CONFIG_DMA_CMA选项启用。当前配置中该选项被注释,导致内核完全忽略设备树里的CMA配置,这是CMA预留显示为0KB的核心原因。

解决:
将内核配置中的# CONFIG_DMA_CMA is not set修改为:

CONFIG_DMA_CMA=y

2. 设备树中无效的预留内存区域

设备树里axpu_reserved_mem的reg配置<0x0 0xc0000000 0x0 0x8000000>指向的地址0xc0000000超出了虚拟机的内存范围(最大到0xbfffffff),这部分预留内存无效,还会干扰内核对reserved内存的统计。

解决:
修正axpu_reserved_mem的reg为有效内存范围内的地址,比如分配128MB的话:

axpu_reserved_mem: axpursvd@b0000000 {
    no-map;
    reg = <0x0 0xb0000000 0x0 0x10000000>;
};

3. 其他验证点

  • 确保alloc-ranges配置的地址范围完全落在虚拟机可用内存内:当前0x90000000 ~ 0xc0000000实际对应可用内存的0x90000000 ~ 0xbfffffff(刚好768MB),这部分配置正确,无需修改。
  • 设备树中linux,cma-default标记已设置,确保该CMA区域作为默认区域启用,无需额外配置CONFIG_CMA_DEFAULT_ON。

完成以上修改后,重新编译内核和设备树,启动虚拟机即可看到CMA预留区域正常统计。

内容的提问来源于stack exchange,提问作者Chan Kim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:50:25