bootloader代码分析报告.docx

上传人:b****7 文档编号:8732108 上传时间:2023-02-01 格式:DOCX 页数:34 大小:28.55KB
下载 相关 举报
bootloader代码分析报告.docx_第1页
第1页 / 共34页
bootloader代码分析报告.docx_第2页
第2页 / 共34页
bootloader代码分析报告.docx_第3页
第3页 / 共34页
bootloader代码分析报告.docx_第4页
第4页 / 共34页
bootloader代码分析报告.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

bootloader代码分析报告.docx

《bootloader代码分析报告.docx》由会员分享,可在线阅读,更多相关《bootloader代码分析报告.docx(34页珍藏版)》请在冰豆网上搜索。

bootloader代码分析报告.docx

bootloader代码分析报告

Bootloader代码分析报告

徐凯

2007-8-3

1.启动代码分析

1.1.vector.s代码分析

由于连接器参数中有-firstvector.o,所以先从这个文件开始分析。

首先,列出源代码:

1ModeMaskEQU0x1F

2SVC32ModeEQU0x13

3IRQ32ModeEQU0x12

4FIQ32ModeEQU0x11

5User32ModeEQU0x10

6Abort32ModeEQU0x17

7Undef32ModeEQU0x1B

8IRQ_BITEQU0x80

9FIQ_BITEQU0x40

10;RomBaseAddrEQU0

11RamBaseAddrEQU&100

12;RamEndAddrEQU&200

13GBLSMainEntry

14MainEntrySETS"main"

15IMPORT$MainEntry

16;**********************************************************

17;シ・鯡ヌキケモテtasm.exeスミア默・

18GBLLTHUMBCODE

19[{CONFIG}=16

20THUMBCODESETL{TRUE}

21CODE32

22|

23THUMBCODESETL{FALSE}

24]

25

26[THUMBCODE

27CODE32;forstart-upcodeforThumbmode

28]

29

30;******************************************************

31AREASelfBoot,CODE,READONLY

32

33IMPORTUDF_INS_VECTOR

34IMPORTSWI_SVC_VECTOR

35IMPORTINS_ABT_VECTOR

36IMPORTDAT_ABT_VECTOR

37IMPORTIRQ_SVC_VECTOR

38IMPORTFIQ_SVC_VECTOR

39

40ENTRY

41IF:

DEF:

|ads$version|

42ELSE

43EXPORT__main

44__main

45ENDIF

46ResetEntry

47bSYS_RST_HANDLER

48bUDF_INS_HANDLER

49bSWI_SVC_HANDLER

50bINS_ABT_HANDLER

51bDAT_ABT_HANDLER

52b.

53bIRQ_SVC_HANDLER

54bFIQ_SVC_HANDLER

55

56;******************************************************

57MACRO

58$LabelHANDLER$Vector

59$Label

60sublr,lr,#4

61stmfdsp!

{r0-r3,lr}

62ldrr0,=$Vector

63ldrpc,[r0]

64ldmfdsp!

{r0-r3,pc}^

65MEND

66

67UDF_INS_HANDLER

68stmfdsp!

{r0-r3,lr}

69ldrr0,=UDF_INS_VECTOR

70movlr,pc

71ldrpc,[r0]

72ldmfdsp!

{r0-r3,pc}^

73SWI_SVC_HANDLER

74stmfdsp!

{r0-r3,lr}

75ldrr0,=SWI_SVC_VECTOR

76movlr,pc

77ldrpc,[r0]

78ldmfdsp!

{r0-r3,pc}^

79INS_ABT_HANDLER

80sublr,lr,#4

81stmfdsp!

{r0-r3,lr}

82ldrr0,=INS_ABT_VECTOR

83movlr,pc

84ldrpc,[r0]

85ldmfdsp!

{r0-r3,pc}^

86DAT_ABT_HANDLER

87sublr,lr,#4

88stmfdsp!

{r0-r3,lr}

89ldrr0,=DAT_ABT_VECTOR

90movlr,pc

91ldrpc,[r0]

92ldmfdsp!

{r0-r3,pc}^

93IRQ_SVC_HANDLER

94sublr,lr,#4

95stmfdsp!

{r0-r12,lr}

96mrsr0,spsr

