 嵌(qian)入式linux啟動(dong)過(guo)程分析
							時間:2018-01-26      來(lai)源(yuan):未知
							嵌(qian)入式linux啟動(dong)過(guo)程分析
							時間:2018-01-26      來(lai)源(yuan):未知 
							當前嵌入式的發展遠遠大于傳統的PC領域(yu),那么(me)嵌入式上(shang)(shang)(shang)的linux和(he)PC上(shang)(shang)(shang)到底有什么(me)區別呢?我們知(zhi)道PC上(shang)(shang)(shang)基本(ben)是(shi)window一統天下,在PC上(shang)(shang)(shang)linux使用場(chang)景不是(shi)很多,除了研發領域(yu).在個(ge)人(ren)電(dian)腦領域(yu),window占據了絕(jue)大多數(shu)市場(chang),但是(shi)在服務器領域(yu),linux系統占據了大部分(fen)市場(chang),可能很多電(dian)腦小白不知(zhi)道.我們今天的內容是(shi)嵌入式上(shang)(shang)(shang)linux的啟(qi)動流程,首先看一下嵌入式和(he)PC的差異.
首先PC得益(yi)于(yu)強大(da)(da)的(de)(de)intel x64 x86處(chu)理器,即我們常(chang)見的(de)(de)i7 i5,運(yun)算(suan)和(he)處(chu)理能(neng)(neng)力超級強,是(shi)(shi)任(ren)何嵌(qian)(qian)入(ru)(ru)式設(she)(she)(she)備(bei)(bei)無法企(qi)及的(de)(de).大(da)(da)名鼎(ding)鼎(ding)的(de)(de)驍龍835需要幾個(ge)CPU組合一(yi)(yi)起(qi)才(cai)能(neng)(neng)抵(di)得上(shang)(shang)一(yi)(yi)個(ge)老舊的(de)(de)i3處(chu)理器,所以(yi)在PC上(shang)(shang)cpu RAM 和(he)存儲設(she)(she)(she)備(bei)(bei)都可以(yi)認為是(shi)(shi)異常(chang)強大(da)(da)的(de)(de),對嵌(qian)(qian)入(ru)(ru)式設(she)(she)(she)備(bei)(bei)來說就(jiu)是(shi)(shi)”海量”. 我們來看一(yi)(yi)下嵌(qian)(qian)入(ru)(ru)式設(she)(she)(she)備(bei)(bei)的(de)(de)配(pei)置(zhi)(zhi),手(shou)機基本上(shang)(shang)上(shang)(shang)算(suan)是(shi)(shi)強大(da)(da)的(de)(de) 嵌(qian)(qian)入(ru)(ru)式設(she)(she)(she)備(bei)(bei)的(de)(de),性能(neng)(neng)根本無非和(he)PC媲美(mei),但一(yi)(yi)般的(de)(de)嵌(qian)(qian)入(ru)(ru)式設(she)(she)(she)備(bei)(bei)配(pei)置(zhi)(zhi)要和(he)手(shou)機差得太遠(yuan),比如我們網上(shang)(shang)買的(de)(de)一(yi)(yi)個(ge) 家(jia)庭安防攝(she)像頭,里(li)面跑了(le)一(yi)(yi)套linux系統(tong),他(ta)的(de)(de) 物理配(pei)置(zhi)(zhi)是(shi)(shi)什么? 400MHZ的(de)(de)CPU,100MBRAM,和(he)64MB-flash!!!!沒(mei)錯,太低端(duan)了(le).所以(yi) 嵌(qian)(qian)入(ru)(ru)式上(shang)(shang)的(de)(de)軟件(jian)遠(yuan)不能(neng)(neng)和(he)PC軟件(jian)進(jin)行比較,嵌(qian)(qian)入(ru)(ru)式上(shang)(shang)linux和(he)PC上(shang)(shang)的(de)(de)linux有什么區別??
首先兩(liang)套(tao)系(xi)統(tong)都是(shi)同(tong)一分(fen)源碼編(bian)譯而(er)來的,所不同(tong)的是(shi),嵌入式對源碼進行(xing)了大(da)(da)量的裁剪,即刪除了大(da)(da)量用(yong)不到和很(hen)少用(yong)的功能(neng),同(tong)時對很(hen)多功能(neng)進行(xing)簡化,是(shi)linux系(xi)統(tong)能(neng)在很(hen)低的配置上運行(xing)起(qi)來,還(huan)必須節(jie)(jie)(jie)省資源以滿(man)足其他軟件的運行(xing).所以嵌入式軟件開發和PC身上大(da)(da)的一個差異(yi)就是(shi) 節(jie)(jie)(jie)省 節(jie)(jie)(jie)省在節(jie)(jie)(jie)省.
我們(men)看一(yi)(yi)(yi)下PCwindow的(de)啟(qi)(qi)動流程(cheng)(cheng):首先開機的(de)時候,會出(chu)現黑屏白字的(de)界面,這(zhe)是我們(men)熟知(zhi)的(de)bios,接下來(lai)會出(chu)現絢麗(li)的(de)window啟(qi)(qi)動界面,后windos啟(qi)(qi)動成功(gong),然后window系統會從C盤尋(xun)找需要開機啟(qi)(qi)動的(de)應(ying)用(yong)(yong)程(cheng)(cheng)序(xu),執行,啟(qi)(qi)動結束.我們(men)總結一(yi)(yi)(yi)下,整(zheng)個(ge)過程(cheng)(cheng)分(fen)為(wei)三(san)分(fen)部(bu)(bu)(bu),第一(yi)(yi)(yi)部(bu)(bu)(bu)分(fen)是bios 屬(shu)于(yu)bootloard的(de)一(yi)(yi)(yi)種,第二部(bu)(bu)(bu)分(fen)是window,即(ji)操作系統,第三(san)部(bu)(bu)(bu)分(fen)屬(shu)于(yu)應(ying)用(yong)(yong)啟(qi)(qi)動,而應(ying)用(yong)(yong)存放在(zai)磁盤/文件(jian)系統中.即(ji) bootloader->os->filesystem.
同(tong)樣在嵌(qian)(qian)入(ru)式(shi)(shi)上也遵守三(san)大(da)(da)件套(tao)路(lu),只是(shi) 嵌(qian)(qian)入(ru)式(shi)(shi)養不(bu)起bios這個龐然大(da)(da)物(100M),所(suo)以(yi)嵌(qian)(qian)入(ru)式(shi)(shi)選擇(ze)u-boot作(zuo)為其(qi)bootloader, u-boot大(da)(da)小只有200KB左右,功能基本(ben)滿(man)足使用,所(suo)以(yi)嵌(qian)(qian)入(ru)式(shi)(shi)上使用u-boot多(duo).第二階段(duan)是(shi)操作(zuo)系(xi)統,嵌(qian)(qian)入(ru)式(shi)(shi)上肯定(ding)是(shi)linux系(xi)統了.第三(san)階段(duan),即 linux啟(qi)動完(wan)成(cheng)會讀取filesystem,執行一(yi)些開(kai)機應(ying)用,整個系(xi)統結束.
那么u-boot是(shi)如(ru)(ru)何跳(tiao)轉到(dao)linux系(xi)統呢? 首先(xian)u-boot將linux os代(dai)碼拷貝(bei)到(dao)指(zhi)定的(de)(de)RAM地址,然(ran)后執(zhi)行(xing) MOV PC addr,即完成了CPU的(de)(de)指(zhi)令(ling)切換,下一跳(tiao)指(zhi)令(ling)即開始(shi)運行(xing)linux的(de)(de)起始(shi)位置. Linux第(di)一條(tiao)指(zhi)令(ling)必須(xu)是(shi)匯(hui)(hui)(hui)編(bian)代(dai)碼,因為(wei)C語言(yan)無法指(zhi)令(ling)是(shi)編(bian)譯器進行(xing)分配,不能(neng)將特(te)定的(de)(de)指(zhi)令(ling)放(fang)在特(te)定的(de)(de)位置(比如(ru)(ru)起始(shi)位置); 但(dan)是(shi)因為(wei)匯(hui)(hui)(hui)編(bian)的(de)(de)復雜和(he)難懂,所以匯(hui)(hui)(hui)編(bian)代(dai)碼要盡可能(neng)的(de)(de)少,盡可能(neng)快的(de)(de)跳(tiao)轉到(dao)C去執(zhi)行(xing). 但(dan)是(shi)C需要堆棧(zhan)環境,這一點(dian)匯(hui)(hui)(hui)編(bian)必須(xu)提前做(zuo)好,然(ran)后就是(shi)C的(de)(de)天下了.
一個(ge)設備(bei),硬件可以分為(wei)兩部(bu)分,第(di)一部(bu)分是(shi)(shi)(shi)CPU,第(di)二部(bu)分是(shi)(shi)(shi)外設.那(nei)么應該縣初(chu)(chu)(chu)始(shi)化(hua)(hua)(hua)(hua)(hua)哪一個(ge)呢?答案是(shi)(shi)(shi)CPU. 接下(xia)來(lai)要(yao)針對(dui)CPU進(jin)(jin)行(xing)初(chu)(chu)(chu)始(shi)化(hua)(hua)(hua)(hua)(hua),不同的(de)CPU初(chu)(chu)(chu)始(shi)化(hua)(hua)(hua)(hua)(hua)方式(shi)不一樣,要(yao)跳轉到不同的(de)CPU代(dai)碼(ma)中(zhong)去執行(xing). 初(chu)(chu)(chu)始(shi)化(hua)(hua)(hua)(hua)(hua)CPU之后(hou)就會進(jin)(jin)行(xing)一些核心(xin)(xin)的(de)外設初(chu)(chu)(chu)始(shi)化(hua)(hua)(hua)(hua)(hua),比如(ru)串口 ,但(dan)是(shi)(shi)(shi)不忙著顯示屏 網卡的(de)初(chu)(chu)(chu)始(shi)化(hua)(hua)(hua)(hua)(hua),因為(wei)不需(xu)要(yao)他們(men)linux也能工作.接下(xia)來(lai)會進(jin)(jin)行(xing)進(jin)(jin)程的(de)創建 中(zhong)斷初(chu)(chu)(chu)始(shi)化(hua)(hua)(hua)(hua)(hua) 定時器初(chu)(chu)(chu)始(shi)化(hua)(hua)(hua)(hua)(hua) 等linux系統核心(xin)(xin)功能的(de)初(chu)(chu)(chu)始(shi)化(hua)(hua)(hua)(hua)(hua),這(zhe)么都是(shi)(shi)(shi)軟件層面(mian)上的(de)功能,這(zhe)PC上linux是(shi)(shi)(shi)一致的(de).
后(hou)linux會啟動第一個進(jin)程(cheng)(cheng)(cheng),init進(jin)程(cheng)(cheng)(cheng),他是(shi)(shi)一個用戶(hu)進(jin)程(cheng)(cheng)(cheng),init進(jin)程(cheng)(cheng)(cheng)是(shi)(shi)所以進(jin)程(cheng)(cheng)(cheng)的(de)(de)父類(lei).init進(jin)程(cheng)(cheng)(cheng)執行什么動作呢?他會讀取(qu)/etc/init.d/rcS配置文件(jian)(jian),該(gai)配置文件(jian)(jian)描述了有(you)哪些開機需要(yao)指定的(de)(de)任務或(huo)者應用. 要(yao)注意,嵌(qian)(qian)入式(shi)上的(de)(de)linux使用的(de)(de)文件(jian)(jian)系統(tong)和(he)Ubuntu redhat是(shi)(shi)不一樣(yang)的(de)(de),嵌(qian)(qian)入式(shi)上的(de)(de)filesystem是(shi)(shi)經過極(ji)度精簡的(de)(de),很多命令(ling)都是(shi)(shi)簡化(hua)版(ban),使用方(fang)式(shi)不一定和(he)PC上系統(tong),但是(shi)(shi)功能是(shi)(shi)滿足你的(de)(de)需要(yao).