嵌入式Linux系統的構成和啟動過程

2021-08-18 19:58:38 字數 2404 閱讀 6033

**:

在我們的周圍,大量的嵌入式裝置都是基於linux系統來構建的,嵌入式linux與主機linux相比有著自己的一些特點,本文就嵌入式linux系統的構成和啟動過程做一些總結。

一、嵌入式linux系統構成

上圖是乙個嵌入式linux系統的典型結構,劃分成了4個區:

1、bootloader區存放的是bootloader,它負責嵌入式系統最初的硬體初始化、驅動和核心載入。

2、引數區不是必須的,通常存放了一些系統引數,並且通常這個區是沒有檔案系統,引數以原始資料的格式來存放。

3、核心映象區存放的linux核心壓縮映象,它被解壓後執行於記憶體,作為嵌入式裝置的linux作業系統。

4、檔案系統區存放經過壓縮的檔案系統,它會被linux核心解壓並掛載,並作為各種應用程式、檔案的主要載體。

這4個區都以二進位制資料的形式存放於嵌入式裝置的flash晶元上。

二、嵌入式linux系統啟動過程

嵌入式裝置從上電那一刻到應用程式正常執行,其間經歷過一系列漫長的過程,下面對主要的步驟進行闡述:

1、嵌入式裝置上電後,cpu開始執行,通常cpu會從某乙個固定的實體地址開始執行,這個實體地址一般是flash晶元的起始實體地址。flash晶元的最初一段通常存放的是bootloader,於是cpu就會開始執行bootloader的**。

2、我們知道cpu可以讀寫flash上的資料,但是不能直接執行flash上的指令,cpu通常只能執行記憶體中的指令,那麼cpu剛開始執行時怎樣去執行flash上的指令呢?這裡分兩種情況,flash晶元主要分為兩種,一種是nor flash,另一種是nand flash,nor flash具有可以直接在flash晶元上執行指令的特點。如果嵌入式裝置採用的是nor flash,那就比較簡單了,cpu可以直接執行在nor flash上的指令。如果採用的是nand flash呢,怎麼辦?目前主要有兩種方法,一種方法是flash控制器能夠把nand flash的前4k資料搬到4k的內部ram中,並設定cpu從這個內部ram的起始位址開始啟動執行。另一種方法是flash控制器能夠把nand flash的前4k資料的位址對映到系統匯流排的某個位址上,並設定cpu從這個位址開始啟動執行。這兩種方法都是硬體來完成的。

3、bootloader分為兩個部分,第一部分是彙編**且不做壓縮,第二部分是c**且有壓縮的。bootloader開始執行時,第一部分彙編**先負責初始化cpu、pll、ddr、cache等硬體,讓cpu和記憶體能夠穩定執行,然後解壓第二部分的image,並拷貝到到記憶體執行。第二部分c**完成串列埠、flash、網口等驅動的載入,並構建乙個shell環境來接受使用者輸入。注意,在整個bootloader執行其間cpu的mmu是沒有被初始化的,所有的位址訪問都是採用實體地址直接訪問的。

4、在完成bootloader初始化後,根據**中設定的核心區實體地址,bootloader會把核心區壓縮後的linux映象拷貝到記憶體中並解壓。同時準備好核心的啟動引數,如:console=ttys0,115200 root=31:2 mtdparts=ar7100-nor0:196608(boot),835236(kernel),-(rootfs),這裡主要是把bootloader裡設定的mtd分割槽資訊傳遞給核心,還有需要載入的根檔案系統。最後跳轉到核心入口開始執行。

5、linux核心**開始執行,會先進行核心各個子系統初始化,並完成對mmu的初始化。mmu是cpu中的乙個單元,它跟作業系統一起配合完成從虛擬位址到實體地址的轉換。如果cpu帶有mmu單元,則cpu執行單元發出的記憶體位址將被mmu截獲,從cpu到mmu的位址稱為虛擬位址,而mmu將這個位址翻譯成另乙個位址發到cpu晶元的外部位址引腳上,這個位址稱為實體地址。在這個過程中linux核心會維護頁表結構,它儲存著核心和程序的虛擬位址到實體地址的對映,而mmu則通過linux核心頁表去完成位址翻譯和保護工作。

6、接下來linux核心會掛載根檔案系統,要掛載的根檔案系統是通過核心啟動引數來獲取的。這裡有乙個問題,根檔案系統通常表示為乙個linux檔案系統下的某個mtd裝置,但在載入根檔案系統前linux還沒有乙個檔案系統,那它怎樣通過訪問檔案系統中的mtd裝置來載入根檔案系統呢?事實上,根檔案系統的安裝分為兩個階段,首先linux核心會安裝乙個特殊的rootfs檔案系統,該檔案系統僅提供乙個作為初始安裝點的空目錄,然後linux核心再在空目錄上安裝乙個真正的根目錄。linux核心對flash的訪問都是通過mtd子系統來進行的,它抽象了對於各種flash裝置的訪問,提供統一的介面。

7、linux核心繼續初始化各種型別的驅動程式,完成之後會啟動第乙個應用程式,它的程序id為1。這個應用程式可以由核心啟動引數傳入,如果沒有則會預設執行/sbin/init。init程序會讀取配置檔案/etc/inittab,根據配置檔案的內容它會完成兩個工作,執行rcs和啟動shell。至此,linux系統已經啟動完成,給使用者提供了乙個shell的互動環境,後續的行為就取決於使用者的輸入或者系統特定應用的載入。

嵌入式Linux系統的構成

乙個典型的嵌入式linux系統按照儲存空間的劃分通常包括引導區,核心區與檔案系統區,引導區存放boot loader與系統引數,核心區存放特定嵌入式平台的定製linux核心 檔案系統包括根檔案系統和建立與flash記憶體裝置之上的檔案系統。圖形介面系統和使用者應用程式就放在檔案系統區中 1 boot...

32位嵌入式系統和嵌入式Linux

32位嵌入式系統和嵌入式linux 嵌入式linux是一種開發原始碼 軟實時 多工的嵌入式作業系統,是標準linux的嵌入式系統移植版。眾所周知,linux能在pc中可靠地執行,正是因為當前的pc硬體已經全部採用了32位乃至64位系統,才會給象windows linux unix這些32位作業系統提...

嵌入式Linux系統漫談

嵌入式linux系統漫談 事物總有個核心,複雜的事物總可以模組化 層次化,嵌入式 linux 也如此。學習嵌入式 linux 困難,主要因為涉及知識和概念過多,即比較複雜,所以學習嵌入式 linux 的就需要找到核心,需要模組化,需要進行層次劃分。嵌入式linux 系統做模組化處理可劃分為 boot...