嵌入式操作系統(tǒng)設(shè)計(jì)中的若干問(wèn)題
——
隨著計(jì)算機(jī)技術(shù)的發(fā)展,嵌入式應(yīng)用已經(jīng)成為計(jì)算機(jī)應(yīng)用領(lǐng)域的一個(gè)重要組成部分。所謂嵌入式應(yīng)用,是指應(yīng)用系統(tǒng)不是以計(jì)算機(jī)為主,而是把計(jì)算機(jī)技術(shù)做為應(yīng)用系統(tǒng)的一個(gè)組成部分嵌入到應(yīng)用系統(tǒng)中,使其具有更高的性能。例如:程控交換機(jī)、手持式電話(huà)等,計(jì)算機(jī)的嵌入式應(yīng)用領(lǐng)域是十分廣闊的。
為了適應(yīng)嵌入式應(yīng)用的復(fù)雜性和多樣性,并縮短其開(kāi)發(fā)周期,嵌入式操作系統(tǒng)應(yīng)運(yùn)而生。嵌入式操作系統(tǒng)是相對(duì)于一般操作系統(tǒng)而言,通常指的是操作系統(tǒng)的核,嚴(yán)格地說(shuō)是微內(nèi)核。嵌入式操作系統(tǒng)為了適應(yīng)被嵌入系統(tǒng)的要求具備了一般操作系統(tǒng)最基本的功能,如任務(wù)調(diào)度、同步機(jī)制、中斷處理,但是沒(méi)有一般操作系統(tǒng)的用戶(hù)界面,如Shell。嵌入式操作系統(tǒng)是以庫(kù)的形式提供給用戶(hù),用戶(hù)可以通過(guò)操作系統(tǒng)的API(Application Programming Interface)使用嵌入式操作系統(tǒng)。
2 操作系統(tǒng)的幾種結(jié)構(gòu)
單一操作系統(tǒng)
操作系統(tǒng)由許多模塊組成,這些模塊之間可以相互調(diào)用。在這樣的操作系統(tǒng)中通常有二種工作模式,即系統(tǒng)模式和用戶(hù)模式。在系統(tǒng)模式下可以執(zhí)行任何操作,而在用戶(hù)模式下有些操作是受限制的,例如I/O操作和一些特殊指令。運(yùn)行在用戶(hù)模式的應(yīng)用程序可以通過(guò)系統(tǒng)調(diào)用進(jìn)入系統(tǒng)模式,完成操作后再返回用戶(hù)模式,但是這樣的操作系統(tǒng)很難維護(hù)和調(diào)試。
層次結(jié)構(gòu)操作系統(tǒng)
層次結(jié)構(gòu)操作系統(tǒng)通常可以分為用戶(hù)程序、I/O管理、進(jìn)程通信、存儲(chǔ)管理4層。程序可以在各層運(yùn)行,這樣的操作系統(tǒng)提供了“環(huán)”管理機(jī)制,即第n環(huán)的程序無(wú)權(quán)修改第n-1環(huán)的數(shù)據(jù),從而提高了操作系統(tǒng)的安全性。
客戶(hù)/服務(wù)器方式操作系統(tǒng)
這種操作系統(tǒng)只有一個(gè)很小的內(nèi)核,以完成進(jìn)程間通信等基本功能,而把許多其它功能作為服務(wù)進(jìn)程,運(yùn)行于用戶(hù)模式,用戶(hù)程序作為客戶(hù)進(jìn)程。其工作方式是客戶(hù)進(jìn)程發(fā)出請(qǐng)求,服務(wù)進(jìn)程響應(yīng)請(qǐng)求,操作系統(tǒng)僅完成它們之間的通信。
嵌入式操作系統(tǒng)
一般的操作系統(tǒng)不僅向用戶(hù)提供開(kāi)發(fā)應(yīng)用程序的各種API,而且,還必須以命令行的形式或是圖形的形式提供一個(gè)界面。但是嵌入式操作系統(tǒng)只有API而沒(méi)有通常意義下的界面,亦即只有一個(gè)核心。在核心里只有操作系統(tǒng)的一些基本功能,如任務(wù)(線(xiàn)程)調(diào)度、存儲(chǔ)管理、同步機(jī)制、中斷管理、API等,而這些功能又可以根據(jù)不同的應(yīng)用系統(tǒng)裁剪和擴(kuò)充,以便以最小的代碼量滿(mǎn)足嵌入式系統(tǒng)的需求。
3 設(shè)計(jì)嵌入式操作系統(tǒng)應(yīng)考慮的問(wèn)題
確切地說(shuō),嵌入式設(shè)計(jì)不是一種技術(shù),而是一種概念,一種設(shè)計(jì)哲學(xué),即把計(jì)算機(jī)相關(guān)技術(shù)嵌入到各種應(yīng)用系統(tǒng)中去,嵌入的方式可以是軟件嵌入或硬件嵌入。在這種概念下,一個(gè)好的嵌入式設(shè)計(jì)應(yīng)該滿(mǎn)足以下幾點(diǎn):
使用相關(guān)計(jì)算機(jī)的技術(shù)使被嵌入的系統(tǒng)獲得很好的性能價(jià)格比;
能很好地與被嵌入系統(tǒng)相匹配;
在滿(mǎn)足被嵌入系統(tǒng)功能的前提下盡可能簡(jiǎn)單,避免導(dǎo)致大的系統(tǒng)開(kāi)銷(xiāo)。
從某種意義上說(shuō),操作系統(tǒng)是計(jì)算機(jī)的一個(gè)擴(kuò)展,它賦予了計(jì)算機(jī)更多的功能;從另一個(gè)角度看,操作系統(tǒng)也是計(jì)算機(jī)系統(tǒng)的資源管理者。因此,在嵌入式操作系統(tǒng)中,內(nèi)核的最小構(gòu)成也應(yīng)包含下列各部分。
(1)任務(wù)調(diào)度
在當(dāng)前的嵌入式應(yīng)用中,特別是對(duì)一個(gè)復(fù)雜的嵌入式應(yīng)用而言,用單任務(wù)來(lái)實(shí)現(xiàn)是不可能的,而只能采用多任務(wù)實(shí)現(xiàn),因此任務(wù)調(diào)度策略的優(yōu)劣是至關(guān)重要的。
雖然有各種各樣的任務(wù)調(diào)度方法,但概括起來(lái)可以分為優(yōu)先級(jí)調(diào)度、輪轉(zhuǎn)調(diào)度、時(shí)間片調(diào)度3種。
優(yōu)先級(jí)調(diào)度又可以分為2種:優(yōu)先級(jí)搶占和優(yōu)先級(jí)不搶占。優(yōu)先級(jí)搶占是指當(dāng)有高的優(yōu)先級(jí)進(jìn)程被激活后,則立即終止當(dāng)前運(yùn)行的進(jìn)程,使其搶占CPU運(yùn)行。優(yōu)先級(jí)不搶占是指當(dāng)有高的優(yōu)先級(jí)進(jìn)程被激活后,并不立即終止當(dāng)前運(yùn)行的進(jìn)程使其搶占CPU,而是將其放到進(jìn)程就緒隊(duì)列中,在當(dāng)前運(yùn)行的進(jìn)程結(jié)束后,從進(jìn)程就緒隊(duì)列中選擇優(yōu)先級(jí)最高的進(jìn)程運(yùn)行。輪轉(zhuǎn)調(diào)度是進(jìn)程管理者按照一個(gè)固定的時(shí)間間隔讓就緒進(jìn)程輪流運(yùn)行。時(shí)間片調(diào)度是根據(jù)每個(gè)進(jìn)程各自的實(shí)際情況在不同數(shù)量的單位時(shí)間的時(shí)間片內(nèi)運(yùn)行。
在一般的操作系統(tǒng)中,固定采用其中的1種或幾種方法進(jìn)行任務(wù)調(diào)度。例如在Unix和Linux中,采用了優(yōu)先級(jí)不搶占、輪轉(zhuǎn)和時(shí)間片3種方法,而在實(shí)時(shí)操作系統(tǒng)中,優(yōu)先級(jí)搶占則是必不可少的。
無(wú)論是在一般的操作系統(tǒng)中還是在嵌入式操作系統(tǒng)中,任務(wù)調(diào)度都是操作系統(tǒng)的核心。在嵌入式操作系統(tǒng)設(shè)計(jì)中,很難明確地說(shuō)哪一種方法比其它方法更好,而要根據(jù)被嵌入的實(shí)際系統(tǒng)的需求進(jìn)行優(yōu)化選擇。由于線(xiàn)程的切換速度快于進(jìn)程的切換速度,因此,在實(shí)時(shí)嵌入式應(yīng)用中,多采用單進(jìn)程多線(xiàn)程調(diào)度來(lái)提高實(shí)時(shí)性。在嵌入式操作系統(tǒng)中一般都配有上述3種調(diào)度算法的庫(kù)函數(shù),以滿(mǎn)足不同用戶(hù)的不同需求。在用戶(hù)開(kāi)發(fā)完自己的應(yīng)用系統(tǒng)后,沒(méi)有使用到的代碼是不會(huì)被連接到最終系統(tǒng)中的,這一點(diǎn)是與一般的操作系統(tǒng)非常重要的區(qū)別。一般的操作系統(tǒng)則是將所有有關(guān)代碼都加載到計(jì)算機(jī)系統(tǒng)中,而不論應(yīng)用時(shí)是否會(huì)使用這些代碼。
在實(shí)時(shí)嵌入式應(yīng)用中還有一種調(diào)度方法,即期限(deadline)調(diào)度法。這種調(diào)度方法是設(shè)法保證每一個(gè)進(jìn)程(或線(xiàn)程)能在它的期限之前被調(diào)度執(zhí)行完,這種方法目前正在研究之中。
(2)存儲(chǔ)管理
一般操作系統(tǒng)的存儲(chǔ)管理非常復(fù)雜,虛擬管理被廣泛地使用,簡(jiǎn)單地說(shuō)虛擬存儲(chǔ)器管理就是通過(guò)操作系統(tǒng)對(duì)內(nèi)存和外存的管理,可以使應(yīng)用程序獲得比計(jì)算機(jī)實(shí)際內(nèi)存更大的編址空間,使每一個(gè)應(yīng)用程序都可以享有一個(gè)獨(dú)立的虛擬存儲(chǔ)空間。程序訪(fǎng)問(wèn)的地址是虛擬地址,操作系統(tǒng)通過(guò)段、頁(yè)管理完成虛擬地址到物理地址的轉(zhuǎn)換和頁(yè)面的換入/換出,同時(shí)管理和維護(hù)各應(yīng)用程序之間共享的存儲(chǔ)空間。這樣各應(yīng)用程序被分隔在各自的地址空間運(yùn)行,不致相互干擾。
嵌入式操作系統(tǒng)的存儲(chǔ)管理通常比較簡(jiǎn)單。在具體的嵌入式應(yīng)用中,進(jìn)程(或線(xiàn)程)的數(shù)量和各自可能使用的內(nèi)存容量是可以在開(kāi)發(fā)時(shí)預(yù)測(cè)的,因此嵌入式操作系統(tǒng)通常采用靜態(tài)內(nèi)存分配。尤其是在實(shí)時(shí)嵌入式應(yīng)用中,如果采用虛擬存儲(chǔ)技術(shù),因?yàn)轫?yè)交換的時(shí)間不可預(yù)測(cè),所以是不可取的。對(duì)于動(dòng)態(tài)內(nèi)存分配通常的做法也是從緩沖區(qū)中動(dòng)態(tài)分配一塊固定大小的內(nèi)存,在使用完畢后就釋放。一般地說(shuō),嵌入式操作系統(tǒng)的存儲(chǔ)管理沒(méi)有垃圾收集的功能。在一個(gè)復(fù)雜的應(yīng)用系統(tǒng)中,可能會(huì)有幾種情況的組合,應(yīng)視具體情況處理。例如,在一個(gè)有多個(gè)處理器,且既有硬實(shí)時(shí)應(yīng)用,又有軟實(shí)時(shí)應(yīng)用和非實(shí)時(shí)應(yīng)用的嵌入式系統(tǒng)中,設(shè)計(jì)時(shí)可以在硬實(shí)時(shí)部分采用靜態(tài)內(nèi)存分配,軟實(shí)時(shí)部分采用動(dòng)態(tài)內(nèi)存分配,而在非實(shí)時(shí)部分采用虛擬存儲(chǔ)技術(shù),并且使這三種應(yīng)用分別運(yùn)行在不同的處理器上。
在內(nèi)存分配的策略上,嵌入式操作系統(tǒng)強(qiáng)烈地依賴(lài)于實(shí)際的被嵌入系統(tǒng)。一個(gè)通用嵌入式操作系統(tǒng)可以提供幾種分配策略,而用戶(hù)在開(kāi)發(fā)自己的實(shí)際系統(tǒng)時(shí)可以選擇,這就再次強(qiáng)調(diào)了前文提到的嵌入式操作系統(tǒng)的可裁剪性。
存儲(chǔ)管理的另一個(gè)重要特性就是內(nèi)存保護(hù)。在一般的操作系統(tǒng)中,每個(gè)應(yīng)用程序都有自己的地址空間,不能任意訪(fǎng)問(wèn)其它應(yīng)用程序的地址空間。這樣,當(dāng)一個(gè)應(yīng)用程序崩潰時(shí),不會(huì)對(duì)其它程序產(chǎn)生影響。盡管存儲(chǔ)器芯片價(jià)格已經(jīng)很便宜,但因受應(yīng)用環(huán)境的限制,不能大量使用存儲(chǔ)器,這時(shí)嵌入式操作系統(tǒng)的代碼量就受到嚴(yán)格限制。例如有的嵌入式操作系統(tǒng)只有幾KB,使其在處理內(nèi)存保護(hù)方面就非常薄弱,這樣的嵌入式操作系統(tǒng)一般應(yīng)用于一些即使系統(tǒng)崩潰,也不致造成重大損失的領(lǐng)域,例如手持式電話(huà)。但某些嵌入式應(yīng)用則對(duì)內(nèi)存保護(hù)有非常嚴(yán)格的要求,例如在武器系統(tǒng)中,就要求嵌入式操作系統(tǒng)具有內(nèi)存保護(hù)的功能。
(3)中斷
計(jì)算機(jī)系統(tǒng)接受事件有二種方法:查詢(xún)和中斷。在多任務(wù)操作系統(tǒng)中,由于采用查詢(xún)方式處理事件或I/O請(qǐng)求會(huì)消耗大量的系統(tǒng)資源—— CPU時(shí)間。因此無(wú)論在一般的操作系統(tǒng)還是嵌入式操作系統(tǒng)中都采用中斷方式來(lái)處理事件或I/O請(qǐng)求。
在操作系統(tǒng)中,中斷是同中斷處理程序聯(lián)系在一起的。以I/O操作為例,一般的過(guò)程是:任務(wù)A發(fā)出I/O請(qǐng)求后被掛起→操作系統(tǒng)切換到其它任務(wù)運(yùn)行→I/O設(shè)備完成相應(yīng)的操作并發(fā)出中斷請(qǐng)求→操作系統(tǒng)調(diào)用相應(yīng)的中斷處理程序→解掛任務(wù)A。
在嵌入式操作系統(tǒng)中,對(duì)中斷處理十分重視,可以說(shuō)多數(shù)嵌入式操作系統(tǒng)都是事件驅(qū)動(dòng)的。在嵌入式操作系統(tǒng)中,中斷處理程序引發(fā)的任務(wù)切換如下所示:
任務(wù)A運(yùn)行→響應(yīng)中斷并執(zhí)行中斷處理程序,切換到任務(wù)B→任務(wù)B運(yùn)行退出后,切換到任務(wù)A→任務(wù)A繼續(xù)運(yùn)行
在中斷處理程序(ISR)中僅執(zhí)行一些必要的狀態(tài)轉(zhuǎn)換,對(duì)于事件的真正處理則利用中斷任務(wù)(如上述的任務(wù)B)完成。這樣使得中斷處理程序的運(yùn)行時(shí)間盡可能短,以便系統(tǒng)可以處理其它中斷事件。同時(shí),在ISR中不能執(zhí)行有關(guān)信號(hào)量的操作。因?yàn)镮SR具有最高優(yōu)先級(jí),如果在ISR中執(zhí)行了信號(hào)量操作而被掛起,則整個(gè)系統(tǒng)將會(huì)死鎖。
在中斷處理上,一般的操作系統(tǒng)與嵌入式操作系統(tǒng)的不同之處是現(xiàn)場(chǎng)保護(hù)。一般的操作系統(tǒng)的中斷現(xiàn)場(chǎng)保護(hù)是由操作系統(tǒng)來(lái)完成的,在中斷處理完成之后,也由操作系統(tǒng)恢復(fù)現(xiàn)場(chǎng)。在嵌入式操作系統(tǒng)中,有時(shí)由于受到代碼量的限制,中斷現(xiàn)場(chǎng)的保護(hù)往往由中斷處理程序來(lái)完成。在中斷處理程序的入口要保護(hù)在中斷處理程序中用到的寄存器,在中斷處理完成后恢復(fù)。這樣一方面減少了代碼量,另一方面提高了中斷響應(yīng)時(shí)間,但是卻損失了系統(tǒng)的安全性,同時(shí)也增加了調(diào)試的難度。這是在嵌入式操作系統(tǒng)的設(shè)計(jì)中應(yīng)該予以關(guān)注的問(wèn)題。
(4)操作系統(tǒng)與用戶(hù)的接口
操作系統(tǒng)提供給用戶(hù)使用的有二類(lèi)接口。一類(lèi)是人機(jī)界面,無(wú)論是視窗形式還是命令行形式,這個(gè)接口確切地說(shuō)并不能做為操作系統(tǒng)的一部分,而僅僅是操作系統(tǒng)的一個(gè)外殼,這個(gè)界面是為了方便用戶(hù)使用操作系統(tǒng),而這個(gè)接口在嵌入式操作系統(tǒng)中是不存在的。這里要討論的是另一個(gè)接口,操作系統(tǒng)提供給用戶(hù)開(kāi)發(fā)自己的應(yīng)用程序接口(API),也就是系統(tǒng)調(diào)用。無(wú)論是一般的操作系統(tǒng)還是嵌入式操作系統(tǒng)都應(yīng)具有這個(gè)接口。每一個(gè)操作系統(tǒng)提供的系統(tǒng)調(diào)用的功能和種類(lèi)都不同,當(dāng)然,對(duì)于一個(gè)操作系統(tǒng)來(lái)說(shuō),它提供的系統(tǒng)調(diào)用越多,則功能越強(qiáng),對(duì)于應(yīng)用程序的開(kāi)發(fā),也就越能提供高效而簡(jiǎn)單的支持,同時(shí)也會(huì)減少應(yīng)用程序的維護(hù)量。相反,一個(gè)操作系統(tǒng)的系統(tǒng)調(diào)用越少越單一,那么應(yīng)用程序相對(duì)就要做更多的工作,應(yīng)用程序也就越復(fù)雜。為了適應(yīng)不斷復(fù)雜的應(yīng)用程序開(kāi)發(fā)的需求,操作系統(tǒng)中設(shè)計(jì)的系統(tǒng)調(diào)用也就越來(lái)越多,越來(lái)越復(fù)雜,功能越來(lái)越強(qiáng)大。但是這一規(guī)律并不適用于嵌入式操作系統(tǒng),嵌入式操作系統(tǒng)的應(yīng)用領(lǐng)域非常廣,簡(jiǎn)單的可以應(yīng)用在調(diào)制解調(diào)器上,復(fù)雜的可以應(yīng)用在衛(wèi)星地面通信接收站。這就決定了嵌入式操作系統(tǒng)所提供的系統(tǒng)調(diào)用的數(shù)量和功能是因應(yīng)用不同而不同的。盡管前文提到的可裁剪性是嵌入式操作系統(tǒng)的一個(gè)非常重要的特性,但是任何一個(gè)嵌入式操作系統(tǒng)都不可能從具有各種完善功能、代碼達(dá)幾百KB的操作系統(tǒng),裁剪到只具有實(shí)時(shí)調(diào)度和信號(hào)量操作的幾KB代碼。所以嵌入式操作系統(tǒng)只能面向?qū)嶋H的被嵌入系統(tǒng)的具體需求,確定系統(tǒng)調(diào)用,以便達(dá)到在提供最有效的系統(tǒng)調(diào)用的同時(shí)具有最小的代碼量。
最后,在系統(tǒng)調(diào)用的形式上要提到POSIX。由于各個(gè)操作系統(tǒng)提供自己的系統(tǒng)調(diào)用,其類(lèi)型、功能和調(diào)用格式各不相同,這樣給應(yīng)用程序的移植帶來(lái)了很大困難。POSIX標(biāo)準(zhǔn)的提出正是試圖解決這一問(wèn)題。POSIX試圖定義一些標(biāo)準(zhǔn)的系統(tǒng)調(diào)用接口和功能,盡管各個(gè)操作系統(tǒng)的實(shí)現(xiàn)方式各不相同。POSIX是以類(lèi)Unix為基礎(chǔ)開(kāi)發(fā)的,同時(shí),它試圖將實(shí)時(shí)和非實(shí)時(shí)的情況統(tǒng)一化,這樣就喪失了一定的效率和增加了代碼量,所以有些操作系統(tǒng)在提供POSIX兼容的系統(tǒng)調(diào)用的同時(shí),也提供了非POSIX兼容的系統(tǒng)調(diào)用。
4 結(jié)論
以上從構(gòu)成一個(gè)操作系統(tǒng)的幾個(gè)最重要的組成部分討論了嵌入式操作系統(tǒng)與一般的操作系統(tǒng)的相同與不同之處。當(dāng)然,構(gòu)成一個(gè)完整的操作系統(tǒng),還需要其它組成部分,如時(shí)鐘、同步/互斥、進(jìn)程間通信等。從以上分析可以看出,要設(shè)計(jì)一個(gè)好的嵌入式操作系統(tǒng),必須充分考慮被嵌入的系統(tǒng),要根據(jù)實(shí)際的應(yīng)用來(lái)設(shè)計(jì)、選擇操作系統(tǒng)。雖然嵌入式操作系統(tǒng)是可裁剪的,但這種裁剪也是有限的。
嵌入式系統(tǒng)正在蓬勃發(fā)展,存在著無(wú)限的商機(jī),在這一領(lǐng)域,機(jī)遇與挑戰(zhàn)并存。嵌入式操作系統(tǒng)的設(shè)計(jì)將在競(jìng)爭(zhēng)中起決定性作用。
linux操作系統(tǒng)文章專(zhuān)題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論