|
學(xué)習(xí)嵌入式的收獲_嵌入式Linux系統(tǒng)啟動過程詳解,
當前嵌入式的發(fā)展遠遠大于傳統(tǒng)的PC領(lǐng)域,那么嵌入式上的linux和PC上到底有什么區(qū)別呢?我們知道PC上基本是window一統(tǒng)天下,在PC上linux使用場景不是很多,除了研發(fā)領(lǐng)域.在個人電腦領(lǐng)域,window占據(jù)了絕大多數(shù)市場,但是在服務(wù)器領(lǐng)域,linux系統(tǒng)占據(jù)了大部分市場,可能很多電腦小白不知道.我們今天的內(nèi)容是嵌入式上linux的啟動流程,首先看一下嵌入式和PC的差異.
首先PC得益于強大的intel x64 x86處理器,即我們常見的i7 i5,運算和處理能力超級強,是任何嵌入式設(shè)備無法企及的.大名鼎鼎的驍龍835需要幾個CPU組合一起才能抵得上一個老舊的i3處理器,所以在PC上cpu RAM 和存儲設(shè)備都可以認為是異常強大的,對嵌入式設(shè)備來說就是”海量”. 我們來看一下嵌入式設(shè)備的配置,手機基本上上算是最強大的 嵌入式設(shè)備的,性能根本無非和PC媲美,但一般的嵌入式設(shè)備配置要和手機差得太遠,比如我們網(wǎng)上買的一個 家庭安防攝像頭,里面跑了一套linux系統(tǒng),他的 物理配置是什么? 400MHZ的CPU,100MBRAM,和64MB-flash!!!!沒錯,太低端了.所以 嵌入式上的軟件遠不能和PC軟件進行比較,嵌入式上linux和PC上的linux有什么區(qū)別??
首先兩套系統(tǒng)都是同一分源碼編譯而來的,所不同的是,嵌入式對源碼進行了大量的裁剪,即刪除了大量用不到和很少用的功能,同時對很多功能進行簡化,是linux系統(tǒng)能在很低的配置上運行起來,還必須節(jié)省資源以滿足其他軟件的運行.所以嵌入式軟件開發(fā)和PC身上最大的一個差異就是 節(jié)省 節(jié)省在節(jié)省.
我們看一下PCwindow的啟動流程:首先開機的時候,會出現(xiàn)黑屏白字的界面,這是我們熟知的bios,接下來會出現(xiàn)絢麗的window啟動界面,最后windos啟動成功,然后window系統(tǒng)會從C盤尋找需要開機啟動的應(yīng)用程序,執(zhí)行,啟動結(jié)束.我們總結(jié)一下,整個過程分為三分部,第一部分是bios 屬于bootloard的一種,第二部分是window,即操作系統(tǒng),第三部分屬于應(yīng)用啟動,而應(yīng)用存放在磁盤/文件系統(tǒng)中.即 bootloader->os->filesystem.
同樣在嵌入式上也遵守三大件套路,只是 嵌入式養(yǎng)不起bios這個龐然大物(100M),所以嵌入式選擇u-boot作為其bootloader, u-boot大小只有200KB左右,功能基本滿足使用,所以嵌入式上使用u-boot最多.第二階段是操作系統(tǒng),嵌入式上肯定是linux系統(tǒng)了.第三階段,即 linux啟動完成會讀取filesystem,執(zhí)行一些開機應(yīng)用,整個系統(tǒng)結(jié)束.
那么u-boot是如何跳轉(zhuǎn)到linux系統(tǒng)呢? 首先u-boot將linux os代碼拷貝到指定的RAM地址,然后執(zhí)行 MOV PC addr,即完成了CPU的指令切換,下一跳指令即開始運行l(wèi)inux的起始位置. Linux第一條指令必須是匯編代碼,因為C語言無法指令是編譯器進行分配,不能將特定的指令放在特定的位置(比如起始位置); 但是因為匯編的復(fù)雜和難懂,所以匯編代碼要盡可能的少,盡可能快的跳轉(zhuǎn)到C去執(zhí)行. 但是C需要堆棧環(huán)境,這一點匯編必須提前做好,然后就是C的天下了.
一個設(shè)備,硬件可以分為兩部分,第一部分是CPU,第二部分是外設(shè).那么應(yīng)該縣初始化哪一個呢?答案是CPU. 接下來要針對CPU進行初始化,不同的CPU初始化方式不一樣,要跳轉(zhuǎn)到不同的CPU代碼中去執(zhí)行. 初始化CPU之后就會進行一些核心的外設(shè)初始化,比如串口 ,但是不忙著顯示屏 網(wǎng)卡的初始化,因為不需要他們linux也能工作.接下來會進行進程的創(chuàng)建 中斷初始化 定時器初始化 等linux系統(tǒng)核心功能的初始化,這么都是軟件層面上的功能,這PC上linux是一致的.
最后linux會啟動第一個進程,init進程,他是一個用戶進程,init進程是所以進程的父類.init進程執(zhí)行什么動作呢?他會讀取/etc/init.d/rcS配置文件,該配置文件描述了有哪些開機需要指定的任務(wù)或者應(yīng)用. 要注意,嵌入式上的linux使用的文件系統(tǒng)和Ubuntu redhat是不一樣的,嵌入式上的filesystem是經(jīng)過極度精簡的,很多命令都是簡化版,使用方式不一定和PC上系統(tǒng),但是功能是滿足你的需要. |
|