Bootloader 介紹
相當于pc機的BIOS,在操作系統啟動(dòng)內核運行之前運行的一段小程序,通過(guò)這段小程序我們可以初始化cpu內部的硬件設備,建立內存空間映射范圍,從而將系統的軟硬件環(huán)境帶到一個(gè)合適的狀態(tài),以便最終調用os內核準備好正確的環(huán)境。
本文引用地址:http://dyxdggzs.com/article/201611/316751.htm可以得出bootloader主要有2個(gè)任務(wù),1是初始化cpu內部的硬件設備,2是將os kernel帶到內存中去。
在講bootloader之前,我們先講講pc機的啟動(dòng)過(guò)程,
pc機中有bois,這個(gè)是固化在硬件的,當pc機一加電以后,bios就會(huì )自己?jiǎn)?dòng),完成硬件檢測和資源的分配,然后將硬盤(pán)中的引導程序調入內存,然后把控制權交給引導程序,引導程序主要的用途就是將操作系統的kernel調入內存,然后跳轉到內核的開(kāi)始地址,然后os就開(kāi)始啟動(dòng)了。
就pc而言,啟動(dòng)的過(guò)程相對復雜,從bios--->引導程序(grub等)---->os
但是嵌入式系統來(lái)說(shuō),他沒(méi)有bios這樣硬件,所以它的啟動(dòng)過(guò)程全部都是交給bootloader去完成的。
bootloader是放在flash的最前面的位置,原因是:
系統在加電或復位的時(shí)候,所有的cpu通常都從cpu制造商預先安排地址開(kāi)始執行的,(通常是0x00000000位置),所以bootloader通常是放在flash中的最前面的位置。
這是一個(gè)簡(jiǎn)易的flash分布圖,bootloader在flash的最前端。
關(guān)于bootloader的啟動(dòng)過(guò)程還可以分為兩種,1是單階段,2是多階段的
現在很多的bootloader是2個(gè)階段的
stage 1 的步驟(用的是匯編)
1是初始化硬件設備(cpu內存的硬件設備)
2是初始化stage2 要使用的內存空間
3是把stage 2的代碼copy到內存中去
4初始話(huà)堆棧
5是跳轉到c的入口函數
stage 2(c語(yǔ)言)
1.初始化本階段的硬件設備(板載硬件設備)
2.將os kernel導入到內存中去
3.調用內核
stage 1是用匯編寫(xiě),主要是是為了配置能讓c語(yǔ)言運行環(huán)境。
這個(gè)是一個(gè)具體的flash的結構圖,bootloader 在執行第一個(gè)部分的時(shí)候,也就是stage1的時(shí)候,會(huì )把bootloader stage2這部分copy到ram中去運行,為什么呢,我覺(jué)得一個(gè)在內存中運行總是比在flash中執行要好,第二我覺(jué)得能執行code的flash必須是nor flash,這樣的flash相對成本也就高了。所以就會(huì )產(chǎn)生這個(gè)部分。當stage2的時(shí)候,會(huì )將kernel也copy到內存中,然后在結束的階段,讓執行地址跳轉到操作系統的入口地址,那樣的話(huà)操作系統也就自己?jiǎn)?dòng)來(lái)了。
如果分析過(guò)2440的官方代碼的話(huà),里面有一個(gè)start.s 這個(gè)匯編代碼,這可以看成一個(gè)小型的bootloader,因為他也完成了自啟動(dòng)的過(guò)程,不過(guò)他啟動(dòng)的是你的程序而不是操作系統,不過(guò)作用很相似。
在上面我們知道bootloader stage1這個(gè)階段的代碼是運行在flash中的,如果flash是nor flash的話(huà)也是可以的,不過(guò)如果你的開(kāi)發(fā)板是不帶nor flash的話(huà)則就不能了。nand flash是不能讓代碼運行在flash的,所以他的自啟動(dòng)過(guò)程是比較復雜的。他的cpu有一個(gè)4k ram 在加電的時(shí)候是被當作墊腳石使用的,當板子加電以后,硬件會(huì )自動(dòng)把flash最前面的code copy到這個(gè)內存中的,也就是bootloader stage1這個(gè)部分,在這4kB的空間中的代碼必須要完成講代碼copy的內存中去
對于bootloader的研究我覺(jué)得可以看一下start.s這個(gè)源代碼,你會(huì )知道的更加清楚,不過(guò)是匯編的,理解起來(lái)會(huì )有點(diǎn)困難,要耐心看的.....
還有關(guān)于bootloader的移植,為什么要進(jìn)行bootloader的移植呢,原因有2個(gè)
1是因為不同的板子之間的cpu體系結構不一樣...
2是因為不同的板子之間的外圍硬件設備不一樣...
評論