OpenRisc24ORPSoC boot过程分析

引言

之前做了很多工作,能起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条指令,一般人看不懂,所以我就手动反汇编了一下:

步骤:

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

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

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

如下:

最终结果如下:

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


l.movhi r0, hi(0x0)
l.movhi r1, hi(0x0)
l.movhi r4, hi(0xb000)
l.ori r2, r0, 0x51
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, hi(0x0)
l.movhi r7, hi(0xffff)
l.jal 0xe
l.add r8,r6,r0,0x0
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
l.jr r1
l.sb 0x0(r4),r0,0x4
l.j 0x3fffff4
l.lwz r7,r1,0x0
l.sb 0x0(r4),r3,0x2
l.ori r3, r0, 0x1
l.andi r3,r3,0x1
l.sfeqi r3,0x1
l.bf 0x3fffffe
l.lbz r3,r4,0x1
l.jr r9
l.lbz r3,r4,0x2


 

5,小结和疑问

经过上面的折腾,之前的空中楼阁总算离地面近了不少。

上面的过程看似很好,但是有一点疑问:

既然第一条指令的地址是0xf0000100,0xf这个地址对应rom0,这没错,

但是rom0的内容在0x100这个地方没有东西啊,它只有40条指令啊,也就是说rom.v里面的那个“case (wb_adr_i)”语句是走default的,也就是说第一条指令是取不到!

我查了一下flashrom,例化的orpsoc_flashROM模块,里面有devboard_flashROM.mem文件,但是ORPSoC这个project并没有用它。

怎么回事?我错在哪里了呢?

原文地址:https://www.cnblogs.com/javawebsoa/p/3045526.html