uboot-的start.S详细注解及分析 (2)

@对于ARM数据从内存到CPU之间的移动只能通过L/S指令,如:ldr r0,0x12345678为把0x12345678内存中的数据写到r0中,还有一个就是ldr伪指令,如:ldr r0,=0x12345678为把0x12345678地址写到r0中,mov只能完成寄存器间数据的移动,而且立即数长度限制在8位

_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
@.word为GNU ARM汇编特有的伪操作,为分配一段字内存单元(分配的单元为字对齐的),可以使用.word把标志符作为常量使用。如_fiq:.word fiq即把fiq存入内存变量_fiq中,也即是把fiq放到地址_fiq中。

.balignl 16,0xdeadbeef
@.balignl是.balign的变体

@ .align伪操作用于表示对齐方式:通过添加填充字节使当前位置

@满足一定的对齐方式。.balign的作用同.align。
@ .align {alignment} {,fill} {,max}
@  其中:alignment用于指定对齐方式,可能的取值为2的次

@幂,缺省为4。fill是填充内容,缺省用0填充。max是填充字节@数最大值,如果填充字节数超过max,  就不进行对齐,例如:
@  .align 4  /* 指定对齐方式为字对齐 */

/*
 *************************************************************************
 *
 * Startup Code (called from the ARM reset exception vector)
 *
 * do important init only if we don\'t start from memory!
 * relocate armboot to ram
 * setup stack
 * jump to second stage
 *
 *************************************************************************

@保存变量的数据区,保存一些全局变量,用于BOOT程序从FLASH拷贝@到RAM,或者其它的使用。
@还有一些变量的长度是通过连接脚本里得到,实际上由编译器算出

@来的

_TEXT_BASE:

@因为linux开始地址是0x30000000,我这里是64M SDRAM,所以@TEXT_BASE = 0x33F80000 ???
 .word TEXT_BASE /*uboot映像在SDRAM中的重定位地址*/
@TEXT_BASE在开发板相关的目录中的config.mk文档中定义, 他定

@义了代码在运行时所在的地址, 那么_TEXT_BASE中保存了这个地

@址(这个TEXT_BASE怎么来的还不清楚)

.globl _armboot_start
_armboot_start:
 .word _start
@用_start来初始化_armboot_start。(为什么要这么定义一下还不明白)

/*
 * These are defined in the board-specific linker script.
 */
@下面这些是定义在开发板目录链接脚本中的

.globl _bss_start    
_bss_start:
 .word __bss_start
@__bss_start定义在和开发板相关的u-boot.lds中,_bss_start保存的是__bss_start标号所在的地址。

.globl _bss_end
_bss_end:
 .word _end
@同上,这样赋值是因为代码所在地址非编译时的地址,直接取得该标号对应地址。

@中断的堆栈设置

#ifdef CONFIG_USE_IRQ
/* IRQ stack memory (calculated at run-time) */
.globl IRQ_STACK_START
IRQ_STACK_START:
 .word 0x0badc0de

/* IRQ stack memory (calculated at run-time) */
.globl FIQ_STACK_START
FIQ_STACK_START:
 .word 0x0badc0de
#endif


/*
 * the actual start code
 */
@复位后执行程序
@真正的初始化从这里开始了。其实在CPU一上电以后就是跳到这里执行的
reset:
 /*
  * set the cpu to SVC32 mode
  */
@更改处理器模式为管理模式
@对状态寄存器的修改要按照:读出-修改-写回的顺序来执行
@
    31 30 29 28 ---   7   6   -   4    3   2   1   0
    N  Z  C  V        I   F       M4  M3  M2 M1 M0
                                   0   0   0  0   0     User26 模式
                                   0   0   0  0   1     FIQ26 模式
                                   0   0   0  1   0     IRQ26 模式
                                   0   0   0  1   1     SVC26 模式
                                   1   0   0  0   0     User 模式
                                   1   0   0  0   1     FIQ 模式
                                   1   0   0  1   0     IRQ 模式
                                   1   0   0  1   1     SVC 模式
                                   1   0   1  1   1     ABT 模式
                                   1   1   0  1   1     UND 模式
                                   1   1   1  1   1     SYS 模式

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

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