最近在學習Uboot,對其結構不清楚是以這篇文章還不錯。
1、紅色為彙編指令;棕色為gnu彙編指令; 藍色 為寄存器;黑色為變量、常量、數字等;綠色為注釋。
2、部分比較繁瑣的注釋用白色标出。
.globl _start
@将_start聲明為“全局變量”,且可以被外部引用。globl: makes the symbol visible to ld,在别的程式中出現:ldr pc._star時,程式将跳轉到這個地方執行
_start: b reset
@在_start行寫入b reset語句 。 b指令就是無條件地跳到reset的地方運作
ldr pc , _undefined_instruction
@LDR 指令用于從存儲器中将一個32 位的字資料傳送到目的寄存器中。該指令通常用于從存儲器中讀取32 位的字資料到通用寄存器,然後對資料進行處理。當程式計數器PC 作為目的寄存器時,指令從存儲器中讀取的資料被當作目的位址,進而可以實作程式流程的跳轉。
@ 當 發生中斷 時 程式跳轉到此行,程式将繼續跳轉到中斷處理程式中執行。以下類同。我想一定是放在存儲器0x00的位置,這樣就可以系統可以根據中斷向量的标号來找到跳轉到對應的行。如中斷向量是2,則會跳到 ldr pc, _prefetch_abort。
@ldr:load from memory into a register.
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
_undefined_instruction: .word undefined_instruction
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word fiq
.balignl 16,0xdeadbeef
.......
reset: //複位啟動子程式
//ARM 微處理器支援程式狀态寄存器通路指令,用于在程式狀态寄存器
//和通用寄存器之間傳送資料,程式狀态寄存器通路指令包括以下兩條:
//MRS 程式狀态寄存器到通用寄存器的資料傳送指令
//MRS{條件} 通用寄存器,程式狀态寄存器(CPSR 或SPSR)
mrs r0,cpsr
bic r0,r0,#0x1f // 清除r0的低五位。
orr r0,r0,#0xd3 // r0置位 d3=11010011
msr cpsr,r0 // r0寫回cpsr
# define pWTCON 0x53000000
# define INTMSK 0x4A000008
# define CLKDIVN 0x4C000014
//關閉看門狗
ldr r0, =pWTCON //把pWTCON的值裝載到r0
mov r1, #0x0 // 0裝載到r1
str r1, [r0] // 将0賦給r0指向的位址
// 禁止所有中斷
//禁止主中斷控制器
mov r1, #0xffffffff //把 0xffffffff 裝載到 r1
ldr r0, =INTMSK //把 INTMSK 的值裝載到r0
str r1, [r0] // 将 0xffffffff 賦給 INTMSK 指向的位址
# if defined(CONFIG_S3C2410)
//禁止子中斷控制器
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
設定CPU的頻率
CLKDIVN寄存器的reset預設值是0x00000000,
第0位=0,PCLK=HCLK;第0位=1,PCLK=HCLK/2;
第1位=0,HCLK=FCLK;第1位=1,HCLK=FCLK/2;
這裡 HCLK=FCLK/2,PCLK=HCLK/2;
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
MCR 指令的格式為:
MCR{條件} 協處理器編碼,協處理器操作碼1,源寄存器,目的寄存器1,目的寄存器2,協處
理器操作碼2。
MCR 指令用于将ARM處理器寄存器中的資料傳送到協處理器寄存器中,若協處理器不能成功完成操作,則産生未定義指令異常。其中協處理器操作碼1 和協處理器操作碼2為協處理器将要執行的操作,源寄存器為ARM 處理器的寄存器,目的寄存器1 和目的寄存器2 均為協處理器的寄存器。
指令示例:
MCR P3 , 3 , R0 , C4 , C5 , 6 ;該指令将 ARM 處理器寄存器 R0 中的資料傳送到協處理器 P3 的寄存器 C4 和 C5 中。
5、MRC 指令
MRC 指令的格式為:
MRC{條件} 協處理器編碼,協處理器操作碼1,目的寄存器,源寄存器1,源寄存器2,協處理
器操作碼2。
MRC 指令用于将協處理器寄存器中的資料傳送到ARM處理器寄存器中,若協處理器不能成功完成操作,則産生未定義指令異常。其中協處理器操作碼1 和協處理器操作碼2為協處理器将要執行的操作,目的寄存器為ARM 處理器的寄存器,源寄存器1 和源寄存器2 均為協處理器的寄存器。
指令示例:
MRC P3 , 3 , R0 , C4 , C5 , 6 ;該指令将協處理器 P3 的寄存器中的資料傳送到 ARM 處理器寄存器中.
cpu_init_crit:
mov r0, #0
mcr p15, 0, r0, c7, c7, 0
mcr p15, 0, r0, c8, c7, 0
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
mov ip, lr
bl lowlevel_init
mov lr, ip
mov pc, lr