mips汇编的有关问题,准确的是说汇编bootcode的有关问题

mips汇编的问题,准确的是说汇编bootcode的问题
我想问一个关于mips架构CPU的汇编问题,准确的说是bootcode问题
MIPS的BSP补充包安装完后在开始进行开发,其中参考以前的产品代码以及TORNADO给的参考代码

在从romInit跳转到romStart程序的过程中总有这样的一段代码:



RELOC(t0,   romStart)

jal   t0




下面那个jal   link不link无所谓的事情,最多异常返回了跳到reset就完事,但是这个reloc的部分很有意思,宏定义为:

#define   RELOC(toreg,address)   \
bal   9f;   \
9:;   \
la   toreg,address;   \
addu   toreg,ra;   \
la   ra,9b;   \
subu   toreg,ra


在这个时候系统虽然把内存初始化好了,不过还没跳到内存去,因为romStart还没执行复制啊。CACHE虽然也初始化好了,我感觉从道理上讲这里是从uncached的kseg1跳转到kesg0的功能,这样复制会快一些。

但是这段汇编怎么都看不明白,求详细的每一条解释一下到底地址是怎么跳到kseg0段的。

我个人觉得应该是和编译器有关,上次做ARM的BSP编译的时候就是之前rom里的所有标号标的都是内存relocate以后的地址,是不是这个也一样的道理呢?

另外我想知道把TLB初始化省略掉仅仅使用KSEG0和KSEG1行不行呢?其中KSEG0为核心代码运行区间(整个内存),KSEG1段则通过地址映射为FLASH。

------解决方案--------------------
我后来又看了一下,我觉得我们都理解错了。这个是vxworks bootloader 位置无关代码的处理手法。 romStart的连接地址是在ram所在的地址,而实际运行是在flash上,我们需要将romStart的地址换成在flash中的位置,所以该段代码先加上当前运行位置的地址,然后减去链接时生成的当前位置的地址,这样就得到实际运行时romStart的相对地址,这样就可以直接跳转过去了。跟从非cache段到cache段没关系。

#define RELOC(toreg,address) \ 
bal 9f; \ #ra中是label 9 在运行时的实际的当前地址
9:; \ 
la toreg,address; \ 
addu toreg,ra; \ 
la ra,9b; \ #9b是链接是生成的地址,在代码中是一个链接是计算出来的数据。
subu toreg,ra 

个人感觉这个处理方法有点绕,让人不容易明白。如果看看PPC的处理,就明白了。那里是用romStart的链接地址减去romInit的链接地址,在加上ROM_TEXT_ADRS得到