分析开机内存占用的案例


1. 实验设备

SSC335 (DDR 64M)


2. 主要内存分类

  1. HW预留的内存

    bootargs里指定的LX_MEM只有0x3fe0000,是因为保留了DDR尾部的128K,在insmod mi_sys.ko的时候会调用config_tool解析mmap.ini,将其用于EMI(jpeg不走SRAM走DRAM时使用,可以裁减)

  2. mma

    由cmd line传入kernel,来从mem中预留对应的config size,这部分mem主要提供给MI modules使用

  3. cma

    这部分在kernel config里指定,保留给emac,cipher和bdma使用。

  4. Linux manager Part


3. 详细说明

  1. 当vpe port0 绑定jpeg使用realtime mode,只有port0出YUV422才走SRAM(不占用DDR),当port0出YUV420,会占用部分DDR,即HW预留的128K。一般推荐port0出YUV422格式,则这块buffer可以裁减:将bootargs里的LX_MEM改成0x4000000,更新附件mmap.ini即可。

  2. 查看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里。

  3. 查看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 */