97stmfdsp!

{r0}

98ldrr0,=IRQ_SVC_VECTOR

99ldrpc,[r0]

100FIQ_SVC_HANDLER

101sublr,lr,#4

102stmfdsp!

{r0-r12,lr}

103mrsr0,spsr

104stmfdsp!

{r0}

105ldrr0,=IRQ_SVC_VECTOR

106ldrpc,[r0]

107

108;*******************************************************

109SYS_RST_HANDLER

110mrsr0,cpsr;entersvcmodeanddisableirq,fiq

111bicr0,r0,#ModeMask

112orrr0,r0,#(SVC32Mode:

OR:

IRQ_BIT:

OR:

FIQ_BIT)

113msrcpsr_c,r0

114

115IMPORTInitSystem

116blInitSystem

117

118adrr0,ResetEntry

119movr3,#(RamBaseAddr<<16)

120ldrr1,BaseOfROM

121ldrr2,TopOfROM

122addr1,r1,r3

123addr2,r2,r3

1240

125ldmiar0!

{r4-r11}

126stmiar1!

{r4-r11}

127cmpr1,r2

128bcc%B0

129

130subr1,r1,r2

131subr0,r0,r1

132ldrr1,BaseOfBSS

133ldrr2,BaseOfZero

134addr1,r1,r3

135addr2,r2,r3

1361

137cmpr1,r2

138ldrccr4,[r0],#4

139strccr4,[r1],#4

140bcc%B1

141

142movr0,#0

143ldrr2,EndOfBSS

144addr2,r2,r3

1453

146cmpr1,r2

147strccr0,[r1],#4

148bcc%B3

149

150IMPORTRemapMemory

151

152adrr0,ResetEntry

153ldrr1,=RemapMemory

154ldrr2,BaseOfROM

155subr2,r1,r2

156addr0,r0,r2

157addr1,r2,r3

158movr2,#32

1590

160ldrr3,[r0],#4

161strr3,[r1],#4

162subsr2,r2,#1

163bne%B0

164

165ldrlr,GotoMain

166bRemapMemory

167

168GotoMainDCD$MainEntry

169

170;***********************************************

171IMPORT|Image$$RO$$Base|;ROMcodestart

172IMPORT|Image$$RO$$Limit|;RAMdatastartsafterROMprogram

173IMPORT|Image$$RW$$Base|;Pre-initialisedvariables

174IMPORT|Image$$ZI$$Base|;uninitialisedvariables

175IMPORT|Image$$ZI$$Limit|;EndofvariableRAMspace

176

177BaseOfROMDCD|Image$$RO$$Base|

178TopOfROMDCD|Image$$RO$$Limit|

179BaseOfBSSDCD|Image$$RW$$Base|

180BaseOfZeroDCD|Image$$ZI$$Base|

181EndOfBSSDCD|Image$$ZI$$Limit|

182

183;***********************************************

184TIP_SIZEEQU256

185

186IMPORTResetMemSet

187EXPORTtrans_to_boot

188trans_to_boot

189movlr,r1;a2=r1

190ldrr1,=ResetMemSet

191ldrr2,BaseOfROM

192subr2,r1,r2

193addr0,r0,r2;a1=r0

194movr2,#TIP_SIZE

1950

196ldrr3,[r1],#4

197strr3,[r0],#4

198subsr2,r2,#1

199bne%B0

200

201subr0,r0,#TIP_SIZE*4

202movpc,r0

203

204;***********************************************

205

206END

1.1.1.宏定义

1ModeMaskEQU0x1F

2SVC32ModeEQU0x13

3IRQ32ModeEQU0x12

4FIQ32ModeEQU0x11

5User32ModeEQU0x10

6Abort32ModeEQU0x17

7Undef32ModeEQU0x1B

8IRQ_BITEQU0x80

9FIQ_BITEQU0x40

10;RomBaseAddrEQU0

11RamBaseAddrEQU&100

12;RamEndAddrEQU&200

行1定义了CPSR中表示模式位的5位。

行2-7定义了6种处理器模式(除system模式)对应的CPSR位。

行8-7定义了CPSR中FIQ与IRQ置位。

