学习笔记-start.S解释1
1、start.S 的入口:ENTRY(_start)
因此_start符号所在的文件就是整个程序的起始文件,_start所在处的代码就是整个程序的起始代码。
_start: b reset
2、#include <config.h> 是配置过程中自动生成的文件(详见mkconfig脚本)这个文件包含x210_sd.h,主要是将x210_sd.h 与 start.S 联系起来了。
3、#include <version.h> 包含了include/version_autogenerated.h 这个里面的版本号和Makefile 中的配置值有关,在uboot启动打印的版本号就 是这来的。
4、#include <asm/proc/domain.h> asm目录是配置时的符号连接,实指 asm-arm,实指文件:include/asm-arm/proc-armv/domain.h
5、uboot这里start.S中在开头位置放了16字节的填充占位,这个占位的16字节只是保证正式的image的头部确实有16字节,但是这16字节的内容是不对的,
还是需要后面去计算校验和然后重新填充的。(mkv210image.c中就是为了计算这个校验头)。
#if defined(CONFIG_EVT1) && !defined(CONFIG_FUSED)
.word 0x2000
.word 0x0
.word 0x0
.word 0x0
#endif
6、deadbeef
.balignl 16,0xdeadbeef
这一句指令是让当前地址对齐排布,如果当前地址不对齐则自动向后走地址直到对齐,并且向后走的那些内存要用0xdeadbeef来填充。
7、 .word 汇编指令
格式如下:
label:
.word express
这里的用法表示:在当前位置存放一个字,可能有些人会觉得就是放一个字word,这个要怎么看了,一般一个word是两个字节,跟CPU的型号有关,所以不要管word的限制,直 接理解成,在当前位置存放一个字,这个字是32位的即可。
label本身是一个标识,也就是一个链接地址的别名,express,是直接在这个链接地址指向的位置放置数值
label:
.word pLinkAddress //其中pLinkAddress是在别的文件进行的宏定义
ldr r0,label ///将label指向的内容赋值给r0,label是个只是个标识,标识是链接地址的别名,cpu是不会认label的,这个label是给程序员看的。
ldr pc,label //道理同上,不同的是pc是程序计数器,这样相当于将程序跳转到label指向地址处进行执行了。
8、TEXT_BASE
(1)第100行这个TEXT_BASE就是上个课程中分析Makefile时讲到的那个配置阶段的TEXT_BASE,其实就是我们链接时指定的uboot的链接地址。(值就是c3e00000)
(2)源代码中和配置Makefile中很多变量是可以互相运送的。简单来说有些符号的值可以从Makefile中传递到源代码中。
9、CFG_PHY_UBOOT_BASE 33e00000 uboot在DDR中的物理地址
10、msr cpsr_c, #0xd3 将CPU设置为禁止FIQ IRQ,ARM状态,SVC模式。
超级用户模式(SVC 模式),主要用于 SWI(软件中断)和 OS(操作系统)。这个模式有额外的特权,允许你进一步控制计算机。例如,你必须进入超级用户模式来读取一个插件(podule)。这不能在用户模式下完成。
11、识别并暂存启动介质选择
(1)从哪里启动是由SoC的OM5:OM0这6个引脚的高低电平决定的。
在210内部有一个寄存器(地址是0xE0000004),这个寄存器中的值是硬件根据OM引脚的设置而自动设置值的。
这个值反映的就是OM引脚的接法(电平高低),也就是真正的启动介质是谁。
代码中可以通过读取这个寄存器的值然后判断其值来确定当前选中的启动介质是Nand还是SD还是其他的。
/* Read booting information */
ldr r0, =PRO_ID_BASE
ldr r1, [r0,#OMR_OFFSET]
bic r2, r1, #0xffffffc1
12、
设置栈,是在SRAM中设置的,因为当前整个代码在SRAM中运行
ldr sp, =0xd0036000 /* end of sram dedicated to u-boot */
sub sp, sp, #12 /* set stack */
mov fp, #0
浙公网安备 33010602011771号