摘要:
项目开发的可行性评估中,常涉及到内存的使用评估,这对项目DDR大小的选型及成本控制至关重要,
本文主要是梳理了内存当前BSP内存统计方案,找到内存统计过程中的关键参数,以便后续项目评估过程中提供更精确的BSP内存使用情况。
BSP内存统计
针对BSP的内存统计,其实有一个简单粗暴的方法。
即 ( 预留OS的内存大小 - 系统启动后未运行APP使用的内存大小 = BSP使用的内存大小 )
举个栗子:
xxx平台,uboot下配置OS内存(mem:A),修改启动脚本使其不加载APP,kernel启动后查看free剩余内存(free:B)
(mem:A) - (free:B) = (BSP使用内存大小)
即当前产品的BSP需要占用(A-B)的内存。
那么内存分别在BSP的哪些部分被用掉了呢?如果需要优化和裁剪BSP使用的内存,有哪些地方可以缩小呢?
kernel加载占用内存
找到在加载kernel过程中这样一行打印:
Memory: xxxx72K/xxxx84K available (xxxxK kernel code, xxxK rwdata, xxxK rodata, xxxK init, xxx bss, xxxK reserved, xxK cma-reserved)
这行打印代表了系统内存的可用情况,其中包括了内核代码、读写数据、只读数据、初始化数据、未初始化数据和保留空间等信息。
/proc/meminfo占用内存
查看“/proc/meminfo”信息
关注以下成员的内存使用情况
| 内存分层 | 成员 | 描述 |
|---|---|---|
| MemTotal | 所有可用RAM大小(即物理内存减去一些预留位和内核的二进制代码大小) (HighTotal + LowTotal),系统从加电开始到引导完成,BIOS等要保留一些内存, 内核要保留一些内存,最后剩下可供系统支配的内存就是MemTotal。这个值在系统运行期间一般是固定不变的。 | |
MemFree | LowFree与HighFree的总和,被系统留着未使用的内存,MemFree是说的系统层面 | |
| 用户态 | Cached | 被高速缓冲存储器(cache memory)用的内存的大小(等于 diskcache minus SwapCache ) |
Active | 在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,除非非常必要否则不会被移作他用. (Active(anon) + Active(file)) | |
Inactive | 在不经常使用中的缓冲或高速缓冲存储器页面文件的大小,可能被用于其他途径. (Inactive(anon) + Inactive(file)) | |
| 内核态 | Slab | 内核数据结构缓存的大小,可以减少申请和释放内存带来的消耗 |
KernelStack | 常驻内存,每一个用户线程都会分配一个kernel stack(内核栈) | |
PageTables | 管理内存分页页面的索引表的大小 |
即,“free”命令中“used”的使用情况,相当于
Active(xxxK) + Inactive(xxxK) + Slab(xxxK) + KernelStack(xxxK) + PageTables(xxK) + X = xxxxK
(X 是通过alloc_pages/__get_free_page分配的内存,统计不到)
文件系统挂载占用内存
通过挂载前统计“free”、挂载文件系统后统计“free”,计算两者差值,得到文件系统挂载占用内存大小。
模块加载占用内存
通过挂载前统计“free”、加载KO模块后统计“free”,计算两者差值,得到加载KO模块占用内存大小。

1740

被折叠的 条评论
为什么被折叠?



