之前分析了三个芯片,不同的微架构,不同的生产厂家,对内存管理做的努力
然后我又粗略分析了一个exynos4412的内存管理
芯片 |
stm32f407zgt6 |
s3c2440 |
i.mx6ull |
exynos4412(无详细分析) |
架构 |
ARMv7 |
ARMv5t |
ARMv7 |
ARMv7 |
微架构 |
cortex-M4 |
ARM920T |
cortex-A7 |
cortex-A9 |
厂家 |
意法半导体 |
三星 |
飞思卡尔(被NXP收购) |
三星 |
相同部分
- 都有boot配置,可以配置从不同方式启动
- 都有flash用来存储代码.
- 都有sram,可以用来在boot时存储执行代码.
- 都会执行到用户代码.
不同部分
- boot配置不同
stm32 可以 从 主flash sram1 系统flash 启动
s3c2440 可以从 nand nor 启动
i.mx6ull 设置了两级启动,一级启动 从 FUSE 串行下载 从bootrom启动(包含二级启动,从QSPI WEIM Serial-ROM SD eMMC NAND 中的一种 加载代码到ddr)
exynos4412 设置了两级启动,一级启动从 iROM 启动(包含二级启动,从General NAND flash memory ,SD/MMC memory card ,eMMC memory ,USB device)
- 存储用户代码的flash不同
stm32 用的是芯片自带的主flash(1MB)
s3c2440 用的是 nand(256MB) 或者 nor(128MB)
i.mx6ull 用的是 QSPI WEIM Serial-ROM SD eMMC NAND 中的一种
exynos4412 用的是 General NAND flash memory ,SD/MMC memory card ,eMMC memory中的一种
- sram大小不同
stm32 128KB(SRAM1 112 KB + SRAM2 16KB)
s3c2440 4KB
i.mx6ull 128KB
exynos4412 256KB
- 执行到用户代码的过程不同
stm32 主flash映射到0x00000000,并从 0x00000000 执行代码
s3c2440 如果从nor启动,XIP(nor本来就是0地址);如果从nand ,则 将nand前4KB映射(或者拷贝)到0地址. 从 0x00000000 执行代码
i.mx6ull 从bootrom启动,加载二级启动设备中的数据初始化ddr,并将用户代码(bin文件)搬移到指定位置(sram或者ddr),然后从 指定位置 执行代码
exynos 从 iROM启动,做一系列初始化,加载二级启动设备的数据(256KB)进iRAM,并做校验,然后执行该256KB代码
- 芯片官方做的封装程度不一样 (Lx , x越大,封的越多)
stm32 封装程度L4,(做了内存分段,连C库都初始化好了),用户代码需要做
做功能部分
s3c2440 封装程度L1,用户代码需要做
1.关看门狗
2.初始化ddr
3.处理在在ddr上执行代码的问题
4.内存分段
5.初始化C库
6.做功能部分
i.mx6ull 封装程度L3,用户需要
1.内存分段
2.初始化C库
3.做功能部分
exynos 封装程度L2,用户需要写BL1和BL2
1.初始化ddr
2.处理在在ddr上执行代码的问题
3.内存分段
4.初始化C库
5.做封装部分
芯片 |
年份 |
厂商 |
封装程度 |
stm32f407zgt6 |
2012 |
意法半导体 |
L4 |
i.mx6ull |
2017 |
飞思卡尔 |
L3 |
exynos4412 |
2012 |
三星 |
L2 |
s3c2440 |
2004 |
三星 |
L1 |