|
我對linux是一竅不通的,最近在搞開發(fā)板的時候也無從下手了,所以只能上網(wǎng)充充電,大部分都太泛泛了,現(xiàn)在我對linux的認(rèn)識上僅僅只停留在燒寫別人的代碼程序的,裸奔的話基本和ARM7無異多少,這是一項浩大的工程。也許得許多年,也許根本繼續(xù)不下去,不管了。
linux分為幾個部分: 1. bootloader 2.內(nèi)核 3,文件系統(tǒng)。4。應(yīng)用程序
bootloader ARM7也有的,我看來就是初始化和加載MAIN函數(shù)的入口,個人認(rèn)為屬于系統(tǒng)級別,一般都有廠家提供的文件支撐,很少用戶敢于,無論是怎么寫怎么搞最后都會加載 _main () ,然后開始執(zhí)行用戶代碼,其中還可能執(zhí)行某些系統(tǒng)的HOOK 用來初始化系統(tǒng)時鐘。我一般的用法是屏蔽系統(tǒng)HOOK,然后自己偷偷的換上哈哈,但是注意的是BOOT都不一樣,不同的硬件BOOT都不同,所以先下手boot至于內(nèi)核和文件系統(tǒng),引用程序,這些都留到后面搞,先從頭開始,頭就是bootloder :
第一:大概
首先嵌入式不是PC系統(tǒng),無BIOS引導(dǎo)。而僅僅是啟動代碼啟動內(nèi)核。也就是上電后首先調(diào)到啟動代碼執(zhí)行,而后者才會啟動內(nèi)核運行操作系統(tǒng),他負(fù)責(zé)初始化硬件設(shè)備,和資源分配地址映射。
第二:位置
他存在于flashz之上的,他是編譯系統(tǒng)編譯完畢存入存儲器然后板子加載之,但是我們看到開發(fā)板其實可以從NNAD 和NOR分別啟動,就是這個道理他的啟動加載地址可以從nand 或者NOR了 ,同理也應(yīng)證硬件的初始化代碼加載是兩個入口。選一的,
第三:交互
開發(fā)板和PC之間主要依賴于USART來通訊。所以我們看到開發(fā)板都是用串口打印的信息。
第四: 模式
開發(fā)板的 Boot Loader 將通過串口連接或網(wǎng)絡(luò)連接等通信手段從主機(jī)(Host)下載文件,比如:下載內(nèi)核映像和根文件系統(tǒng)映像等。從主機(jī)下載的文件通常首先被 Boot Loader 保存到目標(biāo)機(jī)的 RAM 中,然后再被 Boot Loader 寫到目標(biāo)機(jī)上的FLASH 類固態(tài)存儲設(shè)備中。Boot Loader 的這種模式通常在第一次安裝內(nèi)核與根文件系統(tǒng)時被使用;此外,以后的系統(tǒng)更新也會使用 Boot Loader 的這種工作模式。工作于這種模式下的 Boot Loader 通常都會向它的終端用戶提供一個簡單的命令行接口 。這也應(yīng)征了這個boot里面幾乎是用到了很多的硬件的驅(qū)動的,這部分驅(qū)動并不是內(nèi)核管理的,因為此時內(nèi)核還沒啟動呢,而是類似單片機(jī)驅(qū)動程序吧。所以這個也是需要單獨編譯的。比較復(fù)雜。好在有一些現(xiàn)成程序可用。
bootloder 分2段第一段ASM完成第二段 C語言完成。
第一階段:
- 硬件設(shè)備初始化。
- 為加載 Boot Loader 的 stage2 準(zhǔn)備 RAM 空間。
- 拷貝 Boot Loader 的 stage2 到 RAM 空間中。
- 設(shè)置好堆棧。
- 跳轉(zhuǎn)到 stage2 的 C 入口點。
- 第二階段:
- 初始化本階段要使用到的硬件設(shè)備。
- 檢測系統(tǒng)內(nèi)存映射(memory map)。
- 將 kernel 映像和根文件系統(tǒng)映像從 flash 上讀到 RAM 空間中。
- 為內(nèi)核設(shè)置啟動參數(shù)。
- 調(diào)用內(nèi)核。
-
-
- 每一個階段的代碼都是神一樣的驚人。但是總歸揭底,最后都是一樣的,永不反回,加載操作系統(tǒng)后。這個和RTOS是一樣的本質(zhì)應(yīng)該都差不多,只是手段狠了許多。
-
- 20140529
- 老王與日照
|
|