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