图文详解RISCV上电流程:(以SiFive FU740-C000为例)

先看一下FU740的架构图:

 

3bd5107603d62c8faacef7c1fd3dd37f.png

我们把它简化一下,并列出我们会用到的部分:

 

c2628d5b261ca1ebb6ee60790935d00e.png

再看一下这些地址是如何分配的:

 

8f9c8258c6145950527eaa58bce39835.png

 

941ed23e48fb2363d4e65b029fd8be0d.png

根据上面的内存布局,再次得到如下框图:

 

b97283c1cedaabbe154857544ecc4113.png

Boot流程:

 

e27f461dac6bc5c959f03a9976d3e998.png

  • 上电后,所有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内存中,并执行;

上述流程可以用如下图概括:

 

d062b6e10ca9ae77cc3c798b3db5c5bb.png

回到qemu仿真riscv中的内存映射地址,也就理解为什么是0x80000000了。

        memory@80000000 {
                device_type = "memory";
                reg = <0x0 0x80000000 0x0 0x10000000>;
        };

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值