行10、12为注释,行11定义了一个宏,&的意义等于DCD伪指令,其分配一个字的内存,并用100初始化该字的内存,并使用RomBaseAddr标志这段内存的实际地址。

1.1.2.宏定义

13GBLSMainEntry

14MainEntrySETS"main"

15IMPORT$MainEntry

行13-15声明了一个字符串变量MainEntry,并将其设置为”main”,并引入外部符号”main”。

1.1.3.判断是否是thumb指令

18GBLLTHUMBCODE

19[{CONFIG}=16

20THUMBCODESETL{TRUE}

21CODE32

22|

23THUMBCODESETL{FALSE}

24]

25

26[THUMBCODE

27CODE32;forstart-upcodeforThumbmode

28]

行18声明了逻辑变量THUMBCODE

行19-24执行了一个IFELSEENDIF指令,CONFIG变量是[1]中第88页说明的汇编器域定义变量,如果其为32则说明本文件采用ARM汇编器,相应地把THUMBCODE设置为FALSE,若为16则是使用thumb汇编器,相应地把THUMBCODE设置为TRUE。

行26-28,强制执行32位的ARM指令,感觉很奇怪,应该是用CODE16命令才对。

1.1.4.定义新程序、引入新符号

31AREASelfBoot,CODE,READONLY

32

33IMPORTUDF_INS_VECTOR

34IMPORTSWI_SVC_VECTOR

35IMPORTINS_ABT_VECTOR

36IMPORTDAT_ABT_VECTOR

37IMPORTIRQ_SVC_VECTOR

38IMPORTFIQ_SVC_VECTOR

行31定义了一个新的程序段SelfBoot。

行33-38引入了一系列的符号,这些符号在sysinit.s中定义并导出。

1.1.5.定义新程序、引入新符号

40ENTRY

41IF:

DEF:

|ads$version|

42ELSE

43EXPORT__main

44__main

45ENDIF

行40首先声明了程序的入口

根据[1]中第89页的说明,行41-45判断程序是给ADS还是SDT执行的,如果是如果是SDT,则导出__main符号,并开始定义__main函数的开始。

1.1.6.定义系统异常向量表

46ResetEntry

47bSYS_RST_HANDLER

48bUDF_INS_HANDLER

49bSWI_SVC_HANDLER

50bINS_ABT_HANDLER

51bDAT_ABT_HANDLER

52b.

53bIRQ_SVC_HANDLER

54bFIQ_SVC_HANDLER

行46-54定义了系统异常处理向量表,并在vector.o首次执行时首先执行行47的代码。

1.1.7.程序跳转宏定义

57MACRO

58$LabelHANDLER$Vector

59$Label

60sublr,lr,#4

61stmfdsp!

{r0-r3,lr}

62ldrr0,=$Vector

63ldrpc,[r0]

64ldmfdsp!

{r0-r3,pc}^

65MEND

行57-65定义了一个有1个参数的宏HANDLER,该宏实现程序跳转,跳转到$Vector所指向内存所保存的内存地址的值,执行完该函数后,恢复现场,并返回原来的状态。

1.1.8.异常处理程序定义

67UDF_INS_HANDLER

68stmfdsp!

{r0-r3,lr}

69ldrr0,=UDF_INS_VECTOR

70movlr,pc

71ldrpc,[r0]

72ldmfdsp!

{r0-r3,pc}^

73SWI_SVC_HANDLER

74stmfdsp!

{r0-r3,lr}

75ldrr0,=SWI_SVC_VECTOR

76movlr,pc

77ldrpc,[r0]

78ldmfdsp!

{r0-r3,pc}^

79INS_ABT_HANDLER

80sublr,lr,#4

81stmfdsp!

{r0-r3,lr}

82ldrr0,=INS_ABT_VECTOR

83movlr,pc

84ldrpc,[r0]

85ldmfdsp!

{r0-r3,pc}^

86DAT_ABT_HANDLER

87sublr,lr,#4

88stmfdsp!

{r0-r3,lr}

89ldrr0,=DAT_ABT_VECTOR

90movlr,pc

91ldrpc,[r0]

92ldmfdsp!

{r0-r3,pc}^

93IRQ_SVC_HANDLER

94sublr,lr,#4

95stmfdsp!

{r0-r12,lr}

