内存分配¶
Hi3559AV100
平台会把内存分为多段进行各种用途,本节主要介绍内存分配结构和如何调整。
内存划分¶
Hi3559AV100
的 DDR 主要划分为如下几个部分:
核间通信共享内存( A73BL、A53UP、Cortex-M7、DSP 之间 )
DSP0/1/2/3 Huawei LiteOS 系统内存
A73BL Linux 系统内存
A53UP Huawei LiteOS 系统内存
A73BL 使用的 MMZ 区域
A53UP 使用的 MMZ 区域。
设备不同的 DDR 大小分为不同的固件版本,主要原因在于不同大小分配的策略不同,用户也可以根据自己的需求修改分配策略。
PS:
我们一般情况下只需要调整
A53UP
和A73BL
的OS
和MZZ
内存分配。MMZ 内存主要用于媒体处理。
内存调整¶
官方固件和源码中的分配策略(4G
版本)
异构:
非异构:
以非异构为例,由于非异构模式下 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:
内存分配根据配置文件从基地址开始,从
上往下
顺序分配。地址偏移是用户在进入系统后加载 A53UP Huawei LiteOS 时需要的。如 PDF 文档中” load_liteos 0 0x131000000 ./sample_liteos_a53.bin “ 0x131000000 就是偏移之后得到的地址,OS 需要加载在此地址之上
内存使用¶
OS 内存分配的内存可以正常分配使用。
MMZ 内存需要调用对应的接口来申请分配,所有的接口文档都会在 PDF 文档中详细介绍。
通过 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