U-Boot源码之start.s

本文详细介绍了U-Boot启动时最先执行的start.s文件,讲解了其中涉及的汇编指令和链接脚本u-boot.lds的作用。内容包括.start伪指令、.word、.balign系列指令、.align、.macro等汇编伪指令的用法,以及b、bl、ldr、str、mrs、msr等ARM指令。同时,还分析了start.s中的向量表、异常处理程序以及内存布局,最后探讨了复位处理程序和堆栈分配。通过对start.s的理解,为深入研究U-Boot源码打下基础。
摘要由CSDN通过智能技术生成

start.s文件是U-Boot启动最先执行的代码,对start.s 文件的正确理解是整个U-Boot源码理解的开端和基础。要理解start.S 文件,需要具备一些预备知识,下面先介绍这些预备知识。

一、start.s预备知识

1.start.s中的汇编指令

1.1 .globl

汇编程序中以.开头的名称并不是指令的助记符,不会被翻译成机器指令,而是给汇编器一些特殊指示,称为汇编指示(Assembler Directive)或伪操作(Pseudo-operation),由于它不是真正的指令所以加个“伪”字。.globl伪指令的用法是:

                                                           .globl xxx

.globl xxx的作用是将xxx符号声明为外部程序可访问的标签,也就是说xxx符号可以被其他.c .s文件使用。

1.2 .word

.word伪指令的用法是:

                                                          .word xxx

.word xxx的作用就是在当前位置放一个word型的值,这个值就是xxx。举例来说:                                                        

                                                               _rWTCON:                                     
                                                                     .word 0x15300000

 上面两句的意思就是在当前地址,即_rWTCON处放一个值0x15300000。 

1.3 .balignl

.balignl是.balign的变体,.balign的意思是,在以当前地址开始,地址计数器必须是以第一个参数为整数倍的地址为结尾,并且在前面填入一个字节长度的信息,信息内容为第二个参数。举例来说: 

                                                      .balign 8, 0xde
上面这条语句的意思是,在以当前地址开始,在地址为8的倍数的位置的前面填入一个字节内容为0xde的内容。如果当前地址正好是8的倍数,则没有东西被写入到内存。

那么以此类推,.balignw则表示第二个参数填入的内容长度为一个字的长度,即16位,所以一般有这样的形式出现:

                                                           .balignw 4,0x368d

以此类推,.balignl这个指令用来填写一个双字,即内容长度为4个字节。举例来说:

                                                   .balignl 16,0xdeadbeef

上面这条语句的意思是,在以当前地址开始,在地址为16的倍数的位置的前面填入4个字节长度的内容,填入的内容为0xdeadbeef。

1.4 .align

.align伪指令的用法是:

                                               .align n

.align n 它的含义就是使得下面的代码按一定规则对齐。.align n 指令的对齐值有两种方案:n 或 2^n 。各种平台最初的汇编器一般都不是gas ,采取方案12 的都很多,gas 的目标是取代原来的汇编器,必然要保持和原来汇编器的兼容,因此在gas 中如何解释.align 指令会显得有些混乱,原因在于保持兼容。arm-linux 是按照 2^n 的方案对齐的,需要说明的是这个对齐和ld-script 里的对齐不同,不是一会事。下面的英文就不同平台的对齐进行了说明:版本2.11.92.0.12gasinfo(Mandrake 8.2 上的) 这样说:

The way the required alignment is specified varies from system to system. For the a29k, hppa, m68k, m88k, w65, sparc, and Hitachi SH, and i386 using ELF format, the first expression is the alignment request in bytes. For example .align 8 advances the location counter until it is a multiple of 8. If the location counter is already a multiple of 8, no change is needed.

For other systems, including the i386 using a.out format, and the arm and strongarm, it is the number of low-order zero bits the location counter must have after advancement. For example `.align 3' advances the location counter until it a multiple of 8. If the location counter is already a multiple of 8, no change is needed.

从这段文字来看,ARM.align 5就是 25次方对齐,也就是 4 字节对齐,通过反汇编也可以看出对齐方式。

1.5 .macro ... .endm

.macro ... .endm伪指令的作用相当于c语言的#define,即宏定义。

1.6 b和bl

b指令是ARM分支指令,实现程序的跳转。其语法是:

                      b{<cond>}    label

地址label是以一个有符号的相对于pc的偏移量保存在指令中,且必须被限制在分支指令的约32MB范围内。

大多数汇编语言通过使用地址标号来隐藏分支指令编码的细节。地址标号放在一行的开始处,汇编器会记录该行指令的地址,用于计算跳转的偏移量。

bl指令和b指令类似,区别在于bl指令是带返回的跳转,它会把bl后面的的第一条指令地址赋值给lr寄存器。

1.7 ldr和str

ldr用于把存储器里的一个32位数据传入至一个处理器寄存器。其语法是:

                          ldr reg, address

其功能是把存储器地址address处的一个32位数据传入至处理器寄存器reg。

str用于把一个32位数据存储至指定地址。其语法是:

                          str reg, address

其功能是把reg的值存储至address地址处。

1.8 mrs和msr

mrs指令用于把状态寄存器(cpsr或spsr)的值传送到通用寄存器。指令语法:

                         mrs rd, cpsr|spsr

msr指令用于把通用寄存器的值传送到状态寄存器(cpsr或spsr)。指令语法:

                         mrs cpsr|spsr, rm

1.9 bic

bic指令用于实现逻辑位清除。指令语法:

                        bic rd, rn, n

其功能相当于rd = rn & (~n)。

1.10 orr

orr指令用于实现32位逻辑或。指令语法:

                       bic rd, rn, n

其功能相当于rd = rn | n。

1.11 mrc和mcr

mrc和mcr是协处理器传送指令。mrc指令把协处理器寄存器的值传送至通用寄存器。mcr指令把通用寄存器的值传送至协处理器寄存器。指令语法:

                       mrc|mcr cp, opcode1, rd, cn, cm, {, opcode2}

在协处理器指令语法中,cp代表协处理器编号,为p0~p15。opcode描述要在协处理器中执行的操作。cn、cm描述在协处理器中的寄存器(cn一般是主寄存器,cm是辅寄存器)。协处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值