分析开机内存占用的案例
1. 实验设备¶
SSC335 (DDR 64M)
2. 主要内存分类¶
-
HW预留的内存
bootargs里指定的LX_MEM只有0x3fe0000,是因为保留了DDR尾部的128K,在insmod mi_sys.ko的时候会调用config_tool解析mmap.ini,将其用于EMI(jpeg不走SRAM走DRAM时使用,可以裁减)
-
mma
由cmd line传入kernel,来从mem中预留对应的config size,这部分mem主要提供给MI modules使用
-
cma
这部分在kernel config里指定,保留给emac,cipher和bdma使用。
-
Linux manager Part
3. 详细说明¶
-
当vpe port0 绑定jpeg使用realtime mode,只有port0出YUV422才走SRAM(不占用DDR),当port0出YUV420,会占用部分DDR,即HW预留的128K。一般推荐port0出YUV422格式,则这块buffer可以裁减:将bootargs里的LX_MEM改成0x4000000,更新附件mmap.ini即可。
-
查看mma信息cat /proc/mi_modules/mi_sys_mma/mma_heap_name0
图3-1
Mma size由bootargs里的sz指定。公板64MDDR的系统,默认分析32M给mma。具体mma里每个模块如何使用请参考《mma内存占用》。需要注意:mma内存是对于kernel是reserved的,不会体现在free里。
-
查看cma信息cat /sys/class/mstar/msys/dmem
图3-2
Cma size由kernel config指定:CONFIG_CMA_SIZE_MBYTES=2
需要注意:cma受kernel管理,当OS内存不够的时候,cma空闲内存会被当做OS内存使用。会体现在free里。
此时cma已经使用:0x1000 + 0x1000 + 0x10040 + 0x812 = 128K
4. kernel管理的os内存¶
图4-1
Kernel image代码段和堆栈 数据段占用:1802 + 199 + 956 + 100 = 3057K;
Reserved(3808K)里除了以上的3057K,还有initrd的内存(33x默认不走ramdisk因此没有)、dtb的内存、fdt指定的reserved-memory(默认没有)、一级页表等。
32640K = 64M DDR – 32M MMA – 128k
26784K = 64M DDR – 32M MMA – 128k - Reserved(3808K)
此时cat /proc/meminfo:
图4-2
Meminfo里的memTotal 即是开机log里的26784K + 2M cma = 28832K
开机就占用os内存的主要有以下:
cache包含:so或者bin(使用到的时候才动态加载到内存中),读写SD卡文件,共享内存,tmpfs,devtmpfs。
Buffer: 用来给文件做缓冲大小。
slab会包含:驱动里kmalloc()或者kmem_cache_create()。但驱动里vmalloc和alloc_pages/__get_free_page不会被slab统计到。
shmem会包含:shmget()的共享内存,tmpfs,devtmpfs。
PageTable:用于将内存的虚拟地址翻译成物理地址,/proc/meminfo中的PageTables统计了Page Table所占用的内存大小。
KernelStack:每一个用户线程都会分配一个kernel stack(内核栈),它是kernel消耗的内存。统计值是/proc/meminfo的KernelStack。
查看user space所有进程Pss这和,为1239K
图4-3
查看ko和kernel通过vmalloc申请的内存(统计不了alloc_pages/__get_free_page):4349952B
图4-4
5. mmap.ini¶
//////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2006-2009 MStar Semiconductor, Inc. // All rights reserved. // // Unless otherwise stipulated in writing, any and all information contained // herein regardless in any format shall remain the sole proprietary of // MStar Semiconductor Inc. and be kept in strict confidence // ("MStar Confidential Information") by the recipient. // Any unauthorized act including without limitation unauthorized disclosure, // copying, use, reproduction, sale, distribution, modification, disassembling, // reverse engineering and compiling of the contents of MStar Confidential // Information is unlawful and strictly prohibited. MStar hereby reserves the // rights to any and all damages, losses, costs and expenses resulting therefrom. // //////////////////////////////////////////////////////////////////////////////// #define SCA_TOOL_VERSION "SN SCA V3.0.2 " //////////////////////////////////////////////////////////////////////////////// // DRAM memory map // // Every Module Memory Mapping need 4 define, // and check code in "msAPI_Memory_DumpMemoryMap" // 1. XXX_AVAILABLE : For get avaialble memory start address // 2. XXX_ADR : Real Address with Alignment // 3. XXX_GAP_CHK : For Check Memory Gap, for avoid memory waste // 4. XXX_LEN : For the Memory size of this Module usage //////////////////////////////////////////////////////////////////////////////// #define ENABLE_MIU_1 0 #define ENABLE_MIU_2 0 #define MIU_DRAM_LEN 0x0004000000 #define MIU_DRAM_LEN0 0x0004000000 #define MIU_DRAM_LEN1 0x0000000000 #define MIU_DRAM_LEN2 0x0000000000 #define MIU_INTERVAL 0x0080000000 #define CPU_ALIGN 0x0000001000 //////////////////////////////////////////////////////////////////////////////// //MIU SETTING //////////////////////////////////////////////////////////////////////////////// #define MIU0_GROUP_SELMIU 0000:0000:0000:0000:0000:0000 #define MIU0_GROUP_PRIORITY 1:0:2:3 #define MIU1_GROUP_SELMIU 5016:0201:1280:80B8:0004:F61F #define MIU1_GROUP_PRIORITY 1:0:2:3 #define MIU2_GROUP_SELMIU 0000:0000:0000:0000:0000:0000 #define MIU2_GROUP_PRIORITY 0:0:0:0 //////////////////////////////////////////////////////////////////////////////// //MEMORY TYPE //////////////////////////////////////////////////////////////////////////////// #define MIU0 (0x0000) #define MIU1 (0x0001) #define MIU2 (0x0002) #define TYPE_NONE (0x0000 << 2) #define UNCACHE (0x0001 << 2) #define REMAPPING_TO_USER_SPACE (0x0002 << 2) #define CACHE (0x0004 << 2) #define NONCACHE_BUFFERABLE (0x0008 << 2) #define CMA (0x0010 << 2) //MIU_0_START /* E_LX_MEM */ #define E_LX_MEM_LAYER 0 #define E_LX_MEM_AVAILABLE 0x0000000000 #define E_LX_MEM_ADR 0x0000000000 //Alignment 0x01000 #define E_LX_MEM_GAP_CHK 0x0000000000 #define E_LX_MEM_LEN 0x0004000000 #define E_LX_MEM_MEMORY_TYPE (MIU0 | TYPE_NONE | UNCACHE | TYPE_NONE) #define E_LX_MEM_CMA_HID 0 //MIU_1_START #define MIU0_END_ADR 0x0004000000 #define MMAP_COUNT 0x0000000001 #define TEST_4K_ALIGN 1 /* CHK_VALUE = 3042213967 */