14.3.1 _start标号

14.3.1  _start标号

U-Boot工程中,每种处理器目录下都有一个start.S文件,该文件中有一个_start标号,是整个U-Boot代码的入口点。以ARM 9处理器为例,代码如下:

 

32 /*

33  ********************************************************************

34  *

35  * Jump vector table as in table 3.1 in [1]

36  *

37  *******************************************************************

38  */

39

40

41 .globl _start

42 _start: b       reset                 // 复位向量:无条件跳转到reset标号

43   ldr pc, _undefined_instruction     // 未定义指令向量

44   ldr pc, _software_interrupt    // 软件中断向量

45   ldr pc, _prefetch_abort        // 预取指令异常向量

46   ldr pc, _data_abort            // 数据操作异常向量

47   ldr pc, _not_used                  // 未使用

48   ldr pc, _irq                       // 慢速中断向量

49   ldr pc, _fiq                       // 快速中断向量

50

51 _undefined_instruction: .word undefined_instruction 
                                        //
定义中断向量表入口地址

52 _software_interrupt:  .word software_interrupt

53 _prefetch_abort:  .word prefetch_abort

54 _data_abort:    .word data_abort

55 _not_used:    .word not_used

56 _irq:     .word irq

57 _fiq:     .word fiq

58

59   .balignl 16,0xdeadbeef

60

61

62 /*

63  *******************************************************************

64  *

65  * Startup Code (reset vector)

66  *

67  * do important init only if we don't start from memory!

68  * relocate armboot to ram

69  * setup stack

70  * jump to second stage

71  *

72  *******************************************************************

73  */

74

75 _TEXT_BASE:

76   .word TEXT_BASE             // 定义整个U-Boot镜像文件在内存加载的地址

77

78 .globl _armboot_start

79 _armboot_start:

80   .word _start

81

82 /*

83  * These are defined in the board-specific linker script.

84  */

85 .globl _bss_start            // 定义代码段起始

86 _bss_start:

87   .word __bss_start

88

89 .globl _bss_end          // 定义代码段结束地址

90 _bss_end:

91   .word _end

92

93 #ifdef CONFIG_USE_IRQ

94 /* IRQ stack memory (calculated at run-time) */

95 .globl IRQ_STACK_START   // 定义IRQ的堆栈地址

96 IRQ_STACK_START:

97   .word 0x0badc0de

98

99 /* IRQ stack memory (calculated at run-time) */

100 .globl FIQ_STACK_START  // 定义FIQ的堆栈地址

101 FIQ_STACK_START:

102   .word 0x0badc0de

103 #endif

 

_start标号下面的代码主要是一些伪指令,设置全局变量,供启动程序把U-Boot映像从Flash存储器复制到内存中。其中比较重要的变量是TEXT_BASE,该变量是通过连接脚本得到的,在本例中,TEXT_BASE全局变量定义在board/smdk2410/config.mk文件中,默认值是0x33F80000TEXT_BASE变量需要根据开发板的情况自己修改,具体地址需要根据硬件设计确定。

其他还有一些全局变量例如__bss_start_end等定义在board/smdk2410/u-boot.lds文件中。u-boot.lds文件保存了U-Boot数据段代码段等在内存中的存放情况,具体的值由编译器计算。

_start标号一开始定义了ARM处理器7个中断向量的向量表,对应ARM处理器的7种模式。由于上电一开始处理器会从地址0执行指令,因此第一个指令直接跳转到reset标号。reset执行机器初始化的一些操作,此处的跳转指令,无论是冷启动还是热启动开发板都会执行reset标号的代码。

%提示:reset也属于一种异常模式,并且该模式的代码不需要返回。

你可能感兴趣的:(14.3.1 _start标号)