之前分析了三個芯片,不同的微架構,不同的生產廠家,對內存管理做的努力
然後我又粗略分析了一個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 |