OpenRisc-24-ORPSoC boot过程分析

本文深入分析了OpenRisc-24-ORPSoC的启动过程,从PC的初始值开始,探讨了第一条指令的来源、存储位置和内容。通过反汇编启动代码,理解了ROM中的指令,并解答了关于地址映射和启动地址转换的疑问,从而对ORPSoC的启动流程有了清晰的认识。
摘要由CSDN通过智能技术生成

引言

之前做了很多工作,能起orpmon,能起linux,能run helloworld。但是这些都可以说是空中楼阁,如果不把CPU的启动过程搞明白,总感觉心里没底似的。所以本小节就看一下ORPSoC在最初上电之后做的一些工作,与大部分介绍启动代码的流程的角度有所不同。

Note:并不讨论上电timing等内容,直接从fetch开始。

 

1,从哪里取第一条指令

从or1200_defines.v里面可以看到PC的初值,这个是由硬件决定的。这个文件的目录和内容如下图:

分析:

第一条取值的地址:0xf0000100

这个地址有两个含义:

1>第一条指令存放的wishbone slave设备的地址是0xf

2>第一条指令存放的wishbone slave设备的内部地址是0x100

此外,这个地址对应的模块,必须在掉电时数据不能丢失。比如flash,rom等。

 

 

2,第一条指令 保存在哪呢

既然已经知道wishbone的slave地址,那么只要找到这个地址对应的模块即可:

在orpsoc-params.v里面:

分析:

1>这个模块应该挂在arbiter_ibus(指令总线)上,找找看,可以看到指令总线上一共只有两个slave:slave0是rom,slave1是ddr1(sdram):

sdram掉电丢失,那第一条指令一定放在rom0里面:

指令总线上的sdram:

 

指令总线上的rom0:

 

2>为了进一步确定,我们查看rom0的wishbone地址,可以看到rom0,这个wishbone slave模块的地址是0xf,如下图:

 

 

3,第一条指令是什么呢

既然已经知道第一条指令的存放模块和模块内部的地址,找到rom0的rtl模块,看看吧:

分析:

里面有一个包含文件bootrom.v:就是指令:

 

bootrom.v内容:

 

4,启动代码的反汇编

上面我们找到了启动代码的存放地方,但是都是十六进制的,共40条指令,一般人看不懂,所以我就手动反汇编了一下:

之前没有手动反汇编过,这次体验了一下,40条指令,竟然用了2个多小时。

详细反汇编过程和结果,以及分析结果,我已上传:

http://download.csdn.net/detail/rill_zhen/5349541

步骤:

第一步:先将十六进制代码转成二进制。

第二步:将二进制与Architecture Manual中的指令集对照,找到对应的指令类型。

第三步:逐个分析每个指令的含义,得到其汇编指令。

如下:

 

最终结果如下:

 

/*
* file:rom.S
* rill create 2013-04-26
* rillzhen@gmail.com
*
*/

l.movhi r0,0x0  //boot init,rill add 130509
l.movhi r1, 0x0  
l.movhi r4, 0xb000


l.ori r2, r0, 0x51  //spi init,rill add 130509
l.sb 0x0(r4),r2  
l.sb 0x4(r4),r0  
l.ori r6, r0, 0x1  
l.sb 0x4(r4),r6  
l.jal 0x18  
l.ori r3, r0, 0x3  
l.jal 0x16  
l.ori r3, r0, 0xc  
l.jal 0x14  
l.ori r3, r0, 0x0  
l.jal 0x12  
l.ori r3, r0, 0x0  
l.movhi r6, 0x0  
l.movhi r7, 0xffff


l.jal 0xe  //copy,rill add 130509
l.add r8,r6,r0  
l.sb 0x0(r8),r3  
l.addi r6,r6,0x1  
l.sfeqi r6,0x4  
l.bf 0x7  
l.sfeq r6,r7  
l.bnf 0x3fffff9  
l.nop  


l.ori r1, r1, 0x100 //reset ,rill add 130509 
l.jr r1  
l.sb 0x4(r4),r0 
 
l.j 0x3fffff4  //stor word,rill add 130509
l.lwz r7,0x0(r1)  


l.sb 0x2(r4),r3  //spi_xfer,rill add 130509
l.ori r3, r0, 0x1
  
l.andi r3,r3,0x1  //spi_xfer_poll,rill add 130509
l.sfeqi r3,0x1  
l.bf 0x3fffffe  
l.lbz r3,0x1(r4)  
l.jr r9  
l.lbz r3,r4,0x2


 

 

 

5,疑问

经过上面的折腾,

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值