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