bootloader代码分析报告Word文件下载.docx
- 文档编号:21868297
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:34
- 大小:28.55KB
bootloader代码分析报告Word文件下载.docx
《bootloader代码分析报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《bootloader代码分析报告Word文件下载.docx(34页珍藏版)》请在冰豆网上搜索。
**********************************************************
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.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主函数程序入口
行168声明了GotoMain标号,其被定义为变量$MainEntry的值“main”
1.1.10.定义vector.s中需要用到的连接器变量
根据文献[2]第56-57页中的说明,行170-181引入了由连接器预定义的变量值。
173IMPORT|Imag
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- bootloader 代码 分析 报告