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