bootloader代码分析报告文档格式.docx

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

bootloader代码分析报告文档格式.docx

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

bootloader代码分析报告文档格式.docx

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!

75ldrr0,=SWI_SVC_VECTOR

76movlr,pc

77ldrpc,[r0]

78ldmfdsp!

79INS_ABT_HANDLER

80sublr,lr,#4

81stmfdsp!

82ldrr0,=INS_ABT_VECTOR

83movlr,pc

84ldrpc,[r0]

85ldmfdsp!

86DAT_ABT_HANDLER

87sublr,lr,#4

88stmfdsp!

89ldrr0,=DAT_ABT_VECTOR

90movlr,pc

91ldrpc,[r0]

92ldmfdsp!

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!

103mrsr0,spsr

104stmfdsp!

105ldrr0,=IRQ_SVC_VECTOR

106ldrpc,[r0]

107

108;

*******************************************************

109SYS_RST_HANDLER

110mrsr0,cpsr;

entersvcmodeanddisableirq,fiq

111bicr0,r0,#ModeMask

112orrr0,r0,#(SVC32Mode:

OR:

IRQ_BIT:

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!

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.宏定义

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

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

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

行10、12为注释,行11定义了一个宏,&

的意义等于DCD伪指令,其分配一个字的内存,并用100初始化该字的内存,并使用RomBaseAddr标志这段内存的实际地址。

1.1.2.宏定义

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

1.1.3.判断是否是thumb指令

行18声明了逻辑变量THUMBCODE

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

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

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

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

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

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

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

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

1.1.6.定义系统异常向量表

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

1.1.7.程序跳转宏定义

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

1.1.8.异常处理程序定义

行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.1

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

当前位置:首页 > 法律文书 > 判决书

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

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