周 巖 李欣穎 曹曉燕
摘要:隨著數(shù)字信息技術(shù)和網(wǎng)絡(luò)技術(shù)的高速發(fā)展,嵌入式產(chǎn)業(yè)迅速崛起,嵌入式系統(tǒng)蘊(yùn)含著巨大的市場(chǎng)商機(jī)。本文對(duì)當(dāng)前嵌入式uClinux操作系統(tǒng)的內(nèi)存管理進(jìn)行了分析和研究,為以后改進(jìn)uClinux的內(nèi)核做了鋪墊,使其能夠在實(shí)時(shí)領(lǐng)域有較好的應(yīng)用。
關(guān)鍵詞:Clinux;嵌入式實(shí)時(shí)操作系統(tǒng):內(nèi)存管理
1嵌入式操作系統(tǒng)概述
隨著基于 Intel微處理器芯片的兼容PC機(jī)性?xún)r(jià)比的不斷提高,在實(shí)時(shí)應(yīng)用領(lǐng)域,實(shí)時(shí)系統(tǒng)的應(yīng)用需求發(fā)生了很大
的變化,現(xiàn)代的實(shí)時(shí)應(yīng)用往往要求大容量的數(shù)據(jù)處理能力、復(fù)雜的圖形用戶接口、網(wǎng)絡(luò)支持等。這就對(duì)實(shí)時(shí)操作系統(tǒng)提出了更高的要求。
Linux操作系統(tǒng)是基于PC機(jī)的免費(fèi)的類(lèi)UNIX開(kāi)放式操作系統(tǒng),并采用了源代碼開(kāi)放的發(fā)布策略。由于全世界各地的Linux用戶和開(kāi)發(fā)者的不斷努力,Linux已成長(zhǎng)為高穩(wěn)定性的、性能優(yōu)異的操作系統(tǒng),基于Linux開(kāi)發(fā)一個(gè)開(kāi)放的、標(biāo)準(zhǔn)的、高效廉價(jià)的實(shí)時(shí)操作系統(tǒng)是完全可行的。
2 uClinux嵌入式實(shí)時(shí)操作系統(tǒng)概述
Linux是一種很受歡迎的操作系統(tǒng),它與UNIX系統(tǒng)兼容,開(kāi)放源代碼。它原本被設(shè)計(jì)為桌面系統(tǒng),現(xiàn)在廣泛應(yīng)用于服務(wù)器領(lǐng)域。而更大的影響在于它正逐漸的應(yīng)用于嵌入式設(shè)備。uClinux正是在這種氛圍下產(chǎn)生的。在uClinux這個(gè)英文單詞中u表示Micro,小的意思,C表示Control,控制的意思,所以u(píng)Clinux就是Micro-Control-Linux,字面上的理解就是“針對(duì)微控制領(lǐng)域而設(shè)計(jì)的Linux系統(tǒng)”。
嵌入式操作系統(tǒng)是嵌入式系統(tǒng)的靈魂,而且在同一個(gè)硬件平臺(tái)上可以嵌入不同的嵌入式操作系統(tǒng),嵌入式uClinux操作系統(tǒng)主要由三個(gè)基本部分組成:引導(dǎo)程序、uClinux內(nèi)核(由內(nèi)存管理、進(jìn)程管理和中斷處理等構(gòu)成)和文件系統(tǒng)。uClinux可以通過(guò)定制使內(nèi)核小型化,還可以加上GUI(圖形用戶界面)和定制應(yīng)用程序,并將其放在ROM、 RAM、 FLASH或Disk On Chip中啟動(dòng)。由于嵌入式uClinux操作系統(tǒng)的內(nèi)核定制高度靈活性,開(kāi)發(fā)者可以按需進(jìn)行配置,來(lái)滿足實(shí)際應(yīng)用要求,又由于uClinux是源代碼公開(kāi),因此開(kāi)發(fā)人員完全可以了解內(nèi)核原理,并自己開(kāi)發(fā)部分應(yīng)用軟件。只有很好地掌握uClinux的原理,才能更好地、更合理地完成移植工作。
uClinux是專(zhuān)為沒(méi)有MMU的微處理器設(shè)計(jì)的嵌入式Linux操作系統(tǒng),它的內(nèi)核功能結(jié)構(gòu)與Linux基本相同,不同的主要是對(duì)內(nèi)存管理和進(jìn)程管理進(jìn)行了改寫(xiě),以滿足無(wú)MMU處理器的要求。另外,由于大多數(shù)內(nèi)核源代碼都被重寫(xiě),uClinux的內(nèi)核要比原Linux 2.0內(nèi)核小的多,但保留了Linux操作系統(tǒng)的主要優(yōu)點(diǎn):穩(wěn)定性、優(yōu)異的網(wǎng)絡(luò)能力以及優(yōu)秀的文件系統(tǒng)支持。
3 uClinux內(nèi)存管理所采用的技術(shù)
對(duì)于uClinux來(lái)說(shuō),其設(shè)計(jì)針對(duì)沒(méi)有MMU的處理器,即uClinux不能使用處理器的虛擬內(nèi)存管理技術(shù)。但是為了便于管理,uClinux仍然采用存儲(chǔ)器的分頁(yè)管理,系統(tǒng)在啟動(dòng)時(shí)對(duì)實(shí)際存儲(chǔ)器進(jìn)行分頁(yè),在加載應(yīng)用程序時(shí)分頁(yè)加載。但是由于沒(méi)有MMU管理,所以實(shí)際上uClinux采用實(shí)存儲(chǔ)器管理策略。
uClinux將整個(gè)物理內(nèi)存劃分成大小4KB的頁(yè)面,由數(shù)據(jù)結(jié)構(gòu)page管理,每個(gè)頁(yè)面有一個(gè)page結(jié)構(gòu),所有page結(jié)構(gòu)組成一個(gè)數(shù)組mem_map[]。這些物理頁(yè)面可以為代碼、數(shù)據(jù)、堆棧、文件等提供空間,也可以當(dāng)作緩沖區(qū)。
uClinux仍然使用標(biāo)準(zhǔn)Linux內(nèi)核中的變形Buddy機(jī)制來(lái)管理空閑的物理頁(yè)面,bitmap表、free_area數(shù)組及其相關(guān)的函數(shù)或宏_get free_pages(),free_pages()也還在被使用。但由于沒(méi)有虛擬內(nèi)存管理,虛擬內(nèi)存段結(jié)構(gòu)vm_area_struct以及由它構(gòu)成的鏈表和AVL樹(shù)都不再使用,將頁(yè)面換出到外存中的機(jī)制因而也不能使用,所以標(biāo)準(zhǔn)Linux中的kswapd頁(yè)面換出守護(hù)進(jìn)程和交換空間的頁(yè)面管理數(shù)據(jù)結(jié)構(gòu)在uClinux中都被刪除。
uClinux中的內(nèi)存分配,還是通過(guò)傳統(tǒng)的函數(shù)kmallocQ和kfreeQ實(shí)現(xiàn)的。這些內(nèi)存塊來(lái)自于free_ area數(shù)組,由blocksize表、size表、pagewe descriptor結(jié)構(gòu)和block header結(jié)構(gòu)共同管理。而標(biāo)準(zhǔn)Linux中的vmalloc( )和vfree( ),由于是從虛擬空間3GB以上的虛擬空間分配內(nèi)存,所以在uClinux下對(duì)它們的實(shí)現(xiàn)只是簡(jiǎn)單地調(diào)用kmalloc()和kfree(),實(shí)際上分配的也是從空閑物理頁(yè)面鏈表中獲得的頁(yè)面。
4 uClinux內(nèi)存管理的局限性
由于缺少了MMU的硬件支持,uClinux運(yùn)行真正的多任務(wù)系統(tǒng)時(shí),任務(wù)之間沒(méi)有內(nèi)存保護(hù)機(jī)制,一些有關(guān)進(jìn)程派生的系統(tǒng)調(diào)用就無(wú)法實(shí)現(xiàn)。正是因?yàn)闆](méi)有內(nèi)存保護(hù)機(jī)制(或者說(shuō),沒(méi)有任何安全性可言),它們不適用于多用戶系統(tǒng),uClinux的多任務(wù)管理功能受到一定限制:
uClinux中無(wú)法實(shí)現(xiàn)fork(),而只能使用vfork()。但這并不意味著uClinux不具有多任務(wù)功能,只是父進(jìn)程在調(diào)用vfork()之后必須在子進(jìn)程調(diào)用exec()或者exit()之前阻塞。
標(biāo)準(zhǔn)Linux中內(nèi)存分段為應(yīng)用程序提供了接近無(wú)限的堆空間和棧空間,而uClinux為可執(zhí)行程序在緊隨它的數(shù)據(jù)段結(jié)束處分配堆??臻g,這樣如果堆棧增長(zhǎng)太大,它將可能覆蓋其它的程序或數(shù)據(jù)。
uClinux中沒(méi)有自動(dòng)擴(kuò)展的棧,也沒(méi)有brk()調(diào)用,用戶必須通過(guò)使用mmap()來(lái)分配內(nèi)存空間,可以在程序的編譯過(guò)程中指定它所使用的棧的大小。不具有內(nèi)存保護(hù),任何程序都有可能導(dǎo)致內(nèi)核崩潰。
參考文獻(xiàn)
[1] Free Software Foundation,Inc.1999. GM! Lesser General Public License.http://www. gnu. org/copyleft/lesser. html.2002. 9.
[2] Gcc-2. 95. 3 arm-elf for uClinux.gcc-2. 95. 3. pdf. 2002. 11.
[3] 李善平,劉文峰,李程遠(yuǎn),等.Linux 內(nèi)核2. 4 版源代碼分析大全[M].北京:機(jī)械工業(yè)出版社,2002.
[4] 趙炯.Linux內(nèi)核完全注釋.機(jī)械工業(yè)出版社,2005.
[5] 吳一民.RT-Linux的實(shí)時(shí)機(jī)制分析.計(jì)算機(jī)應(yīng)用,2002, 22 (12):110-112.
[6] 魏忠,蔡勇.嵌入式開(kāi)發(fā)詳解.北京:電子工業(yè)出版社,2003.
作者簡(jiǎn)介:周巖(1982-),碩士研究生,助教,工作單位:長(zhǎng)春工業(yè)大學(xué)軟件職業(yè)技術(shù)學(xué)院,主要研究方向:軟件工程、嵌入式系統(tǒng)開(kāi)發(fā)。
李欣穎(1981-),碩士研究生,助教,工作單位:長(zhǎng)春工業(yè)大學(xué)軟件職業(yè)技術(shù)學(xué)院,主要研究方向:軟件工程、網(wǎng)絡(luò)編程.
曹曉燕(1977-),碩士研究生,助教,工作單位:長(zhǎng)春工業(yè)大學(xué)軟件職業(yè)技術(shù)學(xué)院,主要研究方向:數(shù)據(jù)庫(kù).