内存分配

Hi3559AV100 平台会把内存分为多段进行各种用途,本节主要介绍内存分配结构和如何调整。

内存划分

Hi3559AV100 的 DDR 主要划分为如下几个部分:

  1. 核间通信共享内存( A73BL、A53UP、Cortex-M7、DSP 之间 )

  2. DSP0/1/2/3 Huawei LiteOS 系统内存

  3. A73BL Linux 系统内存

  4. A53UP Huawei LiteOS 系统内存

  5. A73BL 使用的 MMZ 区域

  6. A53UP 使用的 MMZ 区域。

设备不同的 DDR 大小分为不同的固件版本,主要原因在于不同大小分配的策略不同,用户也可以根据自己的需求修改分配策略。

PS:

  1. 我们一般情况下只需要调整A53UPA73BLOSMZZ内存分配。

  2. MMZ 内存主要用于媒体处理。

内存调整

官方固件和源码中的分配策略(4G版本)

  • 异构:

_images/mem.png

  • 非异构:

_images/Fmem.png

以非异构为例,由于非异构模式下 A53UP 不会分配硬件资源,不需要媒体处理仅仅运行用户的应用程序,所以 A53UP 分配的 OS 和 MMZ 内存都很少。相反异构情况下,A53UP 需要管理 Vi、Vo、Vdec这些需要 VB 视频缓存池的硬件模块,所以需要分配很大的内存。

在源码中内存分配调整由osdrv/osdrv_mem_cfg.sh脚本进行配置,如果需要了解可以详细参考此脚本。我们对内存分配脚本进行了封装,编译只需要修改配置文件中的各项内存大小就可以了。

daijh@daijh:~/hisi/buildroot-sdk/board/configs$ cat Firefly3559A4G-multi-core_defconfig 
FCONFIG_CHIP=hi3559av100
FCONFIG_V_MEM_SIZE=4G
FCONFIG_BOARD=Firefly-3559A

# emmc,spi,nand,ufs
FCONFIG_BOOT_MEDIA=emmc

# linux or linux_liteos
FCONFIG_AMP_TYPE=linux
FCONFIG_BUILDROOT_CONFIG=hi3559a_smp_defconfig
FCONFIG_KERNEL_CONFIG=Firefly_defconfig
FCONFIG_KERNEL_DTB=hi3559av100-firefly-jd4.dts
FCONFIG_UBOOT_CONFIG=hi3559av100_emmc_defconfig
FCONFIG_REG_CONFIG=Hi3559AV100-MBJD4-LPDDR4_2664M_4or2GB_32bitx2-A73_1608M.xlsm

# Memory configure
FCONFIG_DDR_MEM_BASE=0x40000000  // DDR 起始地址 不需要修改
FCONFIG_DSP_MEM_SIZE=0x04000000  // DSP 分配内存大小 不需要修改
FCONFIG_LINUX_MEM_SIZE=0x20000000 // A73BL 运行的 Linux OS 分配大小
FCONFIG_LINUX_MMZ_BASE=0x64000000 // A73BL MMZ 的起始地址
FCONFIG_LINUX_MMZ_SIZE=0xCC000000 // A73BL MMZ 的内存大小
FCONFIG_LITEOS_TEXT_OFFSET=0x01000000 // 地址偏移 不需要修改
FCONFIG_LITEOS_SYS_MEM_SIZE=0x0B000000 // A53UP Huawei LiteOS 分配的内存大小
FCONFIG_LITEOS_MMZ_MEM_LEN=0x04000000 // A53UP MMZ 内存分配大小

PS:

  1. 内存分配根据配置文件从基地址开始,从上往下顺序分配。

  2. 地址偏移是用户在进入系统后加载 A53UP Huawei LiteOS 时需要的。如 PDF 文档中” load_liteos 0 0x131000000 ./sample_liteos_a53.bin “ 0x131000000 就是偏移之后得到的地址,OS 需要加载在此地址之上

内存使用

  1. OS 内存分配的内存可以正常分配使用。

  2. MMZ 内存需要调用对应的接口来申请分配,所有的接口文档都会在 PDF 文档中详细介绍。

  3. 通过 free 等其他手段查看的内存情况只能查看 OS 管理的内存,并不能查看其他部分内存,通过 “cat /proc/media-mem” 可以查看 MMZ 的使用情况。

