主篇文章主要记录mdm9x07的内存使用情况

内存总大小

aboot将内存大小更新到设备树中,kernel启动时从设备树获取

setup_machine_fdt->early_init_dt_scan_nodes->early_init_dt_scan_memory

内存划分

系统将内存划分成4大块

  • modem DSP使用,默认大小71M

    在设备树modem_adsp_mem中配置,使用”removed-dma-pool”从主内存中划分一块保留给mode DSP使用

    实际使用大小由modem固件决定,目前为70M

  • external_image_mem,默认大小4M

    作用未知(猜测是CPU的RPM核使用了这块区域),在设备树external_image_mem中配置

  • audio_mem,默认大小4M

    在设备树audio_region中配置,使用shared-dma-pool从主内存中划分一块保留给audio使用,系统将其划分成CMA内存

  • 默认CMA内存,默认大小4M

    在defconfig(CONFIG_CMA_SIZE_MBYTES)或cmdline(cma)中配置,供系统申请DMA内存使用

    | 功能 | 内存占用 | 备注 |
    | ——————- | ———– | ——————- |
    | 系统原子操作 | 256K | |
    | qcom,pm | 4K | 实际只使用了256字节 |
    | nand | 8K+4K+4K+4K | 实际只使用了520字节 |
    | msm_hsusb | 4K+4K | |
    | sdhci | 16K+16K | 2个sdhci控制器 |
    | soc:qcom,lpm-levels | 8K | |
    | pil_boot | 1M+4K | |
    | emac | 20K | |

    其中pil_boot由subsystem_get触发,modem_powerup
    没有modem分区的设备,由psmd进程加载
    有modem分区的设备由kernel加载

保留内存

Memory: 31404K/126976K available (7349K kernel code, 990K rwdata, 3280K rodata, 312K init, 1016K bss, 95572K reserved)

linux系统本身可见所以内存,但系统运行需要保留一些内存供其它功能使用,具体如下(以上述日志举例):

  • kernel运行需要保留一部分,日志中“7349K kernel code, 990K rwdata, 3280K rodata, 312K init, 1016K bss”的部分,总共12947K
  • 页表使用16K,细节可查看arm_mm_memblock_reserve
  • 设备树88K(4K对齐)
  • 上一节中描述的保留内存,71M(modem_adsp_mem)+4M(audio_mem)+4M(CMA)
  • ioremap保留1625K

总共95572K

注:其中external_image_mem为no-map内存,不记录到保留内存范畴

available内存

Memory: 31404K/126976K available (7349K kernel code, 990K rwdata, 3280K rodata, 312K init, 1016K bss, 95572K reserved)

以上述日志举例,硬件内存大小为128M

设备树中external_image_mem保留的内存为no-map,不映射到linux系统下,linux系统下的available内存会减去这一部分(4M),剩下124M(126976K)

31404K=126976K -95572K

应用层可见总内存

root@router:~# free
total used free shared buffers cached
Mem: 41476 39020 2456 128 0 6712

包含available内存的31404K

kernel启动后会释放启动时占用的一部分内存,具体如下

  • 释放kernel中_init段空间312K
  • 设备树中modem_adsp_mem指定了no-map-fixup,映射完成后可释放ioremap占用的空间544K
  • 设备树中modem_adsp_mem配置为71M,modem只使用了70M,释放多余的空间1M

另外CMA内存(8M:包含audio_mem和默认CMA)作为应用层可见内存

以上部分加起来总共41476K