boot 1.3.4源码分析详细教程(3)

2).globl 关键字:声明一个全局的标号,全局标号,其他可见,可以使用这个标志。
.globl _start  :把_start标号声明为全局的,其他的文件 ,C,链接文件,其他汇编文件都可见。
 
3)标号定义: “标号:” ,如: _start: ,定义一个_start标号。一个标号代表一个地址。

4).balignl关键字:在当前位置以指定对齐方式存放数字。
  .balignl 16,0xdeadbeef  在当前代码所在的地址开始找到第一个16的整数倍地址存放0xdeadbeef
5).word关键字:在当前位置存放一个数值。如:
_TEXT_BASE:
 .word TEXT_BASE
代表在当前地址存放 TEXT_BASE 所代表的数值。
6)可以使用C语言的预处理功能。
#if defined(CONFIG_xyd2440_LED_DEBUG)
…..
#endif
上面代码意思是如果定义了CONFIG_xyd2440_LED_DEBUG宏,就编译其中包含的代码段。

#define S_FRAME_SIZE 72
#define S_OLD_R0 68
上面使用C语言的宏定义功能定义数值。
7)  注释:和C语言一样。同时支持使用@注释。  可用:// ,  /*  */,  @
8)汇编代码专用宏定义:以 .macro 开头 后接宏名,中间宏代码,最后是 .endm 做为结束。
 .macro bad_save_user_regs
 sub sp, sp, #S_FRAME_SIZE
 stmia sp, {r0 - r12}   @ Calling r0-r12
 ldr r2, _armboot_start
 sub r2, r2, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN)
 sub r2, r2, #(CFG_GBL_DATA_SIZE+8)  @ set base 2 words into abort stack
 ldmia r2, {r2 - r3}   @ get pc, cpsr
 add r0, sp, #S_FRAME_SIZE  @ restore sp_SVC

add r5, sp, #S_SP
 mov r1, lr
 stmia r5, {r0 - r3}   @ save sp_SVC, lr_SVC, pc, cpsr
 mov r0, sp
 .endm
9) .align关键字: 控制代码对齐方式
ARM的.align 5就是2的5次方对齐,也就是4字节对齐,

3.3 分析 :
//异常向量表定义
.globl _start  //把 _start 声明为全局标号               
_start: b  start_code            //第1条指令,复位异常
 ldr pc, _undefined_instruction //未定义异常
 ldr pc, _software_interrupt    //软中断异常
 ldr pc, _prefetch_abort        //预取指中止异常
 ldr pc, _data_abort            //数据中止异常
 ldr pc, _not_used
 ldr pc, _irq                  //IRQ中断异常
 ldr pc, _fiq                  //FIQ中断异常

_undefined_instruction: .word undefined_instruction
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort:  .word data_abort
_not_used:  .word not_used
_irq:   .word irq
_fiq:   .word fiq

当整个u-boot流程走完之后,就真正进入linux的启动系统了。

所以,如果对u-boot整理流程通过软件来认识一边的话,就完全知道linux在启动时,干了哪些事。就像window启动时,会出现一些信息,告诉你当前执行到哪里,执行了什么事,一目了然。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/13672.html