start.S解析2

1、启动代码的16字节头部

49-54行

#if defineCONFIG_EVT1&& !defined(CONFIG_FUSED)

      .word 0x2000

      .word 0x0

      .word 0x0

      .word 0x0

#endif

(1)SourceInsight中红色字符是表明已经已经定义的,黑色字符表明没有被定义。

(2)汇编指令.word表示占4个字节,这里四个类似于一个数组中存放了4个元素,分别是0x2000 0x0 0x0 0x0

(3)裸机里面讲的在sd卡启动和Nand启动等整个镜像开头需要16个字节的校验头。(mkv210image.c中就是为了计算这个校验头)。我们以前做裸机程序是根本没考虑16字节校验头,因为:1、如果我们是usb启动直接下载的方式启动则不需要16字节校验头(irom application note);

2、异常向量表的构建

(1)异常向量表是硬件决定的,软件只是参照硬件的设计来实现它。

(2)异常向量表中每一种异常都应该被处理,否则真遇到了这种异常就跑飞了。但是我们uboot中并非非常细致的处理各种异常。

(3)复位异常处是:b reset,因此在CPU复位后真正去执行的有效代码是reset处代码,因此reset符号处才是真正的有意义的代码开始的地方。

3、有意思的deadbeef。

(1).balignl  16,0xdeadbeef

这一句指令是让当前地址对齐排布,如果当前地址不对齐则自动向后走地址直到对齐,并且向后的那些内存要用0xdeadbeef来填充。

(2)0xdeadbeef这是一个十六进制的数字,不是一个字符串,不是关键字。

(3)为什么要对齐访问?有时候是效率要求,有时候是硬件特殊要求。

4、TEXT_BASE等

(1)第100行这个TEXT_BASE就是上一个课程中分析Makefile时讲到的那个配置阶段的TEXT_BASE,其实就是我们链接时指定的uboot链接地址。(值就是c3e00000)

(2)源代码中配置Makefile中很多变量是可以互相运送的,简单来说有些符号的值可以从Makefile中传递到源代码中

猜你喜欢

转载自blog.csdn.net/weixin_40405692/article/details/84798065