嵌入式Linu系統(tǒng)開發(fā)_第1頁
嵌入式Linu系統(tǒng)開發(fā)_第2頁
嵌入式Linu系統(tǒng)開發(fā)_第3頁
嵌入式Linu系統(tǒng)開發(fā)_第4頁
嵌入式Linu系統(tǒng)開發(fā)_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

嵌入式Linux系統(tǒng)開發(fā)Linux,嵌入式,系統(tǒng),開發(fā)如果您剛接觸嵌入式開發(fā),那么大量可用的引導(dǎo)裝載程序(bootloader)、規(guī)??s小的分發(fā)版(distribution)、文件系統(tǒng)和GUI看起來可能太多了。但是這些豐富的選項(xiàng)實(shí)際上是一種恩賜,允許您調(diào)整開發(fā)或用戶環(huán)境以完全符合您的需要。對(duì)Linux嵌入式開發(fā)的概述將幫助您理解所有這些選項(xiàng)。Linux正在嵌入式開發(fā)領(lǐng)域穩(wěn)步發(fā)展。因?yàn)長(zhǎng)inux使用GPL(請(qǐng)參閱本文后面的參考資料),所以任何對(duì)將Linux定制于PDA、掌上機(jī)或者可佩帶設(shè)備感興趣的人都可以從因特網(wǎng)免費(fèi)下載其內(nèi)核和應(yīng)用程序,并開始移植或開發(fā)。許多Linux改良品種迎合了嵌入式/實(shí)時(shí)市場(chǎng)。它們包括RTLinux(實(shí)時(shí)Linux)、uclinux(用于非MMU設(shè)備的Linux)、MontavistaLinux(用于ARM、MIPS、PPC的Linux分發(fā)版)、ARM-Linux(ARM上的Linux)和其它Linux系統(tǒng)(請(qǐng)參閱參考資料以鏈接到本文中提到的這些和其它術(shù)語及產(chǎn)品。)嵌入式Linux開發(fā)大致涉及三個(gè)層次:引導(dǎo)裝載程序、Linux內(nèi)核和圖形用戶界面(或稱GUI)。在本文中,我們將集中討論涉及這三層的一些基本概念;深入了解引導(dǎo)裝載程序、內(nèi)核和文件系統(tǒng)是如何交互的;并將研究可用于文件系統(tǒng)、GUI和引導(dǎo)裝載程序的眾多選項(xiàng)中的一部分。引導(dǎo)裝載程序引導(dǎo)裝載程序通常是在任何硬件上執(zhí)行的第一段代碼。在象臺(tái)式機(jī)這樣的常規(guī)系統(tǒng)中,通常將引導(dǎo)裝載程序裝入主引導(dǎo)記錄(MasterBootRecord,(MBR))中,或者裝入Linux駐留的磁盤的第一個(gè)扇區(qū)中。通常,在臺(tái)式機(jī)或其它系統(tǒng)上,BIOS將控制移交給引導(dǎo)裝載程序。這就提出了一個(gè)有趣的問題:誰將引導(dǎo)裝載程序裝入(在大多數(shù)情況中)沒有BIOS的嵌入式設(shè)備上呢?解決這個(gè)問題有兩種常規(guī)技術(shù):專用軟件和微小的引導(dǎo)代碼(tinybootcode)o專用軟件可以直接與遠(yuǎn)程系統(tǒng)上的閃存設(shè)備進(jìn)行交互并將引導(dǎo)裝載程序安裝在閃存的給定位置中。閃存設(shè)備是與存儲(chǔ)設(shè)備功能類似的特殊芯片,而且它們能持久存儲(chǔ)信息—即,在重新引導(dǎo)時(shí)不會(huì)擦除其內(nèi)容。這個(gè)軟件使用目標(biāo)(在嵌入式開發(fā)中,嵌入式設(shè)備通常被稱為目標(biāo))上的JTAG端口,它是用于執(zhí)行外部輸入(通常來自主機(jī)機(jī)器)的指令的接口。JFlash-linux是一種用于直接寫閃存的流行工具。它支持為數(shù)眾多的閃存芯片;它在主機(jī)機(jī)器(通常是i386機(jī)器—本文中我們把一臺(tái)i386機(jī)器稱為主機(jī))上執(zhí)行并通過JTAG接口使用并行端口訪問目標(biāo)的閃存芯片。當(dāng)然,這意味著目標(biāo)需要有一個(gè)并行接口使它能與主機(jī)通信。Jflash-linux在Linux和Windows版本中都可使用,可以在命令行中用以下命令啟動(dòng)它:Jflash-linux某些種類的嵌入式設(shè)備具有微小的引導(dǎo)代碼—根據(jù)幾個(gè)字節(jié)的指令—它將初始化一些DRAM設(shè)置并啟用目標(biāo)上的一個(gè)串行(或者USB,或者以太網(wǎng))端口與主機(jī)程序通信。然后,主機(jī)程序或裝入程序可以使用這個(gè)連接將引導(dǎo)裝載程序傳送到目標(biāo)上,并將它寫入閃存。在安裝它并給予其控制后,這個(gè)引導(dǎo)裝載程序執(zhí)行下列各類功能:初始化CPU速度初始化內(nèi)存,包括啟用內(nèi)存庫(kù)、初始化內(nèi)存配置寄存器等初始化串行端口(如果在目標(biāo)上有的話)啟用指令/數(shù)據(jù)高速緩存設(shè)置堆棧指針設(shè)置參數(shù)區(qū)域并構(gòu)造參數(shù)結(jié)構(gòu)和標(biāo)記(這是重要的一步,因?yàn)閮?nèi)核在標(biāo)識(shí)根設(shè)備、頁面大小、內(nèi)存大小以及更多內(nèi)容時(shí)要使用引導(dǎo)參數(shù))執(zhí)行POST(加電自檢)來標(biāo)識(shí)存在的設(shè)備并報(bào)告任何問題為電源管理提供掛起/恢復(fù)支持跳轉(zhuǎn)到內(nèi)核的開始帶有引導(dǎo)裝載程序、參數(shù)結(jié)構(gòu)、內(nèi)核和文件系統(tǒng)的系統(tǒng)典型內(nèi)存布局可能如下所示:清單1.典型內(nèi)存布局/*TopOfMemory*/BootloaderParameterAreaKernelFilesystem/*EndOfMemory*/嵌入式設(shè)備上一些流行的并可免費(fèi)使用的Linux引導(dǎo)裝載程序有Blob、Redboot和Bootldr(請(qǐng)參閱參考資料獲得鏈接)。所有這些引導(dǎo)裝載程序都用于基于ARM設(shè)備上的Linux,并需要Jflash-linux工具用于安裝。一旦將引導(dǎo)裝載程序安裝到目標(biāo)的閃存中,它就會(huì)執(zhí)行我們上面提到的所有初始化工作。然后,它準(zhǔn)備接收來自主機(jī)的內(nèi)核和文件系統(tǒng)。一旦裝入了內(nèi)核,引導(dǎo)裝載程序就將控制轉(zhuǎn)給內(nèi)核。設(shè)置工具鏈設(shè)置工具鏈在主機(jī)機(jī)器上創(chuàng)建一個(gè)用于編譯將在目標(biāo)上運(yùn)行的內(nèi)核和應(yīng)用程序的構(gòu)建環(huán)境—這是因?yàn)槟繕?biāo)硬件可能沒有與主機(jī)兼容的二進(jìn)制執(zhí)行級(jí)別。工具鏈由一套用于編譯、匯編和鏈接內(nèi)核及應(yīng)用程序的組件組成。這些組件包括:Binutils—用于操作二進(jìn)制文件的實(shí)用程序集合。它們包括諸如ar、as、objdump、objcopy這樣的實(shí)用程序。Gcc—GNUC編譯器。Glibc—所有用戶應(yīng)用程序都將鏈接到的C庫(kù)。避免使用任何C庫(kù)函數(shù)的內(nèi)核和其它應(yīng)用程序可以在沒有該庫(kù)的情況下進(jìn)行編譯。構(gòu)建工具鏈建立了一個(gè)交*編譯器環(huán)境。本地編譯器編譯與本機(jī)同類的處理器的指令。交*編譯器運(yùn)行在某一種處理器上,卻可以編譯另一種處理器的指令。重頭設(shè)置交*編譯器工具鏈可不是一項(xiàng)簡(jiǎn)單的任務(wù):它包括下載源代碼、修補(bǔ)補(bǔ)丁、配置、編譯、設(shè)置頭文件、安裝以及很多很多的操作。另外,這樣一個(gè)徹底的構(gòu)建過程對(duì)內(nèi)存和硬盤的需求是巨大的。如果沒有足夠的內(nèi)存和硬盤空間,那么在構(gòu)建階段由于相關(guān)性、配置或頭文件設(shè)置等問題會(huì)突然冒出許多問題。因此能夠從因特網(wǎng)上獲得已預(yù)編譯的二進(jìn)制文件是一件好事(但不太好的一點(diǎn)是,目前它們大多數(shù)只限于基于ARM的系統(tǒng),但遲早會(huì)改變的)。一些比較流行的已預(yù)編譯的工具鏈包括那些來自Compaq(FamiliarLinux)、LART(LARTLinux)和Embedian(基于Debian但與它無關(guān))的工具鏈一所有這些工具鏈都用于基于ARM的平臺(tái)。內(nèi)核設(shè)置Linux社區(qū)正積極地為新硬件添加功能部件和支持、在內(nèi)核中修正錯(cuò)誤并且及時(shí)地進(jìn)行常規(guī)改進(jìn)。這導(dǎo)致大約每6個(gè)月(或6個(gè)月不到)就有一個(gè)穩(wěn)定的Linux樹的新發(fā)行版。不同的維護(hù)者維護(hù)針對(duì)特定體系結(jié)構(gòu)的不同內(nèi)核樹和補(bǔ)丁。當(dāng)為一個(gè)項(xiàng)目選擇了一個(gè)內(nèi)核時(shí),您需要評(píng)估最新發(fā)行版的穩(wěn)定性如何、它是否符合項(xiàng)目要求和硬件平臺(tái)、從編程角度來看它的舒適程度以及其它難以確定的方面。還有一點(diǎn)也非常重要:找到需要應(yīng)用于基本內(nèi)核的所有補(bǔ)丁,以便為特定的體系結(jié)構(gòu)調(diào)整內(nèi)核。內(nèi)核布局內(nèi)核布局分為特定于體系結(jié)構(gòu)的部分和與體系結(jié)構(gòu)無關(guān)的部分。內(nèi)核中特定于體系結(jié)構(gòu)的部分首先執(zhí)行,設(shè)置硬件寄存器、配置內(nèi)存映射、執(zhí)行特定于體系結(jié)構(gòu)的初始化,然后將控制轉(zhuǎn)給內(nèi)核中與體系結(jié)構(gòu)無關(guān)的部分。系統(tǒng)的其余部分在這第二個(gè)階段期間進(jìn)行初始化。內(nèi)核樹下的目錄arch/由不同的子目錄組成,每個(gè)子目錄用于一個(gè)不同的體系結(jié)構(gòu)(MIPS、ARM、i386、SPARC、PPC等)。每一個(gè)這樣的子目錄都包含kernel/和mm/子目錄,它們包含特定于體系結(jié)構(gòu)的代碼來完成象初始化內(nèi)存、設(shè)置IRQ、啟用高速緩存、設(shè)置內(nèi)核頁面表等操作。一旦裝入內(nèi)核并給予其控制,就首先調(diào)用這些函數(shù),然后初始化系統(tǒng)的其余部分。根據(jù)可用的系統(tǒng)資源和引導(dǎo)裝載程序的功能,內(nèi)核可以編譯成vmlinux、Image或zImage。vmlinux和zImage之間的主要區(qū)別在于vmlinux是實(shí)際的(未壓縮的)可執(zhí)行文件,而zImage是或多或少包含相同信息的自解壓壓縮文件一只是壓縮它以處理(通常是Intel強(qiáng)制的)640KB引導(dǎo)時(shí)間的限制。有關(guān)所有這些的權(quán)威性解釋,請(qǐng)參閱LinuxMagazine的文章“KernelConfiguration:dealingwiththeunexpected"(請(qǐng)參閱參考資料)。內(nèi)核鏈接和裝入一旦為目標(biāo)系統(tǒng)編譯了內(nèi)核后,通過使用引導(dǎo)裝載程序(它已經(jīng)被裝入到目標(biāo)的閃存中),內(nèi)核就被裝入到目標(biāo)系統(tǒng)的內(nèi)存(在DRAM中或者在閃存中)。通過使用串行、USB或以太網(wǎng)端口,引導(dǎo)裝載程序與主機(jī)通信以將內(nèi)核傳送到目標(biāo)的閃存或DRAM中。在將內(nèi)核完全裝入目標(biāo)后,引導(dǎo)裝載程序?qū)⒖刂苽鬟f給裝入內(nèi)核的地址。內(nèi)核可執(zhí)行文件由許多鏈接在一起的對(duì)象文件組成。對(duì)象文件有許多節(jié),如文本、數(shù)據(jù)、init數(shù)據(jù)、bass等等。這些對(duì)象文件都是由一個(gè)稱為鏈接器腳本的文件鏈接并裝入的。這個(gè)鏈接器腳本的功能是將輸入對(duì)象文件的各節(jié)映射到輸出文件中;換句話說,它將所有輸入對(duì)象文件都鏈接到單一的可執(zhí)行文件中,將該可執(zhí)行文件的各節(jié)裝入到指定地址處。vmlinux.lds是存在于arch//目錄中的內(nèi)核鏈接器腳本,它負(fù)責(zé)鏈接內(nèi)核的各個(gè)節(jié)并將它們裝入內(nèi)存中特定偏移量處。典型的vmlinux.lds看起來象這樣:清單2.典型的vmlinux.lds文件OUTPUT_ARCH()/*includesarchitecturetype*/ENTRY(stext)/*stextisthekernelentrypoint*/SECTIONS/*SECTIONScommanddescribesthelayoutoftheoutputfile*/{.=TEXTADDR;/*TEXTADDRisLMAforthekernel*/.init:{/*Initcodeanddata*/_stext=.;/*Firstsectionisstextfollowedby__initdatasection*/__init_begin=.;*(.text.init)__init_end=.;}.text:{/*Realtextsegmentfollows__init_datasection*/_text=.;*(.text)_etext=.;/*Endoftextsection*/}.data:{data=.;/*Datasectioncomesaftertextsection*/*(.data)_edata=.;}/*Datasectionendshere*/.bss:{/*BSSsectionfollowssymboltablesection*/__bss_start=.;*(.bss)_end=.;/*BSSsectionendshere*/}}LMA是裝入模塊地址;它表示將要裝入內(nèi)核的目標(biāo)虛擬內(nèi)存中的地址。TEXTADDR是內(nèi)核的虛擬起始地址,并且在arch//下的Makefile中指定它的值。這個(gè)地址必須與引導(dǎo)裝載程序使用的地址相匹配。一旦引導(dǎo)裝載程序?qū)?nèi)核復(fù)制到閃存或DRAM中,內(nèi)核就被重新定位到TEXTADDR—它通常在DRAM中。然后,引導(dǎo)裝載程序?qū)⒖刂妻D(zhuǎn)給這個(gè)地址,以便內(nèi)核能開始執(zhí)行。參數(shù)傳遞和內(nèi)核引導(dǎo)stext是內(nèi)核入口點(diǎn),這意味著在內(nèi)核引導(dǎo)時(shí)將首先執(zhí)行這一節(jié)下的代碼。它通常用匯編語言編寫,并且通常它在arch//內(nèi)核目錄下。這個(gè)代碼設(shè)置內(nèi)核頁面目錄、創(chuàng)建身份內(nèi)核映射、標(biāo)識(shí)體系結(jié)構(gòu)和處理器以及執(zhí)行分支start_kernel(初始化系統(tǒng)的主例程)。start_kernel調(diào)用setup_arch作為執(zhí)行的第一步,在其中完成特定于體系結(jié)構(gòu)的設(shè)置。這包括初始化硬件寄存器、標(biāo)識(shí)根設(shè)備和系統(tǒng)中可用的DRAM和閃存的數(shù)量、指定系統(tǒng)中可用頁面的數(shù)目、文件系統(tǒng)大小等等。所有這些信息都以參數(shù)形式從引導(dǎo)裝載程序傳遞到內(nèi)核。將參數(shù)從引導(dǎo)裝載程序傳遞到內(nèi)核有兩種方法:parameter_structure和標(biāo)記列表。在這兩種方法中,不贊成使用參數(shù)結(jié)構(gòu),因?yàn)樗鼜?qiáng)加了限制:指定在內(nèi)存中,每個(gè)參數(shù)必須位于param_struct中的特定偏移量處。最新的內(nèi)核期望參數(shù)作為標(biāo)記列表的格式來傳遞,并將參數(shù)轉(zhuǎn)化為已標(biāo)記格式。param_struct定義在include/asm/setup.h中。它的一些重要字段是:清單3.樣本參數(shù)結(jié)構(gòu)structparam_struct{unsignedlongpage_size;/*0:Sizeofthepage*/unsignedlongnr_pages;/*4:Numberofpagesinthesystem*/unsignedlongramdisk/*8:ramdisksize*/unsignedlongrootdev;/*16:Numberrepresentingtherootdevice*/unsignedlonginitrd_start;/*64:startingaddressofinitialramdisk*//*Thiscanbeeitherinflash/dram*/unsignedlonginitrd_size;/*68:sizeofinitialramdisk*/}請(qǐng)注意:這些數(shù)表示定義字段的參數(shù)結(jié)構(gòu)中的偏移量。這意味著如果引導(dǎo)裝載程序?qū)?shù)結(jié)構(gòu)放置在地址OxcOOOOlOO,那么rootdev參數(shù)將放置在OxcOOOOlOO+16,initrd_start將放置在OxcOOOOlOO+64等等—否則,內(nèi)核將在解釋正確的參數(shù)時(shí)遇到困難。正如上面提到的,因?yàn)閺囊龑?dǎo)裝載程序到內(nèi)核的參數(shù)傳遞會(huì)有一些約束條件,所以大多數(shù)2.4.x系列內(nèi)核期望參數(shù)以已標(biāo)記的列表格式傳遞。在已標(biāo)記的列表中,每個(gè)標(biāo)記由標(biāo)識(shí)被傳遞參數(shù)的tag_header以及其后的參數(shù)值組成。標(biāo)記列表中標(biāo)記的常規(guī)格式可以如下所示:清單4.樣本標(biāo)記格式。內(nèi)核通過頭來標(biāo)識(shí)每個(gè)標(biāo)記。#definestruct{u32u32};/*Exampletagforpassingmemoryinformation*/#defineATAG_MEM0x54410002/*Magicnumber*/structtag_mem32{u32size;/*sizeofmemory*/u32start;/*physicalstartaddressofmemory*/};setup_arch還需要對(duì)閃存存儲(chǔ)庫(kù)、系統(tǒng)寄存器和其它特定設(shè)備執(zhí)行內(nèi)存映射。一旦完成了特定于體系結(jié)構(gòu)的設(shè)置,控制就返回到初始化系統(tǒng)其余部分的start_kernel函數(shù)。這些附加的初始化任務(wù)包含:設(shè)置陷阱初始化中斷初始化計(jì)時(shí)器初始化控制臺(tái)調(diào)用mem_init,它計(jì)算各種區(qū)域、高內(nèi)存區(qū)等內(nèi)的頁面數(shù)量初始化slab分配器并為VFS、緩沖區(qū)高速緩存等創(chuàng)建slab高速緩存建立各種文件系統(tǒng),如proc、ext2和JFFS2創(chuàng)建kernel_thread,它執(zhí)行文件系統(tǒng)中的init命令并顯示lign提示符。如果在/bin、/sbin或/etc中沒有init程序,那么內(nèi)核將執(zhí)行文件系統(tǒng)的/bin中的shell。設(shè)備驅(qū)動(dòng)程序嵌入式系統(tǒng)通常有許多設(shè)備用于與用戶交互,象觸摸屏、小鍵盤、滾動(dòng)輪、傳感器、RA232接口、LCD等等。除了這些設(shè)備外,還有許多其它專用設(shè)備,包括閃存、USB、GSM等。內(nèi)核通過所有這些設(shè)備各自的設(shè)備驅(qū)動(dòng)程序來控制它們,包括GUI用戶應(yīng)用程序也通過訪問這些驅(qū)動(dòng)程序來訪問設(shè)備。本節(jié)著重討論通常幾乎在每個(gè)嵌入式環(huán)境中都會(huì)使用的一些重要設(shè)備的設(shè)備驅(qū)動(dòng)程序。幀緩沖區(qū)驅(qū)動(dòng)程序這是最重要的驅(qū)動(dòng)程序之一,因?yàn)橥ㄟ^這個(gè)驅(qū)動(dòng)程序才能使系統(tǒng)屏幕顯示內(nèi)容。幀緩沖區(qū)驅(qū)動(dòng)程序通常有三層。最底層是基本控制臺(tái)驅(qū)動(dòng)程序drivers/char/console.c,它提供了文本控制臺(tái)常規(guī)接口的一部分。通過使用控制臺(tái)驅(qū)動(dòng)程序函數(shù),我們能將文本打印到屏幕上—但圖形或動(dòng)畫還不能(這樣做需要使用視頻模式功能,通常出現(xiàn)在中間層,也就是drivers/video/fbcon.c中)。這個(gè)第二層驅(qū)動(dòng)程序提供了視頻模式中繪圖的常規(guī)接口。幀緩沖區(qū)是顯卡上的內(nèi)存,需要將它內(nèi)存映射到用戶空間以便可以將圖形和文本能寫到這個(gè)內(nèi)存段上:然后這個(gè)信息將反映到屏幕上。幀緩沖區(qū)支持提高了繪圖的速度和整體性能。這也是頂層驅(qū)動(dòng)程序引人注意之處:頂層是非常特定于硬件的驅(qū)動(dòng)程序,它需要支持顯卡不同的硬件方面—象啟用/禁用顯卡控制器深度和模式的支持以及調(diào)色板等。所有這三層都相互依賴以實(shí)現(xiàn)正確的視頻功能。與幀緩沖區(qū)有關(guān)的設(shè)備是/dev/fbO(主設(shè)備號(hào)29,次設(shè)備號(hào)0)。輸入設(shè)備驅(qū)動(dòng)程序可觸摸板是用于嵌入式設(shè)備的最基本的用戶交互設(shè)備之一—小鍵盤、傳感器和滾動(dòng)輪也包含在許多不同設(shè)備中以用于不同的用途。觸摸板設(shè)備的主要功能是隨時(shí)報(bào)告用戶的觸摸,并標(biāo)識(shí)觸摸的坐標(biāo)。這通常在每次發(fā)生觸摸時(shí),通過生成一個(gè)中斷來實(shí)現(xiàn)。然后,這個(gè)設(shè)備驅(qū)動(dòng)程序的角色是每當(dāng)出現(xiàn)中斷時(shí)就查詢觸摸屏控制器,并請(qǐng)求控制器發(fā)送觸摸的坐標(biāo)。一旦驅(qū)動(dòng)程序接收到坐標(biāo),它就將有關(guān)觸摸和任何可用數(shù)據(jù)的信號(hào)發(fā)送給用戶應(yīng)用程序,并將數(shù)據(jù)發(fā)送給應(yīng)用程序(如果可能的話)。然后用戶應(yīng)用程序根據(jù)它的需要處理數(shù)據(jù)。幾乎所有輸入設(shè)備—包括小鍵盤—都以類似原理工作。閃存MTD驅(qū)動(dòng)程序MTD設(shè)備是象閃存芯片、小型閃存卡、記憶棒等之類的設(shè)備,它們?cè)谇度胧皆O(shè)備中的使用正在不斷增長(zhǎng)。MTD驅(qū)動(dòng)程序是在Linux下專門為嵌入式環(huán)境開發(fā)的新的一類驅(qū)動(dòng)程序。相對(duì)于常規(guī)塊設(shè)備驅(qū)動(dòng)程序,使用MTD驅(qū)動(dòng)程序的主要優(yōu)點(diǎn)在于MTD驅(qū)動(dòng)程序是專門為基于閃存的設(shè)備所設(shè)計(jì)的,所以它們通常有更好的支持、更好的管理和基于扇區(qū)的擦除和讀寫操作的更好的接口。Linux下的MTD驅(qū)動(dòng)程序接口被劃分為兩類模塊:用戶模塊和硬件模塊。用戶模塊這些模塊提供從用戶空間直接使用的接口:原始字符訪問、原始?jí)K訪問、FTL(閃存轉(zhuǎn)換層,F(xiàn)lashTransitionLayer—用在閃存上的一種文件系統(tǒng))和JFS(即日志文件系統(tǒng),JournaledFileSystem—在閃存上直接提供文件系統(tǒng)而不是模擬塊設(shè)備)。用于閃存的JFS的當(dāng)前版本是JFFS2(稍后將在本文中描述)。硬件模塊這些模塊提供對(duì)內(nèi)存設(shè)備的物理訪問,但并不直接使用它們。通過上述的用戶模塊來訪問它們。這些模塊提供了在閃存上讀、擦除和寫操作的實(shí)際例程。MTD驅(qū)動(dòng)程序設(shè)置為了訪問特定的閃存設(shè)備并將文件系統(tǒng)置于其上,需要將MTD子系統(tǒng)編譯到內(nèi)核中。這包括選擇適當(dāng)?shù)腗TD硬件和用戶模塊。當(dāng)前,MTD子系統(tǒng)支持為數(shù)眾多的閃存設(shè)備—并且有越來越多的驅(qū)動(dòng)程序正被添加進(jìn)來以用于不同的閃存芯片。有兩個(gè)流行的用戶模塊可啟用對(duì)閃存的訪問:MTD_CHAR和MTD_BLOCK。MTD_CHAR提供對(duì)閃存的原始字符訪問,而MTD_BLOCK將閃存設(shè)計(jì)為可以在上面創(chuàng)建文件系統(tǒng)的常規(guī)塊設(shè)備(象IDE磁盤)。與MTD_CHAR關(guān)聯(lián)的設(shè)備是/dev/mtd0、mtd1、mtd2(等等),而與MTD_BLOCK關(guān)聯(lián)的設(shè)備是/dev/mtdblockO、mtdblockl(等等)。由于MTD_BLOCK設(shè)備提供象塊設(shè)備那樣的模擬,通常更可取的是在這個(gè)模擬基礎(chǔ)上創(chuàng)建象FTL和JFFS2那樣的文件系統(tǒng)。為了進(jìn)行這個(gè)操作,可能需要?jiǎng)?chuàng)建分區(qū)表將閃存設(shè)備分拆到引導(dǎo)裝載程序節(jié)、內(nèi)核節(jié)和文件系統(tǒng)節(jié)中。樣本分區(qū)表可能包含以下信息:清單5.MTD的簡(jiǎn)單閃存設(shè)備分區(qū)structmtd_partitionsample_partition={{/*Firstpartition*/name:bootloader,/*Bootloadersection*/size:0x00010000,/*Size*/offset:0,/*Offsetfromstartofflash-location0x0*/mask_flags:MTD_WRITEABLE/*Thispartitionisnotwritable*/},{/*Secondpartition*/name:Kernel,/*Kernelsection*/size:0x00100000,/*Size*/offset:MTDPART_OFS_APPEND,/*Appendafterbootloadersection*/mask_flags:MTD_WRITEABLE/*Thispartitionisnotwritable*/},{/*Thirdpartition*/name:JFFS2,/*JFFS2filesystem*/size:MTDPART_SIZ_FULL,/*Occupyrestofflash*/offset:MTDPART_OFS_APPEND/*Appendafterkernelsection*/}上面的分區(qū)表使用了MTD_BLOCK接口對(duì)閃存設(shè)備進(jìn)行分區(qū)。這些分區(qū)的設(shè)備節(jié)點(diǎn)是:簡(jiǎn)單閃存分區(qū)的設(shè)備節(jié)點(diǎn)UserdevicenodeMajornumberMinornumberBootloader/dev/mtdblock0310Kernel/dev/mtdblock1311Filesystem/dev/mtdblock2312在本例中,引導(dǎo)裝載程序必須將有關(guān)root設(shè)備節(jié)點(diǎn)(/dev/mtdblock2)和可以在閃存中找到文件系統(tǒng)的地址(本例中是FLASH_BASE_ADDRESS+0x04000000)的正確參數(shù)傳遞到內(nèi)核。一旦完成分區(qū),閃存設(shè)備就準(zhǔn)備裝入或掛裝文件系統(tǒng)。Linux中MTD子系統(tǒng)的主要目標(biāo)是在系統(tǒng)的硬件驅(qū)動(dòng)程序和上層,或用戶模塊之間提供通用接口。硬件驅(qū)動(dòng)程序不需要知道象JFFS2和FTL那樣的用戶模塊使用的方法。所有它們真正需要提供的就是一組對(duì)底層閃存系統(tǒng)進(jìn)行read、write和erase操作的簡(jiǎn)單例程。嵌入式設(shè)備的文件系統(tǒng)系統(tǒng)需要一種以結(jié)構(gòu)化格式存儲(chǔ)和檢索信息的方法;這就需要文件系統(tǒng)的參與。Ramdisk(請(qǐng)參閱參考資料)是通過將計(jì)算機(jī)的RAM用作設(shè)備來創(chuàng)建和掛裝文件系統(tǒng)的一種機(jī)制,它通常用于無盤系統(tǒng)(當(dāng)然包括微型嵌入式設(shè)備,它只包含作為永久存儲(chǔ)媒質(zhì)的閃存芯片)。用戶可以根據(jù)可*性、健壯性和/或增強(qiáng)的功能的需求來選擇文件系統(tǒng)的類型。下一節(jié)將討論幾個(gè)可用選項(xiàng)及其優(yōu)缺點(diǎn)。第二版擴(kuò)展文件系統(tǒng)(Ext2fs)Ext2fs是Linux事實(shí)上的標(biāo)準(zhǔn)文件系統(tǒng),它已經(jīng)取代了它的前任—擴(kuò)展文件系統(tǒng)(或Extfs)。Extfs支持的文件大小最大為2GB,支持的最大文件名稱大小為255個(gè)字符一而且它不支持索引節(jié)點(diǎn)(包括數(shù)據(jù)修改時(shí)間標(biāo)記)。Ext2fs做得更好;它的優(yōu)點(diǎn)是:Ext2fs支持達(dá)4TB的內(nèi)存。Ext2fs文件名稱最長(zhǎng)可以到1012個(gè)字符。當(dāng)創(chuàng)建文件系統(tǒng)時(shí),管理員可以選擇邏輯塊的大小(通常大小可選擇1024、2048和4096字節(jié))。Ext2fs了實(shí)現(xiàn)快速符號(hào)鏈接:不需要為此目的而分配數(shù)據(jù)塊,并且將目標(biāo)名稱直接存儲(chǔ)在索引節(jié)點(diǎn)(inode)表中。這使性能有所提高,特別是在速度上。因?yàn)镋xt2文件系統(tǒng)的穩(wěn)定性、可*性和健壯性,所以幾乎在所有基于Linux的系統(tǒng)(包括臺(tái)式機(jī)、服務(wù)器和工作站—并且甚至一些嵌入式設(shè)備)上都使用Ext2文件系統(tǒng)。然而,當(dāng)在嵌入式設(shè)備中使用Ext2fs時(shí),它有一些缺點(diǎn):Ext2fs是為象IDE設(shè)備那樣的塊設(shè)備設(shè)計(jì)的,這些設(shè)備的邏輯塊大小是512字節(jié),1K字節(jié)等這樣的倍數(shù)。這不太適合于扇區(qū)大小因設(shè)備不同而不同的閃存設(shè)備。Ext2文件系統(tǒng)沒有提供對(duì)基于扇區(qū)的擦除/寫操作的良好管理。在Ext2fs中,為了在一個(gè)扇區(qū)中擦除單個(gè)字節(jié),必須將整個(gè)扇區(qū)復(fù)制到RAM,然后擦除,然后重寫入??紤]到閃存設(shè)備具有有限的擦除壽命(大約能進(jìn)行100,000次擦除),在此之后就不能使用它們,所以這不是一個(gè)特別好的方法。在出現(xiàn)電源故障時(shí),Ext2fs不是防崩潰的。Ext2文件系統(tǒng)不支持損耗平衡,因此縮短了扇區(qū)/閃存的壽命。(損耗平衡確保將地址范圍的不同區(qū)域輪流用于寫和/或擦除操作以延長(zhǎng)閃存設(shè)備的壽命。)Ext2fs沒有特別完美的扇區(qū)管理,這使設(shè)計(jì)塊驅(qū)動(dòng)程序十分困難。由于這些原因,通常相對(duì)于Ext2fs,在嵌入式環(huán)境中使用MTD/JFFS2組合是更好的選擇。用Ramdisk掛裝Ext2fs通過使用Ramdisk的概念,可以在嵌入式設(shè)備中創(chuàng)建并掛裝Ext2文件系統(tǒng)(以及用于這一目的的任何文件系統(tǒng))。清單6.創(chuàng)建一個(gè)簡(jiǎn)單的基于Ext2fs的Ramdiskmke2fs-vm0/dev/ram4096mount-text2/dev/ram/mntcd/mntcp/bin,/sbin,/etc,/dev...filesinmntcd../umount/mntddif=/dev/rambs=1kcount=4096of=ext2ramdiskmke2fs是用于在任何設(shè)備上創(chuàng)建ext2文件系統(tǒng)的實(shí)用程序—它創(chuàng)建超級(jí)塊、索引節(jié)點(diǎn)以及索引節(jié)點(diǎn)表等等。在上面的用法中,/dev/ram是上面構(gòu)建有4096個(gè)塊的ext2文件系統(tǒng)的設(shè)備。然后,將這個(gè)設(shè)備(/dev/ram)掛裝在名為/mnt的臨時(shí)目錄上并且復(fù)制所有必需的文件。一旦復(fù)制完這些文件,就卸裝這個(gè)文件系統(tǒng)并且設(shè)備(/dev/ram)的內(nèi)容被轉(zhuǎn)儲(chǔ)到一個(gè)文件(ext2ramdisk)中,它就是所需的Ramdisk(Ext2文件系統(tǒng))。上面的順序創(chuàng)建了一個(gè)4MB的Ramdisk,并用必需的文件實(shí)用程序來填充它。一些要包含在Ramdisk中的重要目錄是:/bin—保存大多數(shù)象init、busybox、shell、文件管理實(shí)用程序等二進(jìn)制文件。/dev—包含用在設(shè)備中的所有設(shè)備節(jié)點(diǎn)/etc—包含系統(tǒng)的所有配置文件/lib—包含所有必需的庫(kù),如libc、libdl等日志閃存文件系統(tǒng),版本2(JFFS2)瑞典的AxisCommunications開發(fā)了最初的JFFS,RedHat的DavidWoodhouse對(duì)它進(jìn)行了改進(jìn)。第二個(gè)版本,JFFS2,作為用于微型嵌入式設(shè)備的原始閃存芯片的實(shí)際文件系統(tǒng)而出現(xiàn)。JFFS2文件系統(tǒng)是日志結(jié)構(gòu)化的,這意味著它基本上是一長(zhǎng)列節(jié)點(diǎn)。每個(gè)節(jié)點(diǎn)包含有關(guān)文件的部分信息—可能是文件的名稱、也許是一些數(shù)據(jù)。相對(duì)于Ext2fs,JFFS2因?yàn)橛幸韵逻@些優(yōu)點(diǎn)而在無盤嵌入式設(shè)備中越來越受歡迎:JFFS2在扇區(qū)級(jí)別上執(zhí)行閃存擦除/寫/讀操作要比Ext2文件系統(tǒng)好。JFFS2提供了比Ext2fs更好的崩潰/掉電安全保護(hù)。當(dāng)需要更改少量數(shù)據(jù)時(shí),Ext2文件系統(tǒng)將整個(gè)扇區(qū)復(fù)制到內(nèi)存(DRAM)中,在內(nèi)存中合并新數(shù)據(jù),并寫回整個(gè)扇區(qū)。這意味著為了更改單個(gè)字,必須對(duì)整個(gè)扇區(qū)(64KB)執(zhí)行讀/擦除/寫例程一這樣做的效率非常低。要是運(yùn)氣差,當(dāng)正在DRAM中合并數(shù)據(jù)時(shí),發(fā)生了電源故障或其它事故,那么將丟失整個(gè)數(shù)據(jù)集合,因?yàn)樵趯?shù)據(jù)讀入DRAM后就擦除了閃存扇區(qū)。JFFS2附加文件而不是重寫整個(gè)扇區(qū),并且具有崩潰/掉電安全保護(hù)這一功能。這可能是最重要的一點(diǎn):JFFS2是專門為象閃存芯片那樣的嵌入式設(shè)備創(chuàng)建的,所以它的整個(gè)設(shè)計(jì)提供了更好的閃存管理。因?yàn)楸疚闹饕菍戧P(guān)于閃存設(shè)備的使用,所以在嵌入式環(huán)境中使用JFFS2的缺點(diǎn)很少:當(dāng)文件系統(tǒng)已滿或接近滿時(shí),JFFS2會(huì)大大放慢運(yùn)行速度。這是因?yàn)槔占膯栴}(更多信息,請(qǐng)參閱參考資料)。創(chuàng)建JFFS2文件系統(tǒng)在Linux下,用mkfs.jffs2命令創(chuàng)建JFFS2文件系統(tǒng)(基本上是使用JFFS2的Ramdisk)。清單7.創(chuàng)建JFFS2文件系統(tǒng)mkdirjffsfilecdjffsfile/*copyallthe/bin,/etc,/usr/bin,/sbin/binariesand/deventriesthatareneededforthefilesystemhere*//*TypethefollowingcommandunderjffsfiledirectorytocreatetheJFFS2Image*/./mkfs.jffs2-e0x40000-p-o../jffs.image上面顯示了mkfs.jffs2的典型用法。-e選項(xiàng)確定閃存的擦除扇區(qū)大?。ㄍǔJ?4千字節(jié))。-p選項(xiàng)用來在映像的剩余空間用零填充。-o選項(xiàng)用于輸出文件,通常是JFFS2文件系統(tǒng)映像—在本例中是jffs.image。一旦創(chuàng)建了JFFS2文件系統(tǒng),它就被裝入閃存中適當(dāng)?shù)奈恢茫ㄒ龑?dǎo)裝載程序告知內(nèi)核查找文件系統(tǒng)的地址)以便內(nèi)核能掛裝它。tmpfs當(dāng)Linux運(yùn)行于嵌入式設(shè)備上時(shí),該設(shè)備就成為功能齊全的單元,許多守護(hù)進(jìn)程會(huì)在后臺(tái)運(yùn)行并生成許多日志消息。另外,所有內(nèi)核日志記錄機(jī)制,象syslogd、dmesg和klogd,會(huì)在/var和/tmp目錄下生成許多消息。由于這些進(jìn)程產(chǎn)生了大量數(shù)據(jù),所以允許將所有這些寫操作都發(fā)生在閃存是不可取的。由于在重新引導(dǎo)時(shí)這些消息不需要持久存儲(chǔ),所以這個(gè)問題的解決方案是使用tmpfs。tmpfs是基于內(nèi)存的文件系統(tǒng),它主要用于減少對(duì)系統(tǒng)的不必要的閃存寫操作這一唯一目的。因?yàn)閠mpfs駐留在RAM中,所以寫/讀/擦除的操作發(fā)生在RAM中而不是在閃存中。因此,日志消息寫入RAM而不是閃存中,在重新引導(dǎo)時(shí)不會(huì)保留它們。tmpfs還使用磁盤交換空間來存儲(chǔ),并且當(dāng)為存儲(chǔ)文件而請(qǐng)求頁面時(shí),使用虛擬內(nèi)存(VM)子系統(tǒng)。tmpfs的優(yōu)點(diǎn)包括:動(dòng)態(tài)文件系統(tǒng)大小—文件系統(tǒng)大小可以根據(jù)被復(fù)制、創(chuàng)建或刪除的文件或目錄的數(shù)量來縮放。使得能夠最理想地使用內(nèi)存。速度一因?yàn)閠mpfs駐留在RAM,所以讀和寫幾乎都是瞬時(shí)的。即使以交換的形式存儲(chǔ)文件,I/O操作的速度仍非常快。tmpfs的一個(gè)缺點(diǎn)是當(dāng)系統(tǒng)重新引導(dǎo)時(shí)會(huì)丟失所有數(shù)據(jù)。因此,重要的數(shù)據(jù)不能存儲(chǔ)在tmpfs上。掛裝tmpfs諸如Ext2fs和JFFS2等大多數(shù)其它文件系統(tǒng)都駐留在底層塊設(shè)備之上,而tmpfs與它們不同,它直接位于VM上。因而,掛裝tmpfs文件系統(tǒng)是很簡(jiǎn)單的事:清單8.掛裝tmpfs/*Entriesin/etc/rc.d/rc.sysinitforcreating/usingtmpfs*/#mount-ttmpfstmpfs/var-osize=512k#mkdir-p/var/tmp#mkdir-p/var/log#ln-s/var/tmp/tmp上面的命令將在/var上創(chuàng)建tmpfs并將tmpfs的最大大小限制為512K。同時(shí),tmp/和log/目錄成為tmpfs的一部分以便在RAM中存儲(chǔ)日志消息。如果您想將tmpfs的一個(gè)項(xiàng)添加到/etc/fstab,那么它可能看起來象這樣:tmpfs/vartmpfssize=32m00這將在/var上掛裝一個(gè)新的tmpfs文件系統(tǒng)。圖形用戶界面(GUI)選項(xiàng)從用戶的觀點(diǎn)來看,圖形用戶界面(GUI)是系統(tǒng)的一個(gè)最至關(guān)重要的方面:用戶通過GUI與系統(tǒng)進(jìn)行交互。所以GUI應(yīng)該易于使用并且非???。但它還需要是有內(nèi)存意識(shí)的,以便在內(nèi)存受限的、微型嵌入式設(shè)備上可以無縫執(zhí)行。所以,它應(yīng)該是輕量級(jí)的,并且能夠快速裝入。另一個(gè)要考慮的重要方面涉及許可證問題。一些GUI分發(fā)版具有允許免費(fèi)使用的許可證,甚至在一些商業(yè)產(chǎn)品中也是如此。另一些許可證要求如果想將GUI合并入項(xiàng)目中則要支付版稅。最后,大多數(shù)開發(fā)人員可能會(huì)選擇XFree86,因?yàn)閄Free86為他們提供了一個(gè)能使用他們喜歡的工具的熟悉環(huán)境。但是市場(chǎng)上較新的GUI,象CenturySoftware的Microwindows(Nano-X)和Trolltech的QT/Embedded,與X在嵌入式Linux的競(jìng)技舞臺(tái)中展開了激烈競(jìng)爭(zhēng),這主要是因?yàn)樗鼈冋加煤苌俚馁Y源、執(zhí)行的速度很快并且具有定制窗口構(gòu)件的支持。讓我們看一看這些選項(xiàng)中的每一個(gè)。Xfree864.X(帶幀緩沖區(qū)支持的X11R6.4)XFree86Project,Inc.是一家生產(chǎn)XFree86的公司,該產(chǎn)品是一個(gè)可以免費(fèi)重復(fù)分發(fā)、開放源碼的XWindow系統(tǒng)OXWindow系統(tǒng)(XII)為應(yīng)用程序以圖形方式進(jìn)行顯示提供了資源,并且它是UNIX和類UNIX的機(jī)器上最常用的窗口系統(tǒng)。它很小但很有效,它運(yùn)行在為數(shù)眾多的硬件上,它對(duì)網(wǎng)絡(luò)透明并且有良好的文檔說明。X11為窗口管理、事件處理、同步和客戶機(jī)間通信提供強(qiáng)大的功能一并且大多數(shù)開發(fā)人員已經(jīng)熟悉了它的API。它具有對(duì)內(nèi)核幀緩沖區(qū)的內(nèi)置支持,并占用非常少的資源一這非常有助于內(nèi)存相對(duì)較少的設(shè)備。X服務(wù)器支持VGA和非VGA圖形卡,它對(duì)顏色深度1、2、4、8、16和32提供支持,并對(duì)渲染提供內(nèi)置支持。最新的發(fā)行版是XFree864.1.0。它的優(yōu)點(diǎn)包括:幀緩沖區(qū)體系結(jié)構(gòu)的使用提高了性能。占用的資源相對(duì)很小—大小在600K到700K字節(jié)的范圍內(nèi),這使它很容易在小型設(shè)備上運(yùn)行非常好的支持:在線有許多文檔可用,還有許多專用于XFree86開發(fā)的郵遞列表。XAPI非常適合擴(kuò)展。它的缺點(diǎn)包括:比最近出現(xiàn)的嵌入式GUI工具性能差。此外,當(dāng)與GUI中最新的開發(fā)—象專門為嵌入式環(huán)境設(shè)計(jì)的Nano-X或QT/Embedded—相比時(shí)XFree86似乎需要更多的內(nèi)存。MicrowindowsMicrowindows是CenturySoftware的開放源代碼項(xiàng)目,設(shè)計(jì)用于帶小型顯示單元的微型設(shè)備。它有許多針對(duì)現(xiàn)代圖形視窗環(huán)境的功能部件。象X一樣,有多種平臺(tái)支持Microwindows。Microwindows體系結(jié)構(gòu)是基于客戶機(jī)/服務(wù)器的并且具有分層設(shè)計(jì)。最底層是屏幕和輸入設(shè)備驅(qū)動(dòng)程序(關(guān)于鍵盤或鼠標(biāo))來與實(shí)際硬件交互。在中間層,可移植的圖形引擎提供對(duì)線的繪制、區(qū)域的填充、多邊形、裁剪以及顏色模型的支持。在最上層,Microwindows支持兩種API:Win32/WinCEAPI實(shí)現(xiàn),稱為Microwindows;另一種API與GDK非常相似,它稱為Nano-X。Nano-X用在Linux上。它是象X的API,用于占用資源少的應(yīng)用程序。Microwindows支持1、2、4和8bpp(每像素的位數(shù))的palletized顯示,以及8、16、24和32bpp的真彩色顯示。Microwindows還支持使它速度更快的幀緩沖區(qū)。Nano-X服務(wù)器占用的資源大約在100K到150K字節(jié)。原始Nano-X應(yīng)用程序的平均大小在30K到60K。由于Nano-X是為有內(nèi)存限制的低端設(shè)備設(shè)計(jì)的,所以它不象X那樣支持很多函數(shù),因此它實(shí)際上不能作為微型X(Xfree864.1)的替代品??梢栽贛icrowindows上運(yùn)行FLNX,它是針對(duì)Nano-X而不是X進(jìn)行修改的FLTK(快速輕巧工具箱(FastLightToolkit))應(yīng)用程序開發(fā)環(huán)境的一個(gè)版本。本文中描述FLTK。Nano-X的優(yōu)點(diǎn)包括:與Xlib實(shí)現(xiàn)不同,Nano-X仍在每個(gè)客戶機(jī)上同步運(yùn)行,這意味著一旦發(fā)送了客戶機(jī)請(qǐng)求包,服務(wù)器在為另一個(gè)客戶機(jī)提供服務(wù)之前一直等待,直到整個(gè)包都到達(dá)為止。這使服務(wù)器代碼非常簡(jiǎn)單,而運(yùn)行的速度仍非常快。占用很小的資源Nano-X的缺點(diǎn)包括:聯(lián)網(wǎng)功能部件至今沒有經(jīng)過適當(dāng)?shù)卣{(diào)整(特別是網(wǎng)絡(luò)透明性)。還沒有太多現(xiàn)成的應(yīng)用程序可用。與X相比,Nano-x雖然近來正在加速開發(fā),但仍沒有那么多文檔說明而且沒有很好的支持,但這種情形會(huì)有所改變。Microwindows上的FLTKAPIFLTK是一個(gè)簡(jiǎn)單但靈活的GUI工具箱,它在Linux世界中贏得越來越多的關(guān)注,它特別適用于占用資源很少的環(huán)境。它提供了您期望從GUI工具箱中獲得的大多數(shù)窗口構(gòu)件,如按鈕、對(duì)話框、文本框以及出色的“賦值器”選擇(用于輸入數(shù)值的窗口構(gòu)件)。還包括滑動(dòng)器、滾動(dòng)條、刻度盤和其它一些構(gòu)件。針對(duì)MicrowindowsGUI引擎的FLTK的Linux版本被稱為FLNX。FLNX由兩個(gè)組件構(gòu)成:Fl_Widget和FLUID。Fl_Widget由所有基本窗口構(gòu)件API組成。FLUID(快速輕巧的用戶界面設(shè)計(jì)器(FastLightUserInterfaceDesigner,FLUID))是用來產(chǎn)生FLTK源代碼的圖形編輯器??偟膩碚f,F(xiàn)LNX是能用來為嵌入式環(huán)境創(chuàng)建應(yīng)用程序的一個(gè)出色的UI構(gòu)建器。Fl_Widget占用的資源大約是40K到48K,而FLUID(包括了每個(gè)窗口構(gòu)件)大約占用380K。這些非常小的資源占用率使Fl_Widget和FLUID在嵌入式開發(fā)世界中非常受歡迎。優(yōu)點(diǎn)包括:習(xí)慣于在象Windows這樣已建立得較好的環(huán)境中開發(fā)基于GUI的應(yīng)用程序的任何人都會(huì)非常容易地適應(yīng)FLTK環(huán)境。它的文檔包括一本十分完整且編寫良好的手冊(cè)。它使用LGPL進(jìn)行分發(fā),所以開發(fā)人員可以靈活地發(fā)放他們應(yīng)用程序的許可證。FLTK是一個(gè)C++庫(kù)(Perl和Python綁定也可用)。面向?qū)ο竽P偷倪x擇是一個(gè)好的選擇,因?yàn)榇蠖鄶?shù)現(xiàn)代GUI環(huán)境都是面向?qū)ο蟮?;這也使將編寫的應(yīng)用程序移植到類似的API中變得更容易。CenturySoftware的環(huán)境提供了幾個(gè)有用的工具,諸如ScreenToP和ViewML瀏覽器。它的缺點(diǎn)是:普通的FLTK可以與X和WindowsAPI一同工作,而FLNX不能。它與X的不兼容性阻礙了它在許多項(xiàng)目中的使用。Qt/EmbeddedQt/Embedded是Trolltech新開發(fā)的用于嵌入式Linux的圖形用戶界面系統(tǒng)。Trolltech最初創(chuàng)建Qt作為跨平臺(tái)的開發(fā)工具用于Linux臺(tái)式機(jī)。它支持各種有UNIX特點(diǎn)的系統(tǒng)以及MicrosoftWindows。KDE—最流行的Linux桌面環(huán)境之一,就是用Qt編寫的。Qt/Embedded以原始Qt為基礎(chǔ),并做了許多出色的調(diào)整以適用于嵌入式環(huán)境。QtEmbedded通過QtAPI與LinuxI/O設(shè)施直接交互。那些熟悉并已適應(yīng)了面向?qū)ο缶幊痰娜藛T將發(fā)現(xiàn)它是一個(gè)理想環(huán)境。而且,面向?qū)ο蟮捏w系結(jié)構(gòu)使代碼結(jié)構(gòu)化、可重用并且運(yùn)行快速。與其它GUI相比,QtGUI非常快,并且它沒有分層,這使得Qt/Embedded成為用于運(yùn)行基于Qt的程序的最緊湊環(huán)境。Trolltech還推出了Qt掌上機(jī)環(huán)境(QtPalmtopEnvironment,俗稱Qpe)。Qpe提供了一個(gè)基本桌面窗口,并且該環(huán)境為開發(fā)提供了一個(gè)易于使用的界面。 Qpe包含全套的個(gè)人信息管理(PersonalInformationManagement(PIM))應(yīng)用程序、因特網(wǎng)客戶機(jī)、實(shí)用程序等等。然而,為了將Qt/Embedded或Qpe集成到一個(gè)產(chǎn)品中,需要從Trolltech獲得商業(yè)許可證。(原始Qt自版本2.2以后就可以根據(jù)GPL獲得。)它的優(yōu)點(diǎn)包括:面向?qū)ο蟮捏w系結(jié)構(gòu)有助于更快地執(zhí)行占用很少的資源,大約800K抗鋸齒文本和混合視頻的象素映射它的缺點(diǎn)是:Qt/Embedded和Qpe只能在獲得商業(yè)許可證的情況下才能使用。結(jié)束語嵌入式Linux開發(fā)正迅速地發(fā)展著。您必須學(xué)習(xí)并從引導(dǎo)裝載程序和分發(fā)版到文件系統(tǒng)和GUI中的每一個(gè)事物的各種選項(xiàng)中作出選擇。但是要感謝有這種選擇自由度以及非?;钴S的Linux社區(qū),Linux上的嵌入式開發(fā)已經(jīng)達(dá)到了新的境界,并且調(diào)整模塊以適合您的規(guī)范從未比現(xiàn)在更簡(jiǎn)單。這已經(jīng)導(dǎo)致出現(xiàn)了許多時(shí)新的手持和微型設(shè)備作為開放盒,這是件好事—因?yàn)槭聦?shí)是您不必成為一個(gè)專家從這些模塊中進(jìn)行選擇來調(diào)整您的設(shè)備以滿足您自己的要求和需要。寫給Linux內(nèi)核新手-關(guān)于Linux內(nèi)核學(xué)習(xí)的誤區(qū)先說句正經(jīng)的:其實(shí)我沒資格寫這篇文章,因?yàn)樽约阂簿鸵粌蓚€(gè)月以來才開始有所領(lǐng)悟的。因此,這里與其說是關(guān)于Linux內(nèi)核學(xué)習(xí)的經(jīng)驗(yàn),不如說是自己的教訓(xùn)吧,希望不要扔雞蛋砸我人_人常常有人問:我想學(xué)習(xí)內(nèi)核,需要什么基礎(chǔ)嗎?LinusTorvalds本人是這樣回答的:你必須使用過Linux。這個(gè)還是有點(diǎn)太泛了吧,我想下面幾個(gè)基礎(chǔ)可能還是需要的,盡管不一定必需:關(guān)于操作系統(tǒng)理論的最初級(jí)的知識(shí)。不需要通讀并理解《操作系統(tǒng)概念》《現(xiàn)代操作系統(tǒng)》等巨著,但總要知道分時(shí)(time-shared)和實(shí)時(shí)(real-time)的區(qū)別是什么,進(jìn)程是個(gè)什么東西,CPU和系統(tǒng)總線、內(nèi)存的關(guān)系(很粗略即可),等等。關(guān)于C語言。不需要已經(jīng)很精通C語言,只要能熟練編寫C程序,能看懂鏈表、散列表等數(shù)據(jù)結(jié)構(gòu)的C實(shí)現(xiàn),用過gcc編譯器,就可以了。當(dāng)然,如果已經(jīng)精通C語言顯然是大占便宜的。關(guān)于CPU的知識(shí)。這塊兒可以在學(xué)習(xí)內(nèi)核過程中補(bǔ),但這樣的話你就需要看講解很詳細(xì)的書,比方后面將會(huì)提到的《情景分析》你是否熟悉Intel80386CPU?嘗試著回答這幾個(gè)問題來判斷一下:1)說出80386的中斷門和陷阱門的區(qū)別;2)說出保護(hù)模式與實(shí)模式的區(qū)別;3)多處理器機(jī)器上,普通的讀-改-寫回一塊內(nèi)存這樣的動(dòng)作,為什么需要特殊的手段來保護(hù)。等等。講解基于其它CPU的Linux內(nèi)核的書,目前好象只有一本《IA64Linux內(nèi)核:設(shè)計(jì)與實(shí)現(xiàn)》——也還是Intel的,其它都是講解基于IA32的。以上算是知識(shí)方面吧,如果還要再補(bǔ)充一條,我想就是:動(dòng)手編譯過內(nèi)核。好了,我們接下來走。好多人裝上Linux之后,第一件事找到內(nèi)核源碼所在的路徑,打開一個(gè)C程序文件,開始嘩嘩嘩翻頁,看看大名鼎鼎的Linux內(nèi)核代碼到底長(zhǎng)啥模樣——然后關(guān)閉。這是可理解的,但卻不是學(xué)習(xí)的方法。剛開始,必須從讀書入手。至少要對(duì)內(nèi)核有一個(gè)Overview之后,才有可能帶著問題去試圖閱讀源代碼本身。下面就講一下我讀過的幾本書:1,《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》,英文名LinuxKernelDevelopment(所以有人叫它LKD),機(jī)械工業(yè)出版社,壬35,美國(guó)RobertLove著,陳莉君譯者。評(píng)說:此書是當(dāng)今首屈一指的入門最佳圖書。作者是為2.6內(nèi)核加入了搶占的人,對(duì)調(diào)度部分非常精通,而調(diào)度是整個(gè)系統(tǒng)的核心,因此本書是很權(quán)威的。這本書講解淺顯易懂,全書沒有列舉一條匯編語句,但是給出了整個(gè)Linux操作系統(tǒng)2.6內(nèi)核的概觀,使你能通過閱讀迅速獲得一個(gè)overview。而且對(duì)內(nèi)核中較為混亂的部分(如下半部),它的講解是最透徹的。對(duì)沒怎么深入內(nèi)核的人來說,這是強(qiáng)烈推薦的一本書。翻譯:翻譯水平、負(fù)責(zé)任程度都不錯(cuò),但是印刷存在一些錯(cuò)誤。買了此書的朋友可以參考我在Linux高級(jí)應(yīng)用版的《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)中文版勘誤》:/forum/viewtopic.php?t=541234另外,此書2005年有了第二版,目前尚無中譯本面世。我就是對(duì)照著2nd-en勘誤lst-cn的?!禠inux內(nèi)核源代碼情景分析》上、下。毛德操、胡希明著,浙江大學(xué)出版社,上冊(cè)¥80,下冊(cè)¥70.評(píng)說:本書是基于2.4.0內(nèi)核的,比較早,也沒聽說會(huì)出第二版。上冊(cè)講解內(nèi)存管理、中斷、異常與系統(tǒng)調(diào)用、進(jìn)程控制、文件系統(tǒng)與傳統(tǒng)UnixIPC;下冊(cè)講解socket、設(shè)備驅(qū)動(dòng)、SMP和引導(dǎo)。關(guān)于這套書的評(píng)價(jià)褒貶不一,我個(gè)人認(rèn)為其深度是同類著作中最優(yōu)秀的。本書基于IntelIA32體系,由于厚度大,很多體系上的知識(shí)都捎帶講解了,所以如果你想深入了解內(nèi)核的工作機(jī)制而又不非常熟悉IntelCPU的體系構(gòu)造,本書是最合適的。缺點(diǎn)是:版本較老,沒有TCP/IP協(xié)議棧部分(它講的socket只是Unix域協(xié)議的),圖表太少,不適合初學(xué)者入門。還有就是對(duì)學(xué)生朋友來說,可能書價(jià)偏高,這樣的話可以考慮先買上冊(cè),因?yàn)樯蟽?cè)是核心部分,下冊(cè)一大部分都在講具體PCI/ISA/USB設(shè)備的驅(qū)動(dòng)。翻譯:沒什么翻譯,作者是國(guó)人,而且行文流暢。本人書桌上諸多計(jì)算機(jī)經(jīng)典圖書當(dāng)中,這套是唯一又經(jīng)典又無閱讀障礙的。內(nèi)核版好

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論