教你輕松控制uClinux 嵌入式開發(fā)過程
uClinux是目前比較普及的嵌入式Linux版本之一,它的功能很多,并且隨著低成本、可運(yùn)行uClinux的32位CPU的激增,以及 uClinux首次成為L(zhǎng)inux 2.6內(nèi)核的一部分,uClinux將更加流行(如圖1)。下面討論一下開發(fā)者使用uClinux時(shí)如何控制開發(fā)過程,以及將會(huì)遇到的與普通Linux的不同之處。
圖1 uClinux運(yùn)行在Palm上
應(yīng)用無(wú)內(nèi)存管理
uClinux與普通Linux系統(tǒng)的主要區(qū)別就是它沒有內(nèi)存管理。在普通Linux下,通過使用虛擬內(nèi)存(VM)來(lái)實(shí)現(xiàn)內(nèi)存管理。虛擬內(nèi)存一般是通過內(nèi)存管理單元(Memory Management Unit,簡(jiǎn)稱MMU)來(lái)實(shí)現(xiàn),而在uClinux的世界里,經(jīng)??梢钥吹健癗OMMU”這個(gè)詞。
在有虛擬內(nèi)存的情況下,所有的進(jìn)程都在相同的地址空間運(yùn)行,由虛擬內(nèi)存系統(tǒng)處理虛擬內(nèi)存到物理內(nèi)存的映射。因此,即使進(jìn)程看到的虛擬內(nèi)存是連續(xù)的,它所占的物理內(nèi)存也可能是分散的,有的甚至被交換到了硬盤。因?yàn)槲锢韮?nèi)存能映射到進(jìn)程地址空間的任何位置,所以這種環(huán)境下能夠向正在運(yùn)行的進(jìn)程添加內(nèi)存。
在沒有虛擬內(nèi)存的情況下,每個(gè)進(jìn)程必須被分配到固定的內(nèi)存位置。由于一個(gè)進(jìn)程的上、下(內(nèi)存位置)都可能有別的進(jìn)程在運(yùn)行,所以它通常不能動(dòng)態(tài)擴(kuò)展內(nèi)存。這就是說,在uClinux下運(yùn)行的進(jìn)程不能在運(yùn)行過程中動(dòng)態(tài)增加可用內(nèi)存,這與傳統(tǒng)Linux下的情況有所不同。
對(duì)于uClinux開發(fā)者來(lái)說,分配內(nèi)存是一個(gè)棘手的問題,并且由于沒有任何形式的內(nèi)存保護(hù),任何應(yīng)用程序或內(nèi)核都可能破壞系統(tǒng)。更為糟糕的是,無(wú)意識(shí)的誤操作不會(huì)引人注意,造成要跟蹤隨機(jī)的、進(jìn)程間的破壞非常困難。但是這些缺陷對(duì)于uClinux來(lái)說幾乎不算問題,這是因?yàn)槭褂?uClinux的系統(tǒng)一般沒有硬盤驅(qū)動(dòng)器和足夠的內(nèi)存,完全沒有必要做復(fù)雜的管理和交換。
做足內(nèi)存映射
對(duì)于內(nèi)核開發(fā)者,uClinux與普通Linux區(qū)別很小。惟一真正會(huì)遇到的問題是uClinux內(nèi)核開發(fā)者不能利用MMU提供的分頁(yè)支持,比如,依賴虛擬內(nèi)存的tmpfs文件系統(tǒng)在uClinux下就不起作用。類似的,普通Linux下的標(biāo)準(zhǔn)可執(zhí)行文件格式 uClinux都不支持,因?yàn)樗鼈兌家锰摂M內(nèi)存的特性。uClinux需要一種新的格式——Flat,它是一種壓縮的可執(zhí)行文件格式,只保存可執(zhí)行的代碼和數(shù)據(jù),以及將可執(zhí)行程序裝載到內(nèi)存時(shí)所需要的重定位信息。
理解uClinux內(nèi)核中內(nèi)存映射的實(shí)現(xiàn)方式也是很有必要的,因?yàn)橛行┓绞皆趗Clinux系統(tǒng)上行不通,理解內(nèi)存映射的實(shí)現(xiàn)后可以避免使用這些方式。uClinux要求內(nèi)存映射能夠直接在文件系統(tǒng)中指到文件,從而保證它是順序的和連續(xù)的,否則就必須事先為文件分配好內(nèi)存,并把數(shù)據(jù)拷貝到分配給它的內(nèi)存塊上。
因此,uClinux下有效內(nèi)存映射的用法要素非常明確:首先,當(dāng)前惟一能夠保證文件連續(xù)存儲(chǔ)的文件系統(tǒng)是ROM文件系統(tǒng)(Romfs),所以必須使用Romfs來(lái)避免傳統(tǒng)內(nèi)存分配;其次,只有只讀的內(nèi)存映射能夠被共享,也就是說,為了避免傳統(tǒng)內(nèi)存分配,映射必須是只讀的。由于這些原因,uClinux下的開發(fā)者不能利用“Copy-on- Write”特性。
要將設(shè)備驅(qū)動(dòng)程序移植到uClinux環(huán)境,需要做一些修改,這并不是因?yàn)閮?nèi)核上的區(qū)別,而是由于與硬件細(xì)節(jié)相關(guān)部分有所不同造成的。比如,普通Linux下,SMC網(wǎng)絡(luò)驅(qū)動(dòng)程序可以支持ISA SMC卡。該驅(qū)動(dòng)程序是16位的,并且一般都分配到0x3ff以下的I/O地址空間。
但是用來(lái)支持SMC卡的非ISA嵌入式版本,驅(qū)動(dòng)程序要求運(yùn)行在8位、16位或32位模式下都是可能的,并且在滿32位的I/O地址中,中斷號(hào)一般要高于ISA的最大值16。所以,與硬件細(xì)節(jié)相關(guān)的部分可能還是要做一些移植工作。
評(píng)論