~ # cat /proc/media-mem 
+---ZONE: PHYS(0x64000000, 0x12FFFFFFF), GFP=0, nBYTES=3342336KB,    NAME="anonymous"
   |-MMB: phys(0x64000000, 0x6400BFFF), kvirt=0xFFFFFF800A090000, flags=0x00000001, length=48KB,    name="sys_scale_coef"
   |-MMB: phys(0x6400C000, 0x6402BFFF), kvirt=0x00000000, flags=0x00000000, length=128KB,    name="TDE_MEMPOOL_MMB"
   |-MMB: phys(0x6402C000, 0x6407CFFF), kvirt=0xFFFFFF800A500000, flags=0x00000001, length=324KB,    name="gdc_node_buf"
   |-MMB: phys(0x6407D000, 0x641A0FFF), kvirt=0xFFFFFF800A800000, flags=0x00000001, length=1168KB,    name="VGS_NodeBuf"
   |-MMB: phys(0x641A1000, 0x641C1FFF), kvirt=0xFFFFFF800A700000, flags=0x00000001, length=132KB,    name="dis_node_buf"
   |-MMB: phys(0x641C2000, 0x643AAFFF), kvirt=0xFFFFFF800B000000, flags=0x00000001, length=1956KB,    name="vo0_coef_buf"
   |-MMB: phys(0x643AB000, 0x6634EFFF), kvirt=0x00000000, flags=0x00000000, length=32400KB,    name="hifb_layer0"
   |-MMB: phys(0x6634F000, 0x67320FFF), kvirt=0x00000000, flags=0x00000000, length=16200KB,    name="hifb_layer1"
   |-MMB: phys(0x67321000, 0x67360FFF), kvirt=0x00000000, flags=0x00000000, length=256KB,    name="hifb_layer2"
   |-MMB: phys(0x67361000, 0x67390FFF), kvirt=0xFFFFFF800AFC0000, flags=0x00000001, length=192KB,    name="HIFB COEF"
   |-MMB: phys(0x67391000, 0x67410FFF), kvirt=0x00000000, flags=0x00000000, length=512KB,    name="jpegd0_emar"
   |-MMB: phys(0x67411000, 0x67445FFF), kvirt=0xFFFFFF800BA00000, flags=0x00000001, length=212KB,    name="IVE_QUEUE"
   |-MMB: phys(0x67446000, 0x67446FFF), kvirt=0xFFFFFF800A069000, flags=0x00000003, length=4KB,    name="IVE_TEMP_NODE"
   |-MMB: phys(0x67447000, 0x67466FFF), kvirt=0xFFFFFF800BAA0000, flags=0x00000001, length=128KB,    name="SVP_NNIE_QUEUE"
   |-MMB: phys(0x67467000, 0x6746DFFF), kvirt=0xFFFFFF800A108000, flags=0x00000003, length=28KB,    name="SVP_NNIE_MODLE_"
   |-MMB: phys(0x6746E000, 0x67A5CFFF), kvirt=0x00000000, flags=0x00000000, length=6076KB,    name="vb_pool"
   |-MMB: phys(0x67A5D000, 0x67A5DFFF), kvirt=0xFFFFFF800AA31000, flags=0x00000001, length=4KB,    name="vb_pool_sup_nc"
   |-MMB: phys(0x67A5E000, 0x6804CFFF), kvirt=0x00000000, flags=0x00000000, length=6076KB,    name="vb_pool"
   |-MMB: phys(0x6804D000, 0x6804DFFF), kvirt=0xFFFFFF800AA33000, flags=0x00000001, length=4KB,    name="vb_pool_sup_nc"
   |-MMB: phys(0x6804E000, 0x6863CFFF), kvirt=0x00000000, flags=0x00000000, length=6076KB,    name="vb_pool"
   |-MMB: phys(0x6863D000, 0x6863DFFF), kvirt=0xFFFFFF800AA35000, flags=0x00000001, length=4KB,    name="vb_pool_sup_nc"
   |-MMB: phys(0x6863E000, 0x864D5FFF), kvirt=0x00000000, flags=0x00000000, length=490080KB,    name="vb_pool"
   |-MMB: phys(0x864D6000, 0x864DFFFF), kvirt=0xFFFFFF800AEF0000, flags=0x00000001, length=40KB,    name="vb_pool_sup_nc"
   |-MMB: phys(0x864E0000, 0x8C3CBFFF), kvirt=0x00000000, flags=0x00000000, length=97200KB,    name="vb_pool"
   |-MMB: phys(0x8C3CC000, 0x8C3CCFFF), kvirt=0xFFFFFF800AA37000, flags=0x00000001, length=4KB,    name="vb_pool_sup_nc"

---MMZ_USE_INFO:
 total size=3342336KB(3264MB),used=659252KB(643MB + 820KB),remain=2683084KB(2620MB + 204KB),zone_number=1,block_number=25