先看一下FU740的架构图:
我们把它简化一下,并列出我们会用到的部分:
再看一下这些地址是如何分配的:
根据上面的内存布局,再次得到如下框图:
Boot流程:
- 上电后,所有Cores跳转到0x1004,即Boot ROM;
- Boot ROM根据MSEL PIN脚输入进行跳转,这里我们只考虑ZSBL,即跳转到Mask ROM - 0x00010000;
- Mask ROM(掩膜ROM,固化数据,无法被重新烧写)中的ZSBL首先载入GTP Header,然后以512 Bytes扫描GPT Partition,并找到GUID为 5B193300-FC78-40CD-8002-E86C45580B47的GPT分区,从这个分区中将内容载入L2 LIM,位置是0x8000000,这块内容就是U-Boot SPL;
- Cores跳转到0x8000000,执行U-Boot SPL,完成如下事情;
-
- 初始化DDR等;
- 从外部Flash或者SD Card中找到GPT partition with GUID = 2E54B353-1271-4842-806F-E436D6AF69851分区,并将其内容拷贝到DDR,位置为0x80000000中;
- Cores跳转到DDR 0x80000000,并执行OpenSBI;
- OpenSBI在跳转到S Mode并执行U-boot;
- U-boot中我们可以使用命令行从tftp/SD Card/USB/Flash中状态Image/DTB到DDR内存中,并执行;
上述流程可以用如下图概括:
回到qemu仿真riscv中的内存映射地址,也就理解为什么是0x80000000了。
memory@80000000 {
device_type = "memory";
reg = <0x0 0x80000000 0x0 0x10000000>;
};