如何计算sylixos系统当前实际耗费内存大小

有时候为了确定硬件平台应该采购多大的DDR或者考虑小内存平台是否能跑起sylixos或单纯的就想知道开启了许多应用后的系统当前内存使用量,我们需要计算sylixos系统当前实际耗费内存大小。

本文以zynq7000为例进行说明。

硬件平台的内存排布

如何计算sylixos系统当前实际耗费内存大小_第1张图片
如上图是zynq7000的内存空间排布图,里面有SOC自带的OCM内存区,也有外接的DDR内存区。
其中OCM内存一般是给BOOT ROM和FSBL阶段使用,uboot阶段还会使用DDR内存前面一部分,剩下的一般都交给操作系统来使用。

zynq7000的DDR内存区有1GB的空间,前面1MB还和OCM空间重叠,不能被访问。实际系统的中的DDR也不一定是1GB,也可能是128MB/256MB/512MB等。

SylixOS 的内存排布

一个系统可能有多块内存,sylixos并不会全部使用,而是只用指定的那部分。sylixos 会把分配给它的内存分为4个区来处理,详见《SylixOS内存空间映射关系》。
如何计算sylixos系统当前实际耗费内存大小_第2张图片

  • TEXT分区用来存放系统的镜像文件xxxx.bin,分区是要比这个文件大的,有时会大很多,多出的这些内存也不会被使用。
  • DATA分区除去放置.data段和.bss段外,剩余空间都是作为内核堆来管理的。内核堆是动分配的,可能占用率很低。
  • DMA和APP分区都是动态分配的,使用利率可以查到。
  • 4个区的大小分配可以从bsp工程的配置文件中找到。
    如何计算sylixos系统当前实际耗费内存大小_第3张图片
  • 运行过程中通过free命令可以查看到一些重要的内存消耗状态。
    如何计算sylixos系统当前实际耗费内存大小_第4张图片
  • kersys就是系统堆,可以查到总大小、当前使用量和最大使用量。
  • vmm physical zone列表中有两行,其中第一行就是DMA分区地址、大小和使用量。第二行是APP分区地址、大小和使用量。
  • 再往下面看,分别是sylixos的总物理内存大小,VMM管理内存总大小(包括DMA和APP分区)和VMM管理内存空闲总大小。

计算方法

sylixos实际消耗的内存分两类,固定消耗类和动态消耗类。

TEXT分区中是固定消耗类,只包括系统镜像大小,一般就是uboot加载的xxx.bin文件的大小。但有时加载的是xxx.elf文件,则并不是该文件的大小,而是连接后实际占用TEXT分区的大小,这个不太容易计算。总之TEXT分区内部还是会有一些空间。即系统镜像大小为image_size,则text_size - image_size就是浪费的空间。

DATA分区中的.data和.bss段是固定消耗类,这由代码中定义的静态变量决定,会一直占用个点地址的空间。这部分记做data_size。DATA分区的剩余部分都作为系统堆,记做sysheap,则sysheap_size - sysheap_used_size就是空闲的内存。

DMA和APP分区都是动态消耗类,只能获取某一时刻的使用量。记做dma_size和app_size。这两个分区也可合称为VMM分区,大小和空闲可以直接中free命令获取。记做vmm_size和vmm_free。

这样sylixos的实际总内存消耗就是:
sylixos_size = image_size + data_size + sysheap_used_size + vmm_size - vmm_free。

计算举例

以前面收集的zynq7000信息为例,计算实际内存消耗。

  • 系统镜像大小为3,334,228B,即3.3MB。而TEXT分区实际给了6MB空间。image_size = 3.3MB。
  • DATA分区大小为128MB,内核堆大小为119.6MB,用了19%。
  • 则data_size = 128 - 119.6 = 7.4MB,sysheap_used_size = 23.3MB。
  • vmm_size = 894MB,vmm_free = 891MB

sylixos_size = image_size + data_size + sysheap_used_size + vmm_size - vmm_free
= 3.3 + 7.4 + 23.3 + 894 - 891
= 37MB

你可能感兴趣的:(SylixOS基本用法)