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