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