自己動手寫bootloader

2021-06-19 19:26:56 字數 2605 閱讀 2421

原始出處

、作者資訊和本宣告。否則將追究法律責任。

為了寫乙個bootloader讓板子跑起來,首先我們要知道bootloader是個什麼東東才行。簡單的說,bootloader就是乙個引導核心啟動的一段小**,也就是說當啟動完核心之後,它的使命就已經結束。

bootloader生命週期:初始化硬體==》設定啟動引數==》跳到linux核心的首位址==》消亡。那麼它是怎麼啟動核心的呢或者說在啟動核心之前它究竟完成了哪些工作呢?

寫**之前還是先了解下核心啟動的硬性條件:

1.cpu暫存器的設定: r0=0,r1=機器型別id(linux/arch/arm/tools/mach-types),r2=啟動引數標記列表在ram中的基位址。

2.cpu工作模式:設定為管理模式(因為suv模式的許可權最大),且必須禁止中斷irq、fiq。

3.cache和mmu的設定:mmu必須關閉,資料cache必須關閉,指令cache可以開啟可以關閉,不過建議開啟,因為可以加快bootloader的執行速度

bootloader的工作分為兩個階段,由組合語言和c語言各自掌管:

第一階段完成功能(組合語言):包括模式設定,關閉看門狗(防止系統定時重啟),關閉中斷,關cache,設定時鐘頻率,初始化硬體(nand flash和sdram),初始化堆疊(因為要進入到c語言中執行),跳轉到第二階段**的c入口點。

第二階段完成功能(c語言):重定位從flash裡把程式本身複製到sdram裡去,清bss段,為核心設定啟動引數,呼叫核心。

注釋:bootloader的**分為前4k和4k後,bootloader執行時前4k**會由硬體自動的拷貝到sram中,然後前4k**需要將bootloader拷貝到sdram中執行(拷貝4k後的**還是全部分具體情況而定),因為nand flash是不能直接執行**的。

完成乙個簡單的具有基本功能的bootloader

start.s(bootloader入口)

.globl _start

_start:

mrs r0 , cpsr

bic r0 , r0 , #0x1f

orr r0 , r0 , #0xd3 

msr cpsr , r0

ldr r0, 

=0x53000000

ldr r1, 

=0str r1, [r0]

ldr r0 , 

=0x4a000008

ldr r1 , 

=0xffffffff

str r1 , [r0]

ldr r0 , 

=0x4a00001c

ldr r1 , 

=0x7fff

str r1 , [r0] 

mrc p15, 

0, r2, c1, c0, 

0orr r2, r2, #(

1<<

12)

mcr p15, 

0, r2, c1, c0, 

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 1(a)align

orr r0,r0,#0x00001000 @set bit 12(i)i-cache

mcr p15,0,r0,c1,c0,0

ldr r1 ,

=0str r1, [r1] 

ldr r1, [r1] 

cmp r1, #

0ldreq sp, 

=4096

ldrne sp, 

=(0x40000000

+4096)

*1.7 時鐘初始化,主要是mpllcon、clkdivn暫存器的設定,特別注意將匯流排模式改為非同步匯流排模式*/

bl clock_init

bl sdram_init

bl nand_init

bl copycode2ram

ldr r0,

=__bss_start

ldr r1, 

=__bss_end

cmp r0, r1

beq setup_stack

mov r2, #

0clear_loop

:str r2, [r0], #

4cmp r0, r1

bne clear_loop

relocate

:mov r0, #

0ldr r1, 

=__start

ldr r2, 

=__bss_start

sub r2, r2, r1

setup_stack:

ldr pc, 

=main 

main.c

int

main(

void)

本文出自 「d.c_look」 部落格,請務必保留此出處

學習筆記 自己動手寫BootLoader

tips 核心從板載啟動的 bootargs 核心啟動引數,bootargs 是 bootloader 傳遞給核心的啟動字串。在嵌入式作業系統中,bootloader是在 作業系統核心執行之前執行。可以初始化硬體裝置 建立記憶體空間對映圖,從而將系統的軟硬體環境帶到乙個合適狀態,以便為最終呼叫 作業...

自己動手寫CMS

簡易的cms外掛程式,可供借鑑或者擴充套件 流程 定義內容 分類與組織內容 儲存內容 操作控制內容 定義內容 制定目標 確定需要的內容型別 目標使用者定位 確定目標使用者需要何種技術 分類與組織內容 按內容所屬的邏輯層級關係來劃分 按內容的種類來劃分,比如video text audio等等 儲存內...

自己動手寫SpringMVC 四

本文將主要實現dispatcherservlet!之前已經分析過dispatcherservlet主要的任務,分為五個任務,我們從任務一開始開始實現!任務1 把專案中所有的bean掃瞄,進行維護 實現 如下 private void scanpackage string basepackage el...