mdm9x07内存使用分析
主篇文章主要记录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