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