(1)定義入口。由于一個(gè)可執(zhí)行的Image必須有一個(gè)入口點(diǎn),并且只能有一個(gè)全局入口,通常這個(gè)入口放在ROM(Flash)的0x0地址,因此,必須通知編譯器以使其知道這個(gè)入口,該工作可通過(guò)修改連接器腳本來(lái)完成。 .globl _start //u-boot啟動(dòng)入口
_start: b reset //復(fù)位向量并且跳轉(zhuǎn)到reset ldr pc, _undefined_instruction ldr pc, _software_interrupt ldr pc, _prefetch_abort ldr pc, _data_abort ldr pc, _not_used ldr pc, _irq //中斷向量 ldr pc, _fiq //中斷向量 b sleep_setting //跳轉(zhuǎn)到sleep_setting 系統(tǒng)上電或reset后,cpu的PC一般都指向0x0地址,在0x0地址上的指令是
reset: //復(fù)位啟動(dòng)子程序 /******** 設(shè)置CPU為SVC32模式***********/ mrs r0,cpsr //將CPSR狀態(tài)寄存器讀取,保存到R0中 bic r0,r0,#0x1f orr r0,r0,#0xd3 msr cpsr,r0 //將R0寫入狀態(tài)寄存器中 /************** 關(guān)閉看門狗 ******************/ ldr r0, =pWTCON mov r1, #0x0 str r1, [r0] /************** 關(guān)閉所有中斷 *****************/ mov r1, #0xffffffff ldr r0, =INTMSK str r1, [r0] ldr r2, =0x7ff ldr r0, =INTSUBMSK str r2, [r0] /************** 初始化系統(tǒng)時(shí)鐘 *****************/
ldr r0, =LOCKTIME ldr r1, =0xffffff str r1, [r0] clear_bss:
ldr r0, _bss_start //找到bss的起始地址 add r0, r0, #4 //從bss的第一個(gè)字開始 ldr r1, _bss_end // bss末尾地址 mov r2, #0x00000000 //清零 clbss_l:str r2, [r0] // bss段空間地址清零循環(huán)
add r0, r0, #4 cmp r0, r1 bne clbss_l /***************** 關(guān)鍵的初始化子程序 ************************/
/ * cpu初始化關(guān)鍵寄存器 設(shè)置重要寄存器 設(shè)置內(nèi)存時(shí)鐘 * / cpu_init_crit: /** flush v4 I/D caches*/ mov r0, #0 mcr p15, 0, r0, c7, c7, 0 /* flush v3/v4 cache */ mcr p15, 0, r0, c8, c7, 0 /* flush v4 TLB */ /************* disable MMU stuff and caches ****************/
mrc p15, 0, r0, c1, c0, 0 bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS) bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM) orr r0, r0, #0x00000002 @ set bit 2 (A) Align orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache mcr p15, 0, r0, c1, c0, 0 /******* 在重新定位前,我們要設(shè)置RAM的時(shí)間,因?yàn)閮?nèi)存時(shí)鐘依賴開發(fā)板硬件的,你將會(huì)找到board目錄底下的memsetup.S。**************/
mov ip, lr #ifndef CONFIG_S3C2440A_JTAG_BOOT bl memsetup //調(diào)用memsetup子程序(在board/smdk2442memsetup.S) #endif mov lr, ip mov pc, lr //子程序返回 memsetup:
/**************** 初始化內(nèi)存 **************/ mov r1, #MEM_CTL_BASE adrl r2, mem_cfg_val add r3, r1, #52 1: ldr r4, [r2], #4 str r4, [r1], #4 cmp r1, r3 bne 1b /*********** 跳轉(zhuǎn)到原來(lái)進(jìn)來(lái)的下一個(gè)指令(start.S文件里) ***************/ mov pc, lr //子程序返回 并通過(guò)下段代碼拷貝到內(nèi)存里 /****************** 建立堆棧 *******************/ /**************** 跳轉(zhuǎn)到C代碼去 **************/
ldr pc, _start_armboot //跳轉(zhuǎn)到start_armboot函數(shù)入口,start_armboot字保存函數(shù)入口指針 _start_armboot: .word start_armboot //start_armboot函數(shù)在lib_arm /board.c中實(shí)現(xiàn) 從此進(jìn)入第二階段C語(yǔ)言代碼部分
|
|
來(lái)自: audrey_guowei > 《我的圖書館》