96mrsr0,spsr

97stmfdsp!

{r0}

98ldrr0,=IRQ_SVC_VECTOR

99ldrpc,[r0]

100FIQ_SVC_HANDLER

101sublr,lr,#4

102stmfdsp!

{r0-r12,lr}

103mrsr0,spsr

104stmfdsp!

{r0}

105ldrr0,=IRQ_SVC_VECTOR

106ldrpc,[r0]

107

108;*******************************************************

109SYS_RST_HANDLER

110mrsr0,cpsr;entersvcmodeanddisableirq,fiq

111bicr0,r0,#ModeMask

112orrr0,r0,#(SVC32Mode:

OR:

IRQ_BIT:

OR:

FIQ_BIT)

113msrcpsr_c,r0

114

115IMPORTInitSystem

116blInitSystem

117

118adrr0,ResetEntry

119movr3,#(RamBaseAddr<<16)

120ldrr1,BaseOfROM

121ldrr2,TopOfROM

122addr1,r1,r3

123addr2,r2,r3

1240

125ldmiar0!

{r4-r11}

126stmiar1!

{r4-r11}

127cmpr1,r2

128bcc%B0

129

130subr1,r1,r2

131subr0,r0,r1

132ldrr1,BaseOfBSS

133ldrr2,BaseOfZero

134addr1,r1,r3

135addr2,r2,r3

1361

137cmpr1,r2

138ldrccr4,[r0],#4

139strccr4,[r1],#4

140bcc%B1

141

142movr0,#0

143ldrr2,EndOfBSS

144addr2,r2,r3

1453

146cmpr1,r2

147strccr0,[r1],#4

148bcc%B3

149

150IMPORTRemapMemory

151

152adrr0,ResetEntry

153ldrr1,=RemapMemory

154ldrr2,BaseOfROM

155subr2,r1,r2

156addr0,r0,r2

157addr1,r2,r3

158movr2,#32

1590

160ldrr3,[r0],#4

161strr3,[r1],#4

162subsr2,r2,#1

163bne%B0

164

165ldrlr,GotoMain

166bRemapMemory

行67-166定义了7种模式异常的处理函数

具体地:

UDF_INS_HANDLER执行UDF_INS_VECTOR内存所保存的指令后,返回到异常发生之前的状态。

类似,

SWI_SVC_HANDLER,

INS_ABT_HANDLER,

DAT_ABT_HANDLER,

IRQ_SVC_HANDLER,

FIQ_SVC_HANDLER也执行类似的操作,执行XX_XX_VECTOR内存所保存的指令,然后返回到异常发生之前的状态。

SYS_RST_HANDLER异常处理程序与其它异常处理程序有很大不同,

行110-113使得处理器进入SVC模式,并且禁止FIQ与IRQ。

行115-116使得程序跳转到sysinit.s中定义的InitSystem函数中执行,并在执行结束后返回。

InitSystem函数的作用是进行内存、堆栈、LED端口、串口、定时器以及中断的初始化工作,具体讲解请参见sysinit.s中的分析(1.2.12)。

行118将异常向量表ResetEntry的地址保存入r0。

行119-128将bootloader的RO段拷贝入内存。

行130-140将bootloader的RW段拷贝入内存。

行142-148将内存中的ZI段初始化为0。

行150-163将RemapMemory函数拷贝入内存中。

行165将返回地址进行设置。

行166执行RemapMemory函数(在sysinit.s中定义),RemapMemory函数主要是设置ROMCON0、ROMCON1和DRAMCON0、DRAMCON1;并将IRQ_SERVICE函数的地址存入一个内存中的数组中。

RemapMemory函数执行完后将跳入bios.c中定义的main函数。

1.1.9.声明C主函数程序入口

168GotoMainDCD$MainEntry

行168声明了GotoMain标号,其被定义为变量$MainEntry的值“main”

1.1.10.定义vector.s中需要用到的连接器变量

根据文献[2]第56-57页中的说明,行170-181引入了由连接器预定义的变量值。

170;***********************************************

171IMPORT|Image$$RO$$Base|;ROMcodestart

172IMPORT|Image$$RO$$Limit|;RAMdatastartsafterROMprogram

173IMPORT|Imag

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1