UBoot的启动流程.docx
- 文档编号:3507422
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:30
- 大小:26.66KB
UBoot的启动流程.docx
《UBoot的启动流程.docx》由会员分享,可在线阅读,更多相关《UBoot的启动流程.docx(30页珍藏版)》请在冰豆网上搜索。
UBoot的启动流程
4.3.2U-Boot的启动流程
开发板上电后,执行U-Boot的第一条指令,然后顺序执行U-Boot启动函数。
函数调用顺序如图4.2所示。
涉及到的主要文件:
cpu/arm920t/start.S、lowlevel_init.S、lib_arm/board.c、common/main.c。
图4.2U-Boot的启动流程
1.cpu/arm920t/start.S
board/samsung/smdk2410/u-boot.lds这个链接脚本的内容如下:
OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm","elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm","elf32-arm","elf32-arm")*/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
.=0x00000000;
.=ALIGN(4);
.text:
{
cpu/arm920t/start.o(.text)
*(.text)
}
.=ALIGN(4);
.rodata:
{*(.rodata)}
.=ALIGN(4);
.data:
{*(.data)}
.=ALIGN(4);
.got:
{*(.got)}
.=.;
__u_boot_cmd_start=.;
.u_boot_cmd:
{*(.u_boot_cmd)}
__u_boot_cmd_end=.;
.=ALIGN(4);
__bss_start=.;
.bss(NOLOAD):
{*(.bss).=ALIGN(4);}
_end=.;
}
由上面链接脚本可知目标程序各部分的链接顺序。
第一个要链接的是cpu/arm920t/start.o,那么U-Boot的入口指令一定位于这个程序(cpu/arm920t/start.S)中。
这是U-Boot的起始位置。
在这个文件中设置了处理器的状态、初始化中断和内存时序等,从Flash中跳转到定位好的内存位置执行。
cpu/arm920t/start.S这个汇编程序的内容如下:
#include
#include
#include
/*Jumpvectortableasintable3.1in[1]*/
.globl_start
_start:
bstart_code/*程序的开头就是复位向量*/
ldrpc,_undefined_instruction
ldrpc,_software_interrupt
ldrpc,_prefetch_abort
ldrpc,_data_abort
ldrpc,_not_used
ldrpc,_irq
ldrpc,_fiq
_undefined_instruction:
.wordundefined_instruction
_software_interrupt:
.wordsoftware_interrupt
_prefetch_abort:
.wordprefetch_abort
_data_abort:
.worddata_abort
_not_used:
.wordnot_used
_irq:
.wordirq
_fiq:
.wordfiq
.balignl16,0xdeadbeef
/*StartupCode(calledfromtheARMresetexceptionvector)
*doimportantinitonlyifwedon'tstartfrommemory!
*relocatearmboottoram
*setupstack
*jumptosecondstage*/
_TEXT_BASE:
.wordTEXT_BASE
.globl_armboot_start
_armboot_start:
.word_start
/*Thesearedefinedintheboard-specificlinkerscript.*/
.globl_bss_start
_bss_start:
.word__bss_start
.globl_bss_end
_bss_end:
.word_end
#ifdefCONFIG_USE_IRQ
/*IRQstackmemory(calculatedatrun-time)*/
.globlIRQ_STACK_START
IRQ_STACK_START:
.word0x0badc0de
/*IRQstackmemory(calculatedatrun-time)*/
.globlFIQ_STACK_START
FIQ_STACK_START:
.word0x0badc0de
#endif
/*theactualstartcode*/
start_code:
/*setthecputoSVC32mode*/
mrsr0,cpsr
bicr0,r0,#0x1f
orrr0,r0,#0xd3
msrcpsr,r0
blcoloured_LED_init
blred_LED_on
#ifdefined(CONFIG_AT91RM9200DK)||defined(CONFIG_AT91RM9200EK)
/*relocateexceptiontable*/
ldrr0,=_start
ldrr1,=0x0
movr2,#16
copyex:
subsr2,r2,#1
ldrr3,[r0],#4
strr3,[r1],#4
bnecopyex
#endif
#ifdefined(CONFIG_S3C2400)||defined(CONFIG_S3C2410)
/*turnoffthewatchdog*/
#ifdefined(CONFIG_S3C2400)
#definepWTCON0x15300000
#defineINTMSK0x14400008/*Interupt-Controllerbaseaddresses*/
#defineCLKDIVN0x14800014/*clockdivisorregister*/
#else
#definepWTCON0x53000000
#defineINTMSK0x4A000008/*Interupt-Controllerbaseaddresses*/
#defineINTSUBMSK0x4A00001C
#defineCLKDIVN0x4C000014/*clockdivisorregister*/
#endif
ldrr0,=pWTCON
movr1,#0x0
strr1,[r0]
/*maskallIRQsbysettingallbitsintheINTMR-default*/
movr1,#0xffffffff
ldrr0,=INTMSK
strr1,[r0]
#ifdefined(CONFIG_S3C2410)
ldrr1,=0x3ff
ldrr0,=INTSUBMSK
strr1,[r0]
#endif
/*FCLK:
HCLK:
PCLK=1:
2:
4*/
/*defaultFCLKis120MHz!
*/
ldrr0,=CLKDIVN
movr1,#3
strr1,[r0]
#endif/*CONFIG_S3C2400||CONFIG_S3C2410*/
/*wedosys-criticalinitsonlyatreboot,
*notwhenbootingfromram!
*/
#ifndefCONFIG_SKIP_LOWLEVEL_INIT
blcpu_init_crit
#endif
#ifndefCONFIG_SKIP_RELOCATE_UBOOT
relocate:
/*relocateU-BoottoRAM*//*把U-Boot重新定位到RAM*/
adrr0,_start/*r0<-currentpositionofcode*//*r0是代码的当前位置*/
ldrr1,_TEXT_BASE/*testifwerunfromflashorRAM*//*测试判断是从Flash启动,还是RAM*/
cmpr0,r1/*don'trelocduringdebug*//*比较r0和r1,调试的时候不要执行重定位*/
beqstack_setup/*如果r0等于r1,跳过重定位代码*/
ldrr2,_armboot_start
ldrr3,_bss_start
subr2,r3,r2/*r2<-sizeofarmboot*//*r2得到armboot的大小*/
addr2,r0,r2/*r2<-sourceendaddress*//*r2得到要复制代码的末尾地址*/
copy_loop:
/*重新定位代码*/
ldmiar0!
{r3-r10}/*copyfromsourceaddress[r0]*//*从源地址[r0]复制*/
stmiar1!
{r3-r10}/*copytotargetaddress[r1]*//*复制到目的地址[r1]*/
cmpr0,r2/*untilsourceendaddreee[r2]*//*复制数据块直到源数据末尾地址[r2]*/
blecopy_loop
#endif/*CONFIG_SKIP_RELOCATE_UBOOT*/
stack_setup:
/*Setupthestack*//*初始化堆栈等*/
ldrr0,_TEXT_BASE/*upper128KiB:
relocateduboot*//*上面是128KiB重定位的U-Boot*/
subr0,r0,#CONFIG_SYS_MALLOC_LEN/*mallocarea*//*向下是内存分配空间*/
subr0,r0,#CONFIG_SYS_GBL_DATA_SIZE/*bdinfo*//*然后是bdinfo结构体地址空间*/
#ifdefCONFIG_USE_IRQ
subr0,r0,#(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
subsp,r0,#12/*leave3wordsforabort-stack*//*为abort-stack预留3个字*/
clear_bss:
ldrr0,_bss_start/*findstartofbsssegment*//*找到bss段起始地址*/
ldrr1,_bss_end/*stophere*//*bss段末尾地址*/
movr2,#0x00000000/*clear*//*清零*/
clbss_l:
strr2,[r0]/*clearloop...*//*bss段地址空间清零循环...*/
addr0,r0,#4
cmpr0,r1
bleclbss_l
ldrpc,_start_armboot/*跳转到start_armboot函数入口,_start_armboot字保存函数入口指针*/
_start_armboot:
.wordstart_armboot/*start_armboot()函数在lib_arm/board.c中实现*/
/*CPU_init_criticalregisters
*setupimportantregisters
*setupmemorytiming*/
#ifndefCONFIG_SKIP_LOWLEVEL_INIT
cpu_init_crit:
/*关键的初始化子程序*/
/*flushv4I/Dcaches*//*初始化caches的指令*/
movr0,#0
mcrp15,0,r0,c7,c7,0/*flushv3/v4cache*/
mcrp15,0,r0,c8,c7,0/*flushv4TLB*/
/*disableMMUstuffandcaches*//*关闭MMU的指令*/
mrcp15,0,r0,c1,c0,0
bicr0,r0,#0x00002300@clearbits13,9:
8(--V---RS)
bicr0,r0,#0x00000087@clearbits7,2:
0(B----CAM)
orrr0,r0,#0x00000002@setbit2(A)Align
orrr0,r0,#0x00001000@setbit12(I)I-Cache
mcrp15,0,r0,c1,c0,0
/*beforerelocating,wehavetosetupRAMtiming
*becausememorytimingisboard-dependend,youwill
*findalowlevel_init.Sinyourboarddirectory.*/
movip,lr
#ifdefined(CONFIG_AT91RM9200EK)
#else
bllowlevel_init
#endif
movlr,ip
movpc,lr
#endif/*CONFIG_SKIP_LOWLEVEL_INIT*/
/*Interrupthandling*/
@
@IRQstackframe.
@
#defineS_FRAME_SIZE72
#defineS_OLD_R068
#defineS_PSR64
#defineS_PC60
#defineS_LR56
#defineS_SP52
#defineS_IP48
#defineS_FP44
#defineS_R1040
#defineS_R936
#defineS_R832
#defineS_R728
#defineS_R624
#defineS_R520
#defineS_R416
#defineS_R312
#defineS_R28
#defineS_R14
#defineS_R00
#defineMODE_SVC0x13
#defineI_BIT0x80
/*usebad_save_user_regsforabort/prefetch/undef/swi...
*useirq_save_user_regs/irq_restore_user_regsforIRQ/FIQhandling*/
.macrobad_save_user_regs
subsp,sp,#S_FRAME_SIZE
stmiasp,{r0-r12}@Callingr0-r12
ldrr2,_armboot_start
subr2,r2,#(CONFIG_STACKSIZE)
subr2,r2,#(CONFIG_SYS_MALLOC_LEN)
subr2,r2,#(CONFIG_SYS_GBL_DATA_SIZE+8)@setbase2wordsintoabortstack
ldmiar2,{r2-r3}@getpc,cpsr
addr0,sp,#S_FRAME_SIZE@restoresp_SVC
addr5,sp,#S_SP
movr1,lr
stmiar5,{r0-r3}@savesp_SVC,lr_SVC,pc,cpsr
movr0,sp
.endm
.macroirq_save_user_regs
subsp,sp,#S_FRAME_SIZE
stmiasp,{r0-r12}@Callingr0-r12
addr7,sp,#S_PC
stmdbr7,{sp,lr}^@CallingSP,LR
strlr,[r7,#0]@SavecallingPC
mrsr6,spsr
strr6,[r7,#4]@SaveCPSR
strr0,[r7,#8]@SaveOLD_R0
movr0,sp
.endm
.macroirq_restore_user_regs
ldmiasp,{r0-lr}^@Callingr0-lr
movr0,r0
ldrlr,[sp,#S_PC]@GetPC
addsp,sp,#S_FRAME_SIZE
subspc,lr,#4@return&movespsr_svcintocpsr
.endm
.macroget_bad_stack
ldrr13,_armboot_start@setupourmodestack
subr13,r13,#(CONFIG_STACKSIZE)
subr13,r13,#(CONFIG_SYS_MALLOC_LEN)
subr13,r13,#(CONFIG_SYS_GBL_DATA_SIZE+8)@reservedacouplespotsinabortstack
strlr,[r13]@savecallerlr/spsr
mrslr,spsr
strlr,[r13,#4]
movr13,#MODE_SVC@prepareSVC-Mode
@msrspsr_c,r13
msrspsr,r13
movlr,pc
movspc,lr
.endm
.macroget_irq_stack@setupIRQstack
ldrsp,IRQ_STACK_START
.endm
.macroget_fiq_stack@setupFIQstack
ldrsp,FIQ_STACK_START
.endm
/**exceptionhandlers*/
.align5
undefined_instruction:
get_bad_stack
bad_save_user_regs
bldo_undefined_instruction
.align5
software_interrupt:
get_bad_stack
bad_save_user_regs
bldo_software_interrupt
.align5
prefetch_abort:
get_bad_stack
bad_save_user_regs
bldo_prefetch_abort
.align5
data_abort:
get_bad_stack
bad_save_user_regs
bldo_data_abort
.align5
not_used:
get_bad_stack
bad_save_user_regs
bldo_not_used
#ifdefCONFIG_USE_IRQ
.align5
irq:
get_irq_stack
irq_save_user_regs
bldo_irq
irq_restore_user_regs
.align5
fiq:
get_fiq_stack
/*someoneoughttowriteamoreeffictionfiq_save_user_regs*/
irq_save_user_regs
bldo_fiq
irq_restore_user_regs
#else
.align5
irq:
get_bad_stack
bad_save_user_regs
bldo_irq
.align5
fiq:
get_bad_stack
bad_save_user_regs
bldo_fiq
#endif
2.lowlevel_init.S
文件board/samsung/smdk2410/lowlevel_init.S用于配置开发板参数,内容如下所示:
#include
#include
/*someparametersfortheboard*/
/*Takenfromlinux/arch/arm/boot/compressed/head-s3c2410.S*/
#defineBWSCON0x48000000
/*BWSCON*/
#defineDW8(0x0)
#defineDW16(0x1)
#defineDW32(0x2)
#defineWAIT(0x1<<2)
#defineUBLB(0x1<<3)
#defineB1_BWSCON(DW32)
#defineB2_BWSCON(DW16)
#defineB3_BWSCON(DW16+WAIT+UBLB)
#defineB4_BWSCON(DW16)
#defineB5_BWSCON(DW16)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- UBoot 启动 流程