bootload分析

一、Bootloader基本概念
Bootloader是在操作系統運行之前執行的一段小程序。通過這段小程序,我們可以初始化硬件設備、建立內存空間的映射表,從而建立適當的系統軟硬件環境,爲最終調用操作系統內核做好準備。

對於嵌入式系統,Bootloader是基於特定硬件平臺來實現的。因此,幾乎不可能爲所有的嵌入式系統建立一個通用的Bootloader,不同的處理器架構都有不同的Bootloader。Bootloader不但依賴於CPU的體系結構,而且依賴於嵌入式系統板級設備的配置。對於2塊不同的嵌入式板而言,即使它們使用同一種處理器,要想讓運行在一塊板子上的Bootloader程序也能運行在另一塊板子上,一般也都需要修改Bootloader的源程序。

嵌入式系統中,Bootloader的意義與作用與PC上的BIOS有點類似,它對開發板上的主要部件如CPU、SDRAM、FLASH、串口等進行了初始化,可以使用Bootloader下載文件到開發板,可以瀏覽目錄,可以燒錄flash,可以啓動系統等,實際上,一個功能比較強大的Bootloader已經相當於一個微型的操作系統了。在嵌入式系統中,通常並沒有像BIOS那樣的固件程序(注,有的嵌入式CPU也會內嵌一段短小的啓動程序),因此整個系統的加載啓動任務就完全由BootLoader來完成。引導程序完成自己的任務後,也將控制權移交給操作系統。

二、Bootloader典型框架

由於Bootloader的實現依賴與CPU的體系結構,因此大多數Bootloader都分爲stage1和stage2兩個部分。

Bootloader的stage1通常包括以下步驟(按執行的先後順序):

1.硬件設備初始化。

屏蔽所有中斷、設置CPU的速度和時鐘頻率、RAM初始化、初始化LED、關閉CPU內部指令/數據cache。

2.爲加載Bootloader的stage2準備RAM空間。

3.拷貝Bootloader的stage2到RAM空間中。

4.設置好堆棧(設置堆棧指針sp)。

5.跳轉到stage2的C入口點。

Bootloader的stage2通常包括以下步驟(按執行的先後順序):

1.初始化本階段要使用的硬件設備。

2.檢測系統內存映像(memory map)。

包括內存映射的描述和內存映射的檢測。

3.將kernel映像和根文件系統映像從Flash上讀到RAM空間中。

包括規劃內存佔用的佈局(內核映像和根文件系統的內存範圍)和從Flash上拷貝。

4.爲內核設置啓動參數。

5.調用內核。

三、BootLoader的操作模式

大多數 Boot Loader 都包含兩種不同的操作模式:"啓動加載"模式和"下載"模式,這種區別僅對於開發人員纔有意義。但從最終用戶的角度看,Boot Loader 的作用就是用來加載操作系統,而並不存在所謂的啓動加載模式與下載工作模式的區別。

啓動加載(Boot loading)模式:這種模式也稱爲"自主"(Autonomous)模式。也即 Boot Loader 從目標機上的某個固態存儲設備上將操作系統加載到 RAM 中運行,整個過程並沒有用戶的介入。這種模式是 Boot Loader 的正常工作模式,因此在嵌入式產品發佈的時侯,Boot Loader 顯然必須工作在這種模式下。

下載(Downloading)模式:在這種模式下,目標機上的 Boot Loader 將通過串口連接或網絡連接等通信手段從主機(Host)下載文件,比如:下載內核映像和根文件系統映像等。從主機下載的文件通常首先被 Boot Loader 保存到目標機的 RAM 中,然後再被 Boot Loader 寫到目標機上的FLASH 類固態存儲設備中。Boot Loader 的這種模式通常在第一次安裝內核與根文件系統時被使用;此外,以後的系統更新也會使用 Boot Loader 的這種工作模式。工作於這種模式下的 Boot Loader 通常都會向它的終端用戶提供一個簡單的命令行接口。 像 Blob 或 U-Boot 等這樣功能強大的 Boot Loader 通常同時支持這兩種工作模式,而且允許用戶在這兩種工作模式之間進行切換。比如,Blob 在啓動時處於正常的啓動加載模式,但是它會延時 10 秒等待終端用戶按下任意鍵而將 blob 切換到下載模式。如果在 10 秒內沒有用戶按鍵,則 blob 繼續啓動 Linux 內核。

四、關於串行終端

在 boot loader 程序的設計與實現中,沒有什麼能夠比從串口終端正確地收到打印信息能更令人激動了。此外,向串口終端打印信息也是一個非常重要而又有效的調試手段。但是,我們經常會碰到串口終端顯示亂碼或根本沒有顯示的問題。造成這個問題主要有兩種原因:

(1) boot loader 對串口的初始化設置不正確。

(2) 運行在 host 端的終端仿真程序對串口的設置不正確,這包括:波特率、奇偶校驗、數據位和停止位等方面的設置。

此外,有時也會碰到這樣的問題,那就是:在 boot loader 的運行過程中我們可以正確地向串口終端輸出信息,但當 boot loader 啓動內核後卻無法看到內核的啓動輸出信息。對這一問題的原因可以從以下幾個方面來考慮:

(1) 首先請確認你的內核在編譯時配置了對串口終端的支持,並配置了正確的串口驅動程序。

(2) 你的 boot loader 對串口的初始化設置可能會和內核對串口的初始化設置不一致。此外,對於有些CPU,CPU 時鐘頻率的設置也會影響串口,因此如果 boot loader 和內核對其 CPU 時鐘頻率的設置不一致,也會使串口終端無法正確顯示信息。

(3) 最後,還要確認 boot loader 所用的內核基地址必須和內核映像在編譯時所用的運行基地址一致,尤其是對於 uClinux 而言。假設你的內核映像在編譯時用的基地址是 0xc0008000,但你的 boot loader 卻將它加載到 0xc0010000 處去執行,那麼內核映像當然不能正確地執行了


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/xgjianstart/archive/2009/10/05/4634760.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章