操作系統(tǒng)是一種在計(jì)算機(jī)上運(yùn)行的軟件,它的主要任務(wù)是管理計(jì)算機(jī)上的系統(tǒng)資源,為用戶提供使用計(jì)算機(jī)及其外部設(shè)備的接口。它存在的目的是為了管理所有硬件資源,并且提供應(yīng)用軟件一個(gè)合適的操作環(huán)境。嵌入式系統(tǒng)由于硬件的先天限制,經(jīng)常只具有極稀少的硬件資源,如 時(shí)脈較少的 CPU、較少的內(nèi)存、常不具有磁盤(pán)而用小容量的DiskOnChip或DiskOnModule。而在使用電池的系統(tǒng)中,它還要實(shí)現(xiàn)節(jié)省電池消耗,延長(zhǎng)電池使用時(shí)間的功能。
Linux 作為嵌入式操作系統(tǒng)是完全可行的,因?yàn)長(zhǎng)inux提供了完成嵌入功能的基本的內(nèi)核和你所需要的所有用戶界面,它是多面的。它能處理嵌入式任務(wù)和用戶界面。將Linux看作是連續(xù)的統(tǒng)一體,從一個(gè)具有內(nèi)存管理、任務(wù)切換和時(shí)間服務(wù)及其他的分拆的微內(nèi)核到完整的服務(wù)器,支持所有的文件系統(tǒng)和網(wǎng)絡(luò)服務(wù)。Linux作為嵌入式系統(tǒng)是一個(gè)帶有很多優(yōu)勢(shì)的新成員,它對(duì)許多CPU和硬件平臺(tái)都是易移植的、穩(wěn)定、功能強(qiáng)大、易于開(kāi)發(fā)。
API
X-server Java virtual machine
Device driver
Linux Kernel
Boot load
嵌入式Linux系統(tǒng)需要下面三個(gè)基本元素:
1. 引導(dǎo)工具
2. Linux微內(nèi)核:內(nèi)存管理、 程序管理
3. 初始化進(jìn)程
如果要它成為完整的操作系統(tǒng)且繼續(xù)保持小型化,還得加上:
1.硬件驅(qū)動(dòng)程序
2.硬件接口程序
3.應(yīng)用程序組
談到操作系統(tǒng)就一定要說(shuō)一說(shuō)它的開(kāi)發(fā)環(huán)境,Linux是基于GNU的C編譯器,作為GNU工具鏈的一部分,與gdb源調(diào)試器一起工作。它提供了開(kāi)發(fā)嵌入式Linux系統(tǒng)的所有軟件工具。以下是一個(gè)典型的開(kāi)發(fā)工具的使用流程:
1.寫(xiě)入或植入引導(dǎo)碼
2.向串口打印字符串的編碼
3.將gdb目標(biāo)碼移植工作串口,這可與另一臺(tái)運(yùn)行g(shù)db程序的Linux 主機(jī)系統(tǒng)對(duì)話
4.利用gdb讓硬件和軟件初始化碼在Linux內(nèi)核啟動(dòng)時(shí)工作
5.Linux內(nèi)核啟動(dòng),串口成為L(zhǎng)inux控制口并可用于后續(xù)開(kāi)發(fā)
6.如果在你的目標(biāo)硬件上運(yùn)行了完整的Linux內(nèi)核,你可以調(diào)試你的應(yīng)用進(jìn)程
二、硬件平臺(tái)
研發(fā)人員在選擇最好的硬件時(shí),往往由于缺乏完整或精確的信息而使選擇硬件成為復(fù)雜且困難的工作。硬件成本經(jīng)常是關(guān)鍵的議題,當(dāng)考慮成本時(shí)、需要確信你在考慮產(chǎn)品的整個(gè)成本而不僅是CPU的成本;因?yàn)楹玫腃PU一旦加上總線邏輯和延時(shí)電路使之與外設(shè)一起工作,硬件系統(tǒng)可能變成非常昂貴的產(chǎn)品。如果你正在尋找嵌入式軟件系統(tǒng),那么應(yīng)首先確定了硬件平臺(tái)即確定了微處理器CPU的型號(hào)。
現(xiàn)在比較流行的硬件平臺(tái)有Intel公司的Strong Arm 系列,Motorola公司的DragonBall系列,NEC公司的VR系列,Hitachi公司SH3,SH4系列等等,都可選為硬件平臺(tái)。但最好在選定前先要確定所做系統(tǒng)的應(yīng)用功能和所需的速度,并且制定好外接設(shè)備和接口標(biāo)準(zhǔn)。這樣可準(zhǔn)確的定位所需要的硬件方案,得到性價(jià)比最高的系統(tǒng)。 下圖是以Intel公司的StrongArm為例來(lái)說(shuō)明硬件平臺(tái):
三、Linux嵌入式系統(tǒng)與硬件的關(guān)系
對(duì)初學(xué)者而言,可以將內(nèi)核與任務(wù)分開(kāi),標(biāo)準(zhǔn)的Linux內(nèi)核通常駐留在內(nèi)存中,每一個(gè)應(yīng)用程序都是從磁盤(pán)運(yùn)到內(nèi)存上執(zhí)行。當(dāng)程序結(jié)束后,它所占用的內(nèi)存就被釋放,程序就被下載了。在一個(gè)嵌入式系統(tǒng)里,可能沒(méi)有磁盤(pán)。有兩種途徑可以消除對(duì)磁盤(pán)的依賴(lài),這要看系統(tǒng)的復(fù)雜性和硬件的設(shè)計(jì)。在一個(gè)簡(jiǎn)單的系統(tǒng)里,當(dāng)系統(tǒng)啟動(dòng)后,內(nèi)核和所有的應(yīng)用程序都在內(nèi)存里。這就是大多數(shù)傳統(tǒng)的嵌入式系統(tǒng)工作模式,它同樣可以被Linux支持。有了Linux,就有了第二種可能性。因?yàn)長(zhǎng)inux已經(jīng)有能力“加載”和“卸載”程序,一個(gè)嵌入式系統(tǒng)就可以利用它來(lái)節(jié)省內(nèi)存。試想一個(gè)典型的包括一個(gè)大概8MB到16MB的Flash Memory和8MB內(nèi)存的系統(tǒng)。Flash Memory可以作為一個(gè)文件系統(tǒng)。Flash Memory驅(qū)動(dòng)程序用來(lái)連接Flash Memory和文件系統(tǒng)。作為替代也可使用Flash Disk,用工具軟件可把Flash Memory仿真為磁盤(pán)或部分。其中一個(gè)例子是Intel 公司可提供Flash Memory 管理軟件IPSM -Intel Persistent Storage Manager, 詳情
所有的程序都以文件形式存儲(chǔ)在Flash文件中,需要時(shí)可以裝入內(nèi)存。這種動(dòng)態(tài)的、“根據(jù)需要加載”的能力是支持其它一系列功能的重要特征:
1. 它使初始化代碼在系統(tǒng)引導(dǎo)后被釋放。Linux同樣有很多內(nèi)核外運(yùn)行的公用程序。這些通常程序在初始化時(shí)運(yùn)行一次,以后就不再運(yùn)行。而且,這些公用程序可以用它們相互共有的方式,一個(gè)接一個(gè)按順序運(yùn)行。這樣,相同內(nèi)存空間可以被反復(fù)使用以“調(diào)入”每一個(gè)程序,就象系統(tǒng)引導(dǎo)一樣。這的確可以節(jié)省內(nèi)存,特別是那些配置一次以后就不再更改的網(wǎng)絡(luò)堆棧。如果Linux可加載模塊的功能包括在內(nèi)核里,驅(qū)動(dòng)程序和應(yīng)用程序就都可以被加載。它可以檢查硬件環(huán)境并且為硬件裝上相應(yīng)的軟件。這就消除了用一個(gè)程序占用許多Flash Memory來(lái)處理多種硬件的復(fù)雜性。
2. 軟件的升級(jí)更模塊化。你可以在系統(tǒng)運(yùn)行的時(shí)候在Flash上升級(jí)應(yīng)用程序和可加載驅(qū)動(dòng)程序。
3. 配置信息和運(yùn)行時(shí)間參數(shù)可以作為數(shù)據(jù)文件儲(chǔ)存在Flash上。
虛擬內(nèi)存
標(biāo)準(zhǔn)Linux的另一個(gè)特征是虛擬內(nèi)存的能力。正是這種神奇的特征使應(yīng)用程序員可以狂熱的編寫(xiě)代碼而不計(jì)后果,不管程序有多大。在嵌入式系統(tǒng)里不需要這種強(qiáng)大的功能。實(shí)際上,因?yàn)樗鼤?huì)帶來(lái)無(wú)法控制的時(shí)間因素,你可能不希望它在實(shí)時(shí)的系統(tǒng)里。這個(gè)軟件必須設(shè)計(jì)得更加精悍,以適合硬件平臺(tái)上的物理內(nèi)存,就象其它嵌入式系統(tǒng)一樣。注意由于CPU的原因,通常在Linux中保存虛擬內(nèi)存代碼是明智的,因?yàn)閷⑺宄苜M(fèi)事;而且還有另外一個(gè)原因--它支持共享文本,這樣就可以使許多程序共享一個(gè)軟件。
虛擬內(nèi)存的調(diào)入功能可以被關(guān)掉,只要將交換空間的大小設(shè)置為零。如果你寫(xiě)的程序比實(shí)際的內(nèi)存大,系統(tǒng)就會(huì)當(dāng)作你的運(yùn)行用盡了交換空間來(lái)處理;這個(gè)程序?qū)⒉粫?huì)運(yùn)行,或者malloc將會(huì)失靈。在許多CPU上,虛擬內(nèi)存提供的內(nèi)存管理可以將不同程序分開(kāi),防止它們寫(xiě)到其它地址的空間上。這在嵌入式系統(tǒng)上通常不可能,因?yàn)樗恢С忠粋€(gè)簡(jiǎn)單、扁平的地址空間。Linux的這種功能有助于其發(fā)展。它減少了胡亂的編寫(xiě)程序造成系統(tǒng)崩潰的可能性。許多嵌入式系統(tǒng)基于效率方面的原因有意識(shí)使用程序間可以共享的“全局”數(shù)據(jù)。這也可以通過(guò)Linux共享內(nèi)存功能來(lái)支持,共享的只是指定的內(nèi)存部分。
文件系統(tǒng)
許多嵌入式系統(tǒng)沒(méi)有磁盤(pán)或者文件系統(tǒng)。Linux不需要它們也能運(yùn)行。實(shí)際上,許多商業(yè)性嵌入式系統(tǒng)提供文件系統(tǒng)作為選項(xiàng)。Linux提供 MS-DOS-Compatible文件系統(tǒng),同時(shí)還有其它多種選擇。之所以提供其它選擇是因?yàn)樗鼈兏訌?qiáng)大而且具有容錯(cuò)功能。Linux還具有檢查和維護(hù)的功能,商業(yè)性供應(yīng)商往往不提供這些。這對(duì)于Flash系統(tǒng)來(lái)說(shuō)尤其重要,因?yàn)樗峭ㄟ^(guò)網(wǎng)絡(luò)更新的。如果系統(tǒng)在升級(jí)過(guò)程中失去了能力,那它就沒(méi)有用了。維護(hù)的功能通常可以解決這類(lèi)問(wèn)題。
文件系統(tǒng)可以被放在傳統(tǒng)的磁盤(pán)驅(qū)動(dòng)器、Flash Memory或其它這類(lèi)的介質(zhì)上。而且,用于暫時(shí)保存文件,一個(gè)小RAM盤(pán)就足夠了。Flash Memories被分割成塊。這些塊中也許包括一個(gè)含有當(dāng)CPU啟動(dòng)時(shí)運(yùn)行的最初的軟件的引導(dǎo)塊。這可能包括Linux 引導(dǎo)代碼。剩余的Flash可以用作文件系統(tǒng)。Linux的內(nèi)核可以通過(guò)引導(dǎo)代碼從Flash復(fù)制到RAM,或者還有一個(gè)選擇,內(nèi)核可以被存儲(chǔ)在Flash的一個(gè)獨(dú)立部分,并且直接從那里執(zhí)行。另外對(duì)于一些系統(tǒng)來(lái)說(shuō)還有一個(gè)有趣的選擇,那就是將一個(gè)便宜的CD-ROM包含在內(nèi)。這比Flash Memory 便宜,而且通過(guò)交換CD-ROM支持簡(jiǎn)單的升級(jí)。有了這個(gè),Linux 只要從 CD-ROM上引導(dǎo),類(lèi)似從硬盤(pán)上一樣從CD-ROM上獲得所有的程序。
最后,對(duì)于聯(lián)網(wǎng)的嵌入式系統(tǒng)來(lái)說(shuō),Linux 支持NFS(Network File system)。這為實(shí)現(xiàn)聯(lián)網(wǎng)系統(tǒng)的許多增值功能打開(kāi)了大門(mén)。第一,它允許通過(guò)網(wǎng)絡(luò)上加載應(yīng)用程序。這是控制軟件修改的基礎(chǔ),因?yàn)槊恳粋€(gè)嵌入式系統(tǒng)的軟件都可以在一個(gè)普通的服務(wù)器上加載。它在運(yùn)行的時(shí)候也可以用來(lái)輸入或輸出大量的數(shù)據(jù)、配置和狀態(tài)信息。這對(duì)用戶監(jiān)督和控制來(lái)說(shuō)是一個(gè)非常強(qiáng)大的功能。舉例來(lái)說(shuō),嵌入式系統(tǒng)可以建立一個(gè)小的RAM磁盤(pán),包含的文件中有與當(dāng)前狀態(tài)信息同步的內(nèi)容。其它系統(tǒng)可以簡(jiǎn)單的把這個(gè)RAM磁盤(pán)設(shè)置為基于網(wǎng)絡(luò)的遠(yuǎn)程磁盤(pán),并且空中存取狀態(tài)文件。這就允許另一個(gè)機(jī)器上的Web服務(wù)器通過(guò)簡(jiǎn)單的CGI Script存取狀態(tài)信息。在其它電腦上運(yùn)行的其它應(yīng)用程序包可以很容易的存取數(shù)據(jù)。
引導(dǎo)--LILO和BIOS在哪里
當(dāng)一個(gè)微處理器第一次啟動(dòng)的時(shí)候,它開(kāi)始在預(yù)先設(shè)置的地址上執(zhí)行指令。通常在那里有一些只讀內(nèi)存,包括初始化或引導(dǎo)代碼。類(lèi)似于在PC上的BIOS。它執(zhí)行了一些低水平的CPU初始化和其它硬件的配置文件。BIOS繼續(xù)辨認(rèn)哪個(gè)磁盤(pán)里有操作系統(tǒng),把操作系統(tǒng)復(fù)制到RAM并且轉(zhuǎn)向它。實(shí)際上,這非常復(fù)雜,但對(duì)我們的目標(biāo)來(lái)說(shuō)也非常重要。在PC上運(yùn)行的Linux依靠PC的BIOS來(lái)提供這些配置和OS加載功能。
在一個(gè)嵌入式系統(tǒng)里經(jīng)常沒(méi)有這種BIOS。這樣你就要提供同等的啟動(dòng)代碼。幸運(yùn)的是,嵌入式系統(tǒng)并不需要象PC機(jī)上的 BIOS引導(dǎo)程序那樣的靈活性,因?yàn)樗ǔV恍枰幚硪粋€(gè)硬件的配置。這個(gè)代碼更簡(jiǎn)單也更枯燥。它只是個(gè)指令清單,將固定的數(shù)字塞到硬件寄存器中去。然而,這是關(guān)鍵的代碼,因?yàn)檫@些數(shù)值要與你的硬件相符而且要按照特定的順序進(jìn)行。所以在大多數(shù)情況下,一個(gè)最小的通電自檢模塊,可以檢查內(nèi)存的正常運(yùn)行、讓LED閃爍,并且驅(qū)動(dòng)其它必須的硬件以使主Linux OS啟動(dòng)和運(yùn)行。這些啟動(dòng)代碼完全根據(jù)硬件決定,不可隨意移動(dòng)。幸運(yùn)的是,許多系統(tǒng)都有為核心微處理器和內(nèi)存所定制的菜單式硬件設(shè)計(jì)。典型的是,芯片制造商有一個(gè)樣本主板,可以用來(lái)作為設(shè)計(jì)的參考--或多或少與新設(shè)計(jì)相同。通常這些菜單式設(shè)計(jì)的啟動(dòng)代碼是可以獲得的,它可以根據(jù)你的需要輕易的修改。在少數(shù)情況下,啟動(dòng)代碼需要重新編寫(xiě)。為了測(cè)試這些代碼,你可以使用一個(gè)包含模擬內(nèi)存的電路內(nèi)置模擬器,它可以代替目標(biāo)內(nèi)存。你把代碼裝到模擬器上并通過(guò)模擬器調(diào)試。如果這樣不行,你可以跳過(guò)這一步,但這樣就要一個(gè)更長(zhǎng)的調(diào)試周期。這個(gè)代碼最終要在較為穩(wěn)定的內(nèi)存上運(yùn)行,通常是Flash或EPROM芯片。你需要使用一些方法將代碼放在芯片上。怎么做,要根據(jù)“目標(biāo)”硬件和工具來(lái)定。
一種流行的方法是把Flash或EPROM芯片插入EPROM或Flash燒制器。這將把你的程序“燒”(存)入芯片。然后,把芯片插入你的目標(biāo)板的插座,打開(kāi)電源。這個(gè)方法需要板上配有插座,但有些設(shè)備是不能配插座的。
另一個(gè)方法是通過(guò)一個(gè)JTAG界面。一些芯片有JTAG界面可以用來(lái)對(duì)芯片進(jìn)行編程。這是最方便的方法。芯片可以永遠(yuǎn)被焊在主板上,一個(gè)小電纜從板上的JTAG連接器,通常是一個(gè)PC卡,聯(lián)到JTAG界面。下面是PC運(yùn)行JTAG界面所需的一些慣用程序。這個(gè)設(shè)備還可以用來(lái)小量生產(chǎn)。
穩(wěn)定性
對(duì)大多數(shù)微處理器來(lái)說(shuō),Linux非常好。移植到新微處理器家族的Linux內(nèi)核運(yùn)行起來(lái)與原來(lái)的微處理器一樣穩(wěn)定。它經(jīng)常被移植到一個(gè)或多個(gè)特定的主板上。這些板包括特定的外圍設(shè)備和CPU。幸運(yùn)的是,許多代碼是與處理器的特性不相關(guān)的,所以移植集中在處理器的差異上,其中大多數(shù)是在內(nèi)存管理和中斷控制領(lǐng)域。一旦成功移植,它們就非常穩(wěn)定。
引導(dǎo)策略廣泛依賴(lài)于硬件要求,而且你必須有計(jì)劃地做一些定制的工作。設(shè)備驅(qū)動(dòng)程序更加混亂:有些穩(wěn)定有些不穩(wěn)定。而且選擇很有限;一旦你離開(kāi)了通用的PC平臺(tái),你需要自己編寫(xiě)。幸運(yùn)的是,周?chē)性S多驅(qū)動(dòng)程序,你可能可以找到一個(gè)與你的需求相近的修改一下。這種驅(qū)動(dòng)程序界面已定義好。許多類(lèi)似的驅(qū)動(dòng)程序都非常相近,所以把磁盤(pán)、網(wǎng)絡(luò)或一系列的端口驅(qū)動(dòng)程序從一個(gè)設(shè)備移植到另一個(gè)設(shè)備上通常并不難。你可能發(fā)現(xiàn)許多驅(qū)動(dòng)程序都寫(xiě)得很好,很容易理解,但你還是要準(zhǔn)備一本關(guān)于內(nèi)核結(jié)構(gòu)的書(shū)在手頭。
總之,這些操作系統(tǒng)和Linux的問(wèn)題在于對(duì)工作過(guò)程微小之處的誤解,而不在于代碼的難度或基本的設(shè)計(jì)錯(cuò)誤。任何操作系統(tǒng)都有很多爭(zhēng)論不休的故事,這里不需要重復(fù)。Linux的優(yōu)勢(shì)在于源代碼是公開(kāi)、注釋清晰和文檔齊全的。這樣,你就可以控制和處理所出現(xiàn)的任何問(wèn)題。
綜上所述,Linux嵌入式操作系統(tǒng)在嵌入式系統(tǒng)中的應(yīng)用才剛剛開(kāi)始,但它所具有的技術(shù)優(yōu)勢(shì)和獨(dú)特的運(yùn)開(kāi)發(fā)模式給業(yè)界以新異,有理由相信在不久的將來(lái)Linux嵌入式操作系統(tǒng)一定會(huì)成為綻放在操作系統(tǒng)中美麗的奇葩。
評(píng)論
查看更多