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