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得到
我想问一个关于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得到