級別: 初級
Anand K Santhanam (asanthan@in.ibm.com), 軟件工程師, IBM Global Services Vishal Kulkarni (kvishal@in.ibm.com), 軟件工程師, IBM Global Services
2002 年 3 月 01 日
如
果您剛接觸嵌入式開發(fā),那么大量可用的引導(dǎo)裝載程序(bootloader)、規(guī)模縮小的分發(fā)版(distribution)、文件系統(tǒng)和 GUI
看起來可能太多了。但是這些豐富的選項實際上是一種恩賜,允許您調(diào)整開發(fā)或用戶環(huán)境以完全符合您的需要。對 Linux
嵌入式開發(fā)的概述將幫助您理解所有這些選項。
Linux 正在嵌入式開發(fā)領(lǐng)域穩(wěn)步發(fā)展。因為 Linux 使用 GPL(請參閱本文后面的
參考資料),
所以任何對將 Linux 定制于 PDA、掌上機或者可佩帶設(shè)備感興趣的人都可以從因特網(wǎng)免費下載其內(nèi)核和應(yīng)用程序,并開始移植或開發(fā)。許多
Linux 改良品種迎合了嵌入式/實時市場。它們包括 RTLinux(實時 Linux)、uclinux(用于非 MMU 設(shè)備的
Linux)、Montavista Linux(用于 ARM、MIPS、PPC 的 Linux 分發(fā)版)、ARM-Linux(ARM 上的
Linux)和其它 Linux 系統(tǒng)(請參閱 參考資料以鏈接到本文中提到的這些和其它術(shù)語及產(chǎn)品。)
嵌
入式 Linux 開發(fā)大致涉及三個層次:引導(dǎo)裝載程序、Linux 內(nèi)核和圖形用戶界面(或稱
GUI)。在本文中,我們將集中討論涉及這三層的一些基本概念;深入了解引導(dǎo)裝載程序、內(nèi)核和文件系統(tǒng)是如何交互的;并將研究可用于文件系統(tǒng)、GUI
和引導(dǎo)裝載程序的眾多選項中的一部分。
引導(dǎo)裝載程序
引
導(dǎo)裝載程序通常是在任何硬件上執(zhí)行的第一段代碼。在象臺式機這樣的常規(guī)系統(tǒng)中,通常將引導(dǎo)裝載程序裝入主引導(dǎo)記錄(Master Boot
Record,(MBR))中,或者裝入 Linux 駐留的磁盤的第一個扇區(qū)中。通常,在臺式機或其它系統(tǒng)上,BIOS
將控制移交給引導(dǎo)裝載程序。這就提出了一個有趣的問題:誰將引導(dǎo)裝載程序裝入(在大多數(shù)情況中)沒有 BIOS 的嵌入式設(shè)備上呢?
解決這個問題有兩種常規(guī)技術(shù):專用軟件和微小的引導(dǎo)代碼(tiny bootcode)。
專用軟件可以直接與遠程系統(tǒng)上的閃存設(shè)備進行交互并將引導(dǎo)裝載程序安裝在閃存的給定位置中。
閃存設(shè)備是與存儲設(shè)備功能類似的特殊芯片,而且它們能持久存儲信息 ― 即,在重新引導(dǎo)時不會擦除其內(nèi)容。
這個軟件使用目標(在嵌入式開發(fā)中,嵌入式設(shè)備通常被稱為
目標)上的 JTAG 端口,它是用于執(zhí)行外部輸入(通常來自主機機器)的指令的接口。JFlash-linux 是一種用于直接寫閃存的流行工具。它支持為數(shù)眾多的閃存芯片;它在主機機器(通常是 i386 機器 ― 本文中我們把一臺 i386 機器稱為
主機)上執(zhí)行并通過 JTAG 接口使用并行端口訪問目標的閃存芯片。當然,這意味著目標需要有一個并行接口使它能與主機通信。Jflash-linux 在 Linux 和 Windows 版本中都可使用,可以在命令行中用以下命令啟動它:
Jflash-linux <bootloader>
|
某些種類的嵌入式設(shè)備具有
微小的引導(dǎo)代碼― 根據(jù)幾個字節(jié)的指令 ― 它將初始化一些 DRAM 設(shè)置并啟用目標上的一個串行(或者 USB,或者以太網(wǎng))端口與主機程序通信。然后,主機程序或裝入程序可以使用這個連接將引導(dǎo)裝載程序傳送到目標上,并將它寫入閃存。
在安裝它并給予其控制后,這個引導(dǎo)裝載程序執(zhí)行下列各類功能:
- 初始化 CPU 速度
- 初始化內(nèi)存,包括啟用內(nèi)存庫、初始化內(nèi)存配置寄存器等
- 初始化串行端口(如果在目標上有的話)
- 啟用指令/數(shù)據(jù)高速緩存
- 設(shè)置堆棧指針
- 設(shè)置參數(shù)區(qū)域并構(gòu)造參數(shù)結(jié)構(gòu)和標記(這是重要的一步,因為內(nèi)核在標識根設(shè)備、頁面大小、內(nèi)存大小以及更多內(nèi)容時要使用引導(dǎo)參數(shù))
- 執(zhí)行 POST(加電自檢)來標識存在的設(shè)備并報告任何問題
- 為電源管理提供掛起/恢復(fù)支持
- 跳轉(zhuǎn)到內(nèi)核的開始
帶有引導(dǎo)裝載程序、參數(shù)結(jié)構(gòu)、內(nèi)核和文件系統(tǒng)的系統(tǒng)典型內(nèi)存布局可能如下所示:
清單 1. 典型內(nèi)存布局
/* Top Of Memory */ Bootloader Parameter Area Kernel Filesystem /* End Of Memory */
|
嵌入式設(shè)備上一些流行的并可免費使用的 Linux 引導(dǎo)裝載程序有 Blob、Redboot 和 Bootldr(請參閱
參考資料獲得鏈接)。所有這些引導(dǎo)裝載程序都用于基于 ARM 設(shè)備上的 Linux,并需要 Jflash-linux 工具用于安裝。
一旦將引導(dǎo)裝載程序安裝到目標的閃存中,它就會執(zhí)行我們上面提到的所有初始化工作。然后,它準備接收來自主機的內(nèi)核和文件系統(tǒng)。一旦裝入了內(nèi)核,引導(dǎo)裝載程序就將控制轉(zhuǎn)給內(nèi)核。
設(shè)置工具鏈
設(shè)置工具鏈在主機機器上創(chuàng)建一個用于編譯將在目標上運行的內(nèi)核和應(yīng)用程序的構(gòu)建環(huán)境 ― 這是因為目標硬件可能沒有與主機兼容的二進制執(zhí)行級別。
工具鏈由一套用于編譯、匯編和鏈接內(nèi)核及應(yīng)用程序的組件組成。 這些組件包括:
-
Binutils ― 用于操作二進制文件的實用程序集合。它們包括諸如
ar 、
as 、
objdump 、
objcopy 這樣的實用程序。
-
Gcc― GNU C 編譯器。
-
Glibc― 所有用戶應(yīng)用程序都將鏈接到的 C 庫。避免使用任何 C 庫函數(shù)的內(nèi)核和其它應(yīng)用程序可以在沒有該庫的情況下進行編譯。
構(gòu)建工具鏈建立了一個交叉編譯器環(huán)境。
本地編譯器編譯與本機同類的處理器的指令。
交叉編譯器運
行在某一種處理器上,卻可以編譯另一種處理器的指令。重頭設(shè)置交叉編譯器工具鏈可不是一項簡單的任務(wù):它包括下載源代碼、修補補丁、配置、編譯、設(shè)置頭文
件、安裝以及很多很多的操作。另外,這樣一個徹底的構(gòu)建過程對內(nèi)存和硬盤的需求是巨大的。如果沒有足夠的內(nèi)存和硬盤空間,那么在構(gòu)建階段由于相關(guān)性、配置
或頭文件設(shè)置等問題會突然冒出許多問題。
因此能夠從因特網(wǎng)上獲得已預(yù)編譯的二進制文件是一件好事(但不太好的一點是,目前它們大多數(shù)只限于基于
ARM 的系統(tǒng),但遲早會改變的)。一些比較流行的已預(yù)編譯的工具鏈包括那些來自 Compaq(Familiar Linux
)、LART(LART Linux)和 Embedian(基于 Debian 但與它無關(guān))的工具鏈 ― 所有這些工具鏈都用于基于 ARM
的平臺。
內(nèi)核設(shè)置
Linux
社區(qū)正積極地為新硬件添加功能部件和支持、在內(nèi)核中修正錯誤并且及時地進行常規(guī)改進。這導(dǎo)致大約每 6 個月(或 6 個月不到)就有一個穩(wěn)定的
Linux
樹的新發(fā)行版。不同的維護者維護針對特定體系結(jié)構(gòu)的不同內(nèi)核樹和補丁。當為一個項目選擇了一個內(nèi)核時,您需要評估最新發(fā)行版的穩(wěn)定性如何、它是否符合項目
要求和硬件平臺、從編程角度來看它的舒適程度以及其它難以確定的方面。還有一點也非常重要:找到需要應(yīng)用于基本內(nèi)核的所有補丁,以便為特定的體系結(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)的其余部分在這第二個階段期間進行初始化。內(nèi)核樹下的目錄 arch/
由不同的子目錄組成,每個子目錄用于一個不同的體系結(jié)構(gòu)(MIPS、ARM、i386、SPARC、PPC 等)。每一個這樣的子目錄都包含
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是實際的(未壓縮的)可執(zhí)行文件,而
zImage是或多或少包含相同信息的自解壓壓縮文件 ― 只是壓縮它以處理(通常是 Intel 強制的)640 KB 引導(dǎo)時間的限制。有關(guān)所有這些的權(quán)威性解釋,請參閱
Linux Magazine的文章“Kernel Configuration: dealing with the unexpected”(請參閱
參考資料)。
內(nèi)核鏈接和裝入
一
旦為目標系統(tǒng)編譯了內(nèi)核后,通過使用引導(dǎo)裝載程序(它已經(jīng)被裝入到目標的閃存中),內(nèi)核就被裝入到目標系統(tǒng)的內(nèi)存(在 DRAM
中或者在閃存中)。通過使用串行、USB 或以太網(wǎng)端口,引導(dǎo)裝載程序與主機通信以將內(nèi)核傳送到目標的閃存或 DRAM
中。在將內(nèi)核完全裝入目標后,引導(dǎo)裝載程序?qū)⒖刂苽鬟f給裝入內(nèi)核的地址。
內(nèi)核可執(zhí)行文件由許多鏈接在一起的對象文件組成。對象文件有許多節(jié),如文本、數(shù)據(jù)、init 數(shù)據(jù)、bass 等等。這些對象文件都是由一個稱為
鏈接器腳本的文件鏈接并裝入的。這個鏈接器腳本的功能是將輸入對象文件的各節(jié)映射到輸出文件中;換句話說,它將所有輸入對象文件都鏈接到單一的可執(zhí)行文件中,將該可執(zhí)行文件的各節(jié)裝入到指定地址處。
vmlinux.lds是存在于 arch/<target>/ 目錄中的內(nèi)核鏈接器腳本,它負責鏈接內(nèi)核的各個節(jié)并將它們裝入內(nèi)存中特定偏移量處。典型的 vmlinux.lds 看起來象這樣:
清單 2. 典型的 vmlinux.lds 文件
OUTPUT_ARCH(<arch>) /* <arch> includes architecture type */ ENTRY(stext) /* stext is the kernel entry point */ SECTIONS /* SECTIONS command describes the layout of the output file */ { . = TEXTADDR; /* TEXTADDR is LMA for the kernel */ .init : { /* Init code and data*/ _stext = .; /* First section is stext followed by __init data section */ __init_begin = .; *(.text.init) __init_end = .; } .text : { /* Real text segment follows __init_data section */ _text = .; *(.text) _etext = .; /* End of text section*/ } .data :{ _data=.; /* Data section comes after text section */ *(.data) _edata=.; } /* Data section ends here */ .bss : { /* BSS section follows symbol table section */ __bss_start = .; *(.bss) _end = . ; /* BSS section ends here */ } }
|
LMA 是裝入模塊地址;它表示將要裝入內(nèi)核的目標虛擬內(nèi)存中的地址。
TEXTADDR 是內(nèi)核的虛擬起始地址,并且在 arch/<target>/ 下的 Makefile 中指定它的值。這個地址必須與引導(dǎo)裝載程序使用的地址相匹配。
一旦引導(dǎo)裝載程序?qū)?nèi)核復(fù)制到閃存或 DRAM 中,內(nèi)核就被重新定位到
TEXTADDR — 它通常在 DRAM 中。然后,引導(dǎo)裝載程序?qū)⒖刂妻D(zhuǎn)給這個地址,以便內(nèi)核能開始執(zhí)行。
參數(shù)傳遞和內(nèi)核引導(dǎo)
stext 是內(nèi)核入口點,這意味著在內(nèi)核引導(dǎo)時將首先執(zhí)行這一節(jié)下的代碼。它通常用匯編語言編寫,并且通常它在 arch/<target>/ 內(nèi)核目錄下。這個代碼設(shè)置內(nèi)核頁面目錄、創(chuàng)建身份內(nèi)核映射、標識體系結(jié)構(gòu)和處理器以及執(zhí)行分支
start_kernel (初始化系統(tǒng)的主例程)。
start_kernel 調(diào)用
setup_arch 作為執(zhí)行的第一步,在其中完成特定于體系結(jié)構(gòu)的設(shè)置。這包括初始化硬件寄存器、標識根設(shè)備和系統(tǒng)中可用的 DRAM 和閃存的數(shù)量、指定系統(tǒng)中可用頁面的數(shù)目、文件系統(tǒng)大小等等。所有這些信息都以參數(shù)形式從引導(dǎo)裝載程序傳遞到內(nèi)核。
將參數(shù)從引導(dǎo)裝載程序傳遞到內(nèi)核有兩種方法:parameter_structure 和標記列表。在這兩種方法中,不贊成使用參數(shù)結(jié)構(gòu),因為它強加了限制:指定在內(nèi)存中,每個參數(shù)必須位于
param_struct 中的特定偏移量處。最新的內(nèi)核期望參數(shù)作為標記列表的格式來傳遞,并將參數(shù)轉(zhuǎn)化為已標記格式。
param_struct 定義在 include/asm/setup.h 中。它的一些重要字段是:
清單 3. 樣本參數(shù)結(jié)構(gòu)
struct param_struct { unsigned long page_size; /* 0: Size of the page */ unsigned long nr_pages; /* 4: Number of pages in the system */ unsigned long ramdisk /* 8: ramdisk size */ unsigned long rootdev; /* 16: Number representing the root device */ unsigned long initrd_start; /* 64: starting address of initial ramdisk */ /* This can be either in flash/dram */ unsigned long initrd_size; /* 68: size of initial ramdisk */ }
|
請注意:這些數(shù)表示定義字段的參數(shù)結(jié)構(gòu)中的偏移量。這意味著
如果引導(dǎo)裝載程序?qū)?shù)結(jié)構(gòu)放置在地址 0xc0000100,那么 rootdev 參數(shù)將放置在 0xc0000100 +
16,initrd_start 將放置在 0xc0000100 + 64 等等 ― 否則,內(nèi)核將在解釋正確的參數(shù)時遇到困難。
正
如上面提到的,因為從引導(dǎo)裝載程序到內(nèi)核的參數(shù)傳遞會有一些約束條件,所以大多數(shù) 2.4.x
系列內(nèi)核期望參數(shù)以已標記的列表格式傳遞。在已標記的列表中,每個標記由標識被傳遞參數(shù)的 tag_header
以及其后的參數(shù)值組成。標記列表中標記的常規(guī)格式可以如下所示:
清單 4. 樣本標記格式。內(nèi)核通過 <ATAG_TAGNAME> 頭來標識每個標記。
#define <aTAG_TAGNAME> <Some Magic number> struct <tag_tagname> { u32 <tag_param>; u32 <tag_param>; }; /* Example tag for passing memory information */ #define ATAG_MEM 0x54410002 /* Magic number */ struct tag_mem32 { u32 size; /* size of memory */ u32 start; /* physical start address of memory*/ };
|
setup_arch 還需要對閃存存儲庫、系統(tǒng)寄存器和其它特定設(shè)備執(zhí)行內(nèi)存映射。一旦完成了特定于體系結(jié)構(gòu)的設(shè)置,控制就返回到初始化系統(tǒng)其余部分的 start_kernel 函數(shù)。這些附加的初始化任務(wù)包含:
- 設(shè)置陷阱
- 初始化中斷
- 初始化計時器
- 初始化控制臺
- 調(diào)用
mem_init ,它計算各種區(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ū)動程序
嵌
入式系統(tǒng)通常有許多設(shè)備用于與用戶交互,象觸摸屏、小鍵盤、滾動輪、傳感器、RA232 接口、LCD
等等。除了這些設(shè)備外,還有許多其它專用設(shè)備,包括閃存、USB、GSM 等。內(nèi)核通過所有這些設(shè)備各自的設(shè)備驅(qū)動程序來控制它們,包括 GUI
用戶應(yīng)用程序也通過訪問這些驅(qū)動程序來訪問設(shè)備。本節(jié)著重討論通常幾乎在每個嵌入式環(huán)境中都會使用的一些重要設(shè)備的設(shè)備驅(qū)動程序。
幀緩沖區(qū)驅(qū)動程序
這
是最重要的驅(qū)動程序之一,因為通過這個驅(qū)動程序才能使系統(tǒng)屏幕顯示內(nèi)容。幀緩沖區(qū)驅(qū)動程序通常有三層。最底層是基本控制臺驅(qū)動程序
drivers/char/console.c,它提供了文本控制臺常規(guī)接口的一部分。通過使用控制臺驅(qū)動程序函數(shù),我們能將文本打印到屏幕上 ―
但圖形或動畫還不能(這樣做需要使用視頻模式功能,通常出現(xiàn)在中間層,也就是 drivers/video/fbcon.c
中)。這個第二層驅(qū)動程序提供了視頻模式中繪圖的常規(guī)接口。
幀緩沖區(qū)是顯卡上的內(nèi)存,需要將它內(nèi)存映射到用戶空間以便可以將圖形
和文本能寫到這個內(nèi)存段上:然后這個信息將反映到屏幕上。幀緩沖區(qū)支持提高了繪圖的速度和整體性能。這也是頂層驅(qū)動程序引人注意之處:頂層是非常特定于硬
件的驅(qū)動程序,它需要支持顯卡不同的硬件方面 ―
象啟用/禁用顯卡控制器、深度和模式的支持以及調(diào)色板等。所有這三層都相互依賴以實現(xiàn)正確的視頻功能。與幀緩沖區(qū)有關(guān)的設(shè)備是
/dev/fb0(主設(shè)備號 29,次設(shè)備號 0)。
輸入設(shè)備驅(qū)動程序
可觸摸板是用于嵌入式設(shè)備的最基本的用戶交互設(shè)備之一 ― 小鍵盤、傳感器和滾動輪也包含在許多不同設(shè)備中以用于不同的用途。
觸摸板設(shè)備的主要功能是隨時報告用戶的觸摸,并標識觸摸的坐標。這通常在每次發(fā)生觸摸時,通過生成一個中斷來實現(xiàn)。
然后,這個設(shè)備驅(qū)動程序的角色是每當出現(xiàn)中斷時就查詢觸摸屏控制器,并請求控制器發(fā)送觸摸的坐標。一旦驅(qū)動程序接收到坐標,它就將有關(guān)觸摸和任何可用數(shù)據(jù)的信號發(fā)送給用戶應(yīng)用程序,并將數(shù)據(jù)發(fā)送給應(yīng)用程序(如果可能的話)。然后用戶應(yīng)用程序根據(jù)它的需要處理數(shù)據(jù)。
幾乎所有輸入設(shè)備 ― 包括小鍵盤 ― 都以類似原理工作。
閃存 MTD 驅(qū)動程序
MTD 設(shè)備是象閃存芯片、小型閃存卡、記憶棒等之類的設(shè)備,它們在嵌入式設(shè)備中的使用正在不斷增長。
MTD
驅(qū)動程序是在 Linux 下專門為嵌入式環(huán)境開發(fā)的新的一類驅(qū)動程序。相對于常規(guī)塊設(shè)備驅(qū)動程序,使用 MTD 驅(qū)動程序的主要優(yōu)點在于 MTD
驅(qū)動程序是專門為基于閃存的設(shè)備所設(shè)計的,所以它們通常有更好的支持、更好的管理和基于扇區(qū)的擦除和讀寫操作的更好的接口。Linux 下的 MTD
驅(qū)動程序接口被劃分為兩類模塊:用戶模塊和硬件模塊。
用戶模塊
這些模塊提供從用
戶空間直接使用的接口:原始字符訪問、原始塊訪問、FTL(閃存轉(zhuǎn)換層,F(xiàn)lash Transition Layer ―
用在閃存上的一種文件系統(tǒng))和 JFS(即日志文件系統(tǒng),Journaled File System ―
在閃存上直接提供文件系統(tǒng)而不是模擬塊設(shè)備)。用于閃存的 JFS 的當前版本是 JFFS2(稍后將在本文中描述)。
硬件模塊
這些模塊提供對內(nèi)存設(shè)備的物理訪問,但并不直接使用它們。通過上述的用戶模塊來訪問它們。這些模塊提供了在閃存上讀、擦除和寫操作的實際例程。
MTD 驅(qū)動程序設(shè)置
為了訪問特定的閃存設(shè)備并將文件系統(tǒng)置于其上,需要將 MTD 子系統(tǒng)編譯到內(nèi)核中。這包括選擇適當?shù)?MTD 硬件和用戶模塊。當前,MTD 子系統(tǒng)支持為數(shù)眾多的閃存設(shè)備 ― 并且有越來越多的驅(qū)動程序正被添加進來以用于不同的閃存芯片。
有兩個流行的用戶模塊可啟用對閃存的訪問:
MTD_CHAR 和
MTD_BLOCK 。
MTD_CHAR 提供對閃存的原始字符訪問,而
MTD_BLOCK 將閃存設(shè)計為可以在上面創(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/mtdblock0、mtdblock1(等等)。由于
MTD_BLOCK 設(shè)備提供象塊設(shè)備那樣的模擬,通常更可取的是在這個模擬基礎(chǔ)上創(chuàng)建象 FTL 和 JFFS2 那樣的文件系統(tǒng)。
為了進行這個操作,可能需要創(chuàng)建分區(qū)表將閃存設(shè)備分拆到引導(dǎo)裝載程序節(jié)、內(nèi)核節(jié)和文件系統(tǒng)節(jié)中。樣本分區(qū)表可能包含以下信息:
清單 5. MTD 的簡單閃存設(shè)備分區(qū)
struct mtd_partition sample_partition = { { /* First partition */ name : bootloader, /* Bootloader section */ size : 0x00010000, /* Size */ offset : 0, /* Offset from start of flash- location 0x0*/ mask_flags : MTD_WRITEABLE /* This partition is not writable */ }, { /* Second partition */ name : Kernel, /* Kernel section */ size : 0x00100000, /* Size */ offset : MTDPART_OFS_APPEND, /* Append after bootloader section */ mask_flags : MTD_WRITEABLE /* This partition is not writable */ }, { /* Third partition */ name : JFFS2, /* JFFS2 filesystem */ size : MTDPART_SIZ_FULL, /* Occupy rest of flash */ offset : MTDPART_OFS_APPEND /* Append after kernel section */ } }
|
上面的分區(qū)表使用了
MTD_BLOCK 接口對閃存設(shè)備進行分區(qū)。這些分區(qū)的設(shè)備節(jié)點是:
簡單閃存分區(qū)的設(shè)備節(jié)點
User device node Major number Minor number Bootloader /dev/mtdblock0 31 0 Kernel /dev/mtdblock1 31 1 Filesystem /dev/mtdblock2 31 2
|
在本例中,引導(dǎo)裝載程序必須將有關(guān) root 設(shè)備節(jié)點(/dev/mtdblock2)和可以在閃存中找到文件系統(tǒng)的地址(本例中是
FLASH_BASE_ADDRESS + 0x04000000 )的正確參數(shù)傳遞到內(nèi)核。一旦完成分區(qū),閃存設(shè)備就準備裝入或掛裝文件系統(tǒng)。
Linux 中 MTD 子系統(tǒng)的主要目標是在系統(tǒng)的硬件驅(qū)動程序和上層,或用戶模塊之間提供通用接口。硬件驅(qū)動程序不需要知道象 JFFS2 和 FTL 那樣的用戶模塊使用的方法。所有它們真正需要提供的就是一組對底層閃存系統(tǒng)進行
read 、
write 和
erase 操作的簡單例程。
嵌入式設(shè)備的文件系統(tǒng)
系統(tǒng)需要一種以結(jié)構(gòu)化格式存儲和檢索信息的方法;這就需要文件系統(tǒng)的參與。Ramdisk(請參閱
參考資料)是通過將計算機的 RAM 用作設(shè)備來創(chuàng)建和掛裝文件系統(tǒng)的一種機制,它通常用于無盤系統(tǒng)(當然包括微型嵌入式設(shè)備,它只包含作為永久存儲媒質(zhì)的閃存芯片)。
用戶可以根據(jù)可靠性、健壯性和/或增強的功能的需求來選擇文件系統(tǒng)的類型。下一節(jié)將討論幾個可用選項及其優(yōu)缺點。
第二版擴展文件系統(tǒng)(Ext2fs)
Ext2fs 是 Linux 事實上的標準文件系統(tǒng),它已經(jīng)取代了它的前任 ― 擴展文件系統(tǒng)(或 Extfs)。Extfs 支持的文件大小最大為
2 GB,支持的最大文件名稱大小為 255 個字符 ― 而且它不支持索引節(jié)點(包括數(shù)據(jù)修改時間標記)。Ext2fs 做得更好;它的 優(yōu)點是:
- Ext2fs 支持達 4 TB 的內(nèi)存。
- Ext2fs 文件名稱最長可以到 1012 個字符。
- 當創(chuàng)建文件系統(tǒng)時,管理員可以選擇邏輯塊的大小(通常大小可選擇 1024、2048 和 4096 字節(jié))。
- Ext2fs 了實現(xiàn)快速符號鏈接:不需要為此目的而分配數(shù)據(jù)塊,并且將目標名稱直接存儲在索引節(jié)點(inode)表中。這使性能有所提高,特別是在速度上。
因為 Ext2 文件系統(tǒng)的穩(wěn)定性、可靠性和健壯性,所以幾乎在所有基于 Linux 的系統(tǒng)(包括臺式機、服務(wù)器和工作站 ― 并且甚至一些嵌入式設(shè)備)上都使用 Ext2 文件系統(tǒng)。然而,當在嵌入式設(shè)備中使用 Ext2fs 時,它有一些
缺點:
- Ext2fs 是為象 IDE 設(shè)備那樣的塊設(shè)備設(shè)計的,這些設(shè)備的邏輯塊大小是 512 字節(jié),1 K 字節(jié)等這樣的倍數(shù)。這不太適合于扇區(qū)大小因設(shè)備不同而不同的閃存設(shè)備。
- Ext2
文件系統(tǒng)沒有提供對基于扇區(qū)的擦除/寫操作的良好管理。在 Ext2fs 中,為了在一個扇區(qū)中擦除單個字節(jié),必須將整個扇區(qū)復(fù)制到
RAM,然后擦除,然后重寫入。考慮到閃存設(shè)備具有有限的擦除壽命(大約能進行 100,000
次擦除),在此之后就不能使用它們,所以這不是一個特別好的方法。
- 在出現(xiàn)電源故障時,Ext2fs 不是防崩潰的。
- Ext2 文件系統(tǒng)不支持損耗平衡,因此縮短了扇區(qū)/閃存的壽命。(損耗平衡確保將地址范圍的不同區(qū)域輪流用于寫和/或擦除操作以延長閃存設(shè)備的壽命。)
- Ext2fs 沒有特別完美的扇區(qū)管理,這使設(shè)計塊驅(qū)動程序十分困難。
由于這些原因,通常相對于 Ext2fs,在嵌入式環(huán)境中使用 MTD/JFFS2 組合是更好的選擇。
用 Ramdisk 掛裝 Ext2fs
通過使用 Ramdisk 的概念,可以在嵌入式設(shè)備中創(chuàng)建并掛裝 Ext2 文件系統(tǒng)(以及用于這一目的的任何文件系統(tǒng))。
清單 6. 創(chuàng)建一個簡單的基于 Ext2fs 的 Ramdisk
mke2fs -vm0 /dev/ram 4096 mount -t ext2 /dev/ram /mnt cd /mnt cp /bin, /sbin, /etc, /dev ... files in mnt cd ../ umount /mnt dd if=/dev/ram bs=1k count=4096 of=ext2ramdisk
|
mke2fs 是用于在任何設(shè)備上創(chuàng)建 ext2 文件系統(tǒng)的實用程序 — 它創(chuàng)建超級塊、索引節(jié)點以及索引節(jié)點表等等。
在上面的用法中,
/dev/ram 是上面構(gòu)建有 4096 個塊的 ext2 文件系統(tǒng)的設(shè)備。然后,將這個設(shè)備(
/dev/ram )掛裝在名為
/mnt 的臨時目錄上并且復(fù)制所有必需的文件。一旦復(fù)制完這些文件,就卸裝這個文件系統(tǒng)并且設(shè)備(
/dev/ram )的內(nèi)容被轉(zhuǎn)儲到一個文件(ext2ramdisk)中,它就是所需的 Ramdisk(Ext2 文件系統(tǒng))。
上面的順序創(chuàng)建了一個 4 MB 的 Ramdisk,并用必需的文件實用程序來填充它。
一些要包含在 Ramdisk 中的重要目錄是:
-
/bin ― 保存大多數(shù)象
init 、
busybox 、
shell 、文件管理實用程序等二進制文件。
-
/dev― 包含用在設(shè)備中的所有設(shè)備節(jié)點
-
/etc― 包含系統(tǒng)的所有配置文件
-
/lib― 包含所有必需的庫,如 libc、libdl 等
日志閃存文件系統(tǒng),版本 2(JFFS2)
瑞典的 Axis Communications 開發(fā)了最初的 JFFS,Red Hat 的 David Woodhouse 對它進行了改進。
第二個版本,JFFS2,作為用于微型嵌入式設(shè)備的原始閃存芯片的實際文件系統(tǒng)而出現(xiàn)。JFFS2
文件系統(tǒng)是日志結(jié)構(gòu)化的,這意味著它基本上是一長列節(jié)點。每個節(jié)點包含有關(guān)文件的部分信息 ― 可能是文件的名稱、也許是一些數(shù)據(jù)。相對于
Ext2fs,JFFS2 因為有以下這些 優(yōu)點而在無盤嵌入式設(shè)備中越來越受歡迎:
- JFFS2 在扇區(qū)級別上執(zhí)行閃存擦除/寫/讀操作要比 Ext2 文件系統(tǒng)好。
- JFFS2
提供了比 Ext2fs 更好的崩潰/掉電安全保護。當需要更改少量數(shù)據(jù)時,Ext2
文件系統(tǒng)將整個扇區(qū)復(fù)制到內(nèi)存(DRAM)中,在內(nèi)存中合并新數(shù)據(jù),并寫回整個扇區(qū)。這意味著為了更改單個字,必須對整個扇區(qū)(64
KB)執(zhí)行讀/擦除/寫例程 ― 這樣做的效率非常低。要是運氣差,當正在 DRAM
中合并數(shù)據(jù)時,發(fā)生了電源故障或其它事故,那么將丟失整個數(shù)據(jù)集合,因為在將數(shù)據(jù)讀入 DRAM 后就擦除了閃存扇區(qū)。JFFS2
附加文件而不是重寫整個扇區(qū),并且具有崩潰/掉電安全保護這一功能。
- 這可能是最重要的一點:JFFS2 是專門為象閃存芯片那樣的嵌入式設(shè)備創(chuàng)建的,所以它的整個設(shè)計提供了更好的閃存管理。
因為本文主要是寫關(guān)于閃存設(shè)備的使用,所以在嵌入式環(huán)境中使用 JFFS2 的
缺點很少:
- 當文件系統(tǒng)已滿或接近滿時,JFFS2 會大大放慢運行速度。這是因為垃圾收集的問題(更多信息,請參閱
參考資料)。
創(chuàng)建 JFFS2 文件系統(tǒng)
在 Linux 下,用
mkfs.jffs2 命令創(chuàng)建 JFFS2 文件系統(tǒng)(基本上是使用 JFFS2 的 Ramdisk)。
清單 7. 創(chuàng)建 JFFS2 文件系統(tǒng)
mkdir jffsfile cd jffsfile /* copy all the /bin, /etc, /usr/bin, /sbin/ binaries and /dev entries that are needed for the filesystem here */ /* Type the following command under jffsfile directory to create the JFFS2 Image */ ./mkfs.jffs2 -e 0x40000 -p -o ../jffs.image
|
上面顯示了 mkfs.jffs2 的典型用法。
-e 選項確定閃存的擦除扇區(qū)大小(通常是 64 千字節(jié))。
-p 選項用來在映像的剩余空間用零填充。
-o 選項用于輸出文件,通常是 JFFS2 文件系統(tǒng)映像 ― 在本例中是 jffs.image。一旦創(chuàng)建了 JFFS2 文件系統(tǒng),它就被裝入閃存中適當?shù)奈恢茫ㄒ龑?dǎo)裝載程序告知內(nèi)核查找文件系統(tǒng)的地址)以便內(nèi)核能掛裝它。
tmpfs
當 Linux 運行于嵌入式設(shè)備上時,該設(shè)備就成為功能齊全的單元,許多守護進程會在后臺運行并生成許多日志消息。另外,所有內(nèi)核日志記錄機制,象
syslogd、dmesg 和 klogd,會在 /var 和 /tmp
目錄下生成許多消息。由于這些進程產(chǎn)生了大量數(shù)據(jù),所以允許將所有這些寫操作都發(fā)生在閃存是不可取的。由于在重新引導(dǎo)時這些消息不需要持久存儲,所以這個
問題的解決方案是使用 tmpfs。
tmpfs 是基于內(nèi)存的文件系統(tǒng),它主要用于減少對系統(tǒng)的不必要的閃存寫操作這一唯一目的。因為
tmpfs 駐留在 RAM 中,所以寫/讀/擦除的操作發(fā)生在 RAM 中而不是在閃存中。因此,日志消息寫入 RAM
而不是閃存中,在重新引導(dǎo)時不會保留它們。tmpfs 還使用磁盤交換空間來存儲,并且當為存儲文件而請求頁面時,使用虛擬內(nèi)存(VM)子系統(tǒng)。
tmpfs 的
優(yōu)點包括:
- 動態(tài)文件系統(tǒng)大小 ― 文件系統(tǒng)大小可以根據(jù)被復(fù)制、創(chuàng)建或刪除的文件或目錄的數(shù)量來縮放。使得能夠最理想地使用內(nèi)存。
- 速度 ― 因為 tmpfs 駐留在 RAM,所以讀和寫幾乎都是瞬時的。即使以交換的形式存儲文件,I/O 操作的速度仍非常快。
tmpfs 的一個
缺點是當系統(tǒng)重新引導(dǎo)時會丟失所有數(shù)據(jù)。因此,重要的數(shù)據(jù)不能存儲在 tmpfs 上。
掛裝 tmpfs
諸如 Ext2fs 和 JFFS2 等大多數(shù)其它文件系統(tǒng)都駐留在底層塊設(shè)備之上,而 tmpfs 與它們不同,它直接位于 VM 上。因而,掛裝 tmpfs 文件系統(tǒng)是很簡單的事:
清單 8. 掛裝 tmpfs
/* Entries in /etc/rc.d/rc.sysinit for creating/using tmpfs */ # mount -t tmpfs tmpfs /var -o size=512k # mkdir -p /var/tmp # mkdir -p /var/log # ln -s /var/tmp /tmp
|
上面的命令將在 /var 上創(chuàng)建 tmpfs 并將 tmpfs 的最大大小限制為 512 K。同時,tmp/ 和 log/ 目錄成為 tmpfs 的一部分以便在 RAM 中存儲日志消息。
如果您想將 tmpfs 的一個項添加到 /etc/fstab,那么它可能看起來象這樣:
tmpfs /var tmpfs size=32m 0 0
|
這將在 /var 上掛裝一個新的 tmpfs 文件系統(tǒng)。
圖形用戶界面(GUI)選項
從
用戶的觀點來看,圖形用戶界面(GUI)是系統(tǒng)的一個最至關(guān)重要的方面:用戶通過 GUI 與系統(tǒng)進行交互。所以 GUI
應(yīng)該易于使用并且非常可靠。但它還需要是有內(nèi)存意識的,以便在內(nèi)存受限的、微型嵌入式設(shè)備上可以無縫執(zhí)行。所以,它應(yīng)該是輕量級的,并且能夠快速裝入。
另一個要考慮的重要方面涉及許可證問題。一些 GUI 分發(fā)版具有允許免費使用的許可證,甚至在一些商業(yè)產(chǎn)品中也是如此。另一些許可證要求如果想將 GUI 合并入項目中則要支付版稅。
最
后,大多數(shù)開發(fā)人員可能會選擇 XFree86,因為 XFree86 為他們提供了一個能使用他們喜歡的工具的熟悉環(huán)境。但是市場上較新的
GUI,象 Century Software 的 Microwindows(Nano-X)和 Trolltech 的
QT/Embedded,與 X 在嵌入式 Linux
的競技舞臺中展開了激烈競爭,這主要是因為它們占用很少的資源、執(zhí)行的速度很快并且具有定制窗口構(gòu)件的支持。
讓我們看一看這些選項中的每一個。
Xfree86 4.X(帶幀緩沖區(qū)支持的 X11R6.4)
XFree86
Project, Inc. 是一家生產(chǎn) XFree86 的公司,該產(chǎn)品是一個可以免費重復(fù)分發(fā)、開放源碼的 X Window 系統(tǒng)。X
Window 系統(tǒng)(X11)為應(yīng)用程序以圖形方式進行顯示提供了資源,并且它是 UNIX 和類 UNIX
的機器上最常用的窗口系統(tǒng)。它很小但很有效,它運行在為數(shù)眾多的硬件上,它對網(wǎng)絡(luò)透明并且有良好的文檔說明。X11
為窗口管理、事件處理、同步和客戶機間通信提供強大的功能 ― 并且大多數(shù)開發(fā)人員已經(jīng)熟悉了它的
API。它具有對內(nèi)核幀緩沖區(qū)的內(nèi)置支持,并占用非常少的資源 ― 這非常有助于內(nèi)存相對較少的設(shè)備。X 服務(wù)器支持 VGA 和非 VGA
圖形卡,它對顏色深度 1、2、4、8、16 和 32 提供支持,并對渲染提供內(nèi)置支持。最新的發(fā)行版是 XFree86 4.1.0。
它的
優(yōu)點包括:
- 幀緩沖區(qū)體系結(jié)構(gòu)的使用提高了性能。
- 占用的資源相對很小 ― 大小在 600 K 到 700 K 字節(jié)的范圍內(nèi),這使它很容易在小型設(shè)備上運行。
- 非常好的支持:在線有許多文檔可用,還有許多專用于 XFree86 開發(fā)的郵遞列表。
- X API 非常適合擴展。
它的
缺點包括:
- 比最近出現(xiàn)的嵌入式 GUI 工具性能差。
- 此外,當與 GUI 中最新的開發(fā) ― 象專門為嵌入式環(huán)境設(shè)計的 Nano-X 或 QT/Embedded ― 相比時,XFree86 似乎需要更多的內(nèi)存。
Microwindows
Microwindows 是 Century Software 的開放源代碼項目,設(shè)計用于帶小型顯示單元的微型設(shè)備。它有許多針對現(xiàn)代圖形視窗環(huán)境的功能部件。象 X 一樣,有多種平臺支持 Microwindows。
Microwindows 體系結(jié)構(gòu)是基于客戶機/服務(wù)器的并且具有分層設(shè)計。最底層是屏幕和輸入設(shè)備驅(qū)動程序(關(guān)于鍵盤或鼠標)來與實際硬件交互。在中間層,可移植的圖形引擎提供對線的繪制、區(qū)域的填充、多邊形、裁剪以及顏色模型的支持。
在
最上層,Microwindows 支持兩種 API:Win32/WinCE API 實現(xiàn),稱為 Microwindows;另一種 API 與
GDK 非常相似,它稱為 Nano-X。Nano-X 用在 Linux 上。它是象 X 的 API,用于占用資源少的應(yīng)用程序。
Microwindows
支持 1、2、4 和 8 bpp(每像素的位數(shù))的 palletized 顯示,以及 8、16、24 和 32 bpp
的真彩色顯示。Microwindows 還支持使它速度更快的幀緩沖區(qū)。Nano-X 服務(wù)器占用的資源大約在 100 K 到 150 K 字節(jié)。
原始 Nano-X 應(yīng)用程序的平均大小在 30 K 到 60 K。由于 Nano-X 是為有內(nèi)存限制的低端設(shè)備設(shè)計的,所以它不象 X 那樣支持很多函數(shù),因此它實際上不能作為微型 X(Xfree86 4.1)的替代品。
可以在 Microwindows 上運行 FLNX,它是針對 Nano-X 而不是 X 進行修改的 FLTK(快速輕巧工具箱(Fast Light Toolkit))應(yīng)用程序開發(fā)環(huán)境的一個版本。本文中描述 FLTK。
Nano-X 的
優(yōu)點包括:
- 與 Xlib 實現(xiàn)不同,Nano-X 仍在每個客戶機上同步運行,這意味著一旦發(fā)送了客戶機請求包,服務(wù)器在為另一個客戶機提供服務(wù)之前一直等待,直到整個包都到達為止。這使服務(wù)器代碼非常簡單,而運行的速度仍非常快。
- 占用很小的資源
Nano-X 的
缺點包括:
- 聯(lián)網(wǎng)功能部件至今沒有經(jīng)過適當?shù)卣{(diào)整(特別是網(wǎng)絡(luò)透明性)。
- 還沒有太多現(xiàn)成的應(yīng)用程序可用。
- 與 X 相比,Nano-X 雖然近來正在加速開發(fā),但仍沒有那么多文檔說明而且沒有很好的支持,但這種情形會有所改變。
Microwindows 上的 FLTK API
FLTK
是一個簡單但靈活的 GUI 工具箱,它在 Linux 世界中贏得越來越多的關(guān)注,它特別適用于占用資源很少的環(huán)境。它提供了您期望從 GUI
工具箱中獲得的大多數(shù)窗口構(gòu)件,如按鈕、對話框、文本框以及出色的“賦值器”選擇(用于輸入數(shù)值的窗口構(gòu)件)。還包括滑動器、滾動條、刻度盤和其它一些構(gòu)
件。
針對 Microwindows GUI 引擎的 FLTK 的 Linux 版本被稱為 FLNX。FLNX
由兩個組件構(gòu)成:Fl_Widget 和 FLUID。Fl_Widget 由所有基本窗口構(gòu)件 API
組成。FLUID(快速輕巧的用戶界面設(shè)計器(Fast Light User Interface Designer, FLUID))是用來產(chǎn)生
FLTK 源代碼的圖形編輯器。總的來說,F(xiàn)LNX 是能用來為嵌入式環(huán)境創(chuàng)建應(yīng)用程序的一個出色的 UI 構(gòu)建器。
Fl_Widget 占用的資源大約是 40 K 到 48 K,而 FLUID(包括了每個窗口構(gòu)件)大約占用 380 K。這些非常小的資源占用率使 Fl_Widget 和 FLUID 在嵌入式開發(fā)世界中非常受歡迎。
優(yōu)點包括:
- 習慣于在象 Windows 這樣已建立得較好的環(huán)境中開發(fā)基于 GUI 的應(yīng)用程序的任何人都會非常容易地適應(yīng) FLTK 環(huán)境。
- 它的文檔包括一本十分完整且編寫良好的手冊。
- 它使用 LGPL 進行分發(fā),所以開發(fā)人員可以靈活地發(fā)放他們應(yīng)用程序的許可證。
- FLTK 是一個 C++ 庫(Perl 和 Python 綁定也可用)。面向?qū)ο竽P偷倪x擇是一個好的選擇,因為大多數(shù)現(xiàn)代 GUI 環(huán)境都是面向?qū)ο蟮模贿@也使將編寫的應(yīng)用程序移植到類似的 API 中變得更容易。
- Century Software 的環(huán)境提供了幾個有用的工具,諸如 ScreenToP 和 ViewML 瀏覽器。
它的
缺點是:
- 普通的 FLTK 可以與 X 和 Windows API 一同工作,而 FLNX 不能。它與 X 的不兼容性阻礙了它在許多項目中的使用。
Qt/Embedded
Qt/Embedded
是 Trolltech 新開發(fā)的用于嵌入式 Linux 的圖形用戶界面系統(tǒng)。Trolltech 最初創(chuàng)建 Qt 作為跨平臺的開發(fā)工具用于
Linux 臺式機。它支持各種有 UNIX 特點的系統(tǒng)以及 Microsoft Windows。KDE ― 最流行的 Linux
桌面環(huán)境之一,就是用 Qt 編寫的。
Qt/Embedded 以原始 Qt
為基礎(chǔ),并做了許多出色的調(diào)整以適用于嵌入式環(huán)境。Qt Embedded 通過 Qt API 與 Linux I/O
設(shè)施直接交互。那些熟悉并已適應(yīng)了面向?qū)ο缶幊痰娜藛T將發(fā)現(xiàn)它是一個理想環(huán)境。而且,面向?qū)ο蟮捏w系結(jié)構(gòu)使代碼結(jié)構(gòu)化、可重用并且運行快速。與其它
GUI 相比,Qt GUI 非常快,并且它沒有分層,這使得 Qt/Embedded 成為用于運行基于 Qt 的程序的最緊湊環(huán)境。
Trolltech
還推出了 Qt 掌上機環(huán)境(Qt Palmtop Environment,俗稱 Qpe)。Qpe
提供了一個基本桌面窗口,并且該環(huán)境為開發(fā)提供了一個易于使用的界面。Qpe 包含全套的個人信息管理(Personal Information
Management (PIM))應(yīng)用程序、因特網(wǎng)客戶機、實用程序等等。然而,為了將 Qt/Embedded 或 Qpe
集成到一個產(chǎn)品中,需要從 Trolltech 獲得商業(yè)許可證。(原始 Qt 自版本 2.2 以后就可以根據(jù) GPL 獲得 。)
它的
優(yōu)點包括:
- 面向?qū)ο蟮捏w系結(jié)構(gòu)有助于更快地執(zhí)行
- 占用很少的資源,大約 800 K
- 抗鋸齒文本和混合視頻的象素映射
它的
缺點是:
- Qt/Embedded 和 Qpe 只能在獲得商業(yè)許可證的情況下才能使用。
結(jié)束語
嵌
入式 Linux 開發(fā)正迅速地發(fā)展著。您必須學(xué)習并從引導(dǎo)裝載程序和分發(fā)版到文件系統(tǒng)和 GUI
中的每一個事物的各種選項中作出選擇。但是要感謝有這種選擇自由度以及非常活躍的 Linux 社區(qū),Linux
上的嵌入式開發(fā)已經(jīng)達到了新的境界,并且調(diào)整模塊以適合您的規(guī)范從未比現(xiàn)在更簡單。這已經(jīng)導(dǎo)致出現(xiàn)了許多時新的手持和微型設(shè)備作為開放盒,這是件好事
― 因為事實是您不必成為一個專家從這些模塊中進行選擇來調(diào)整您的設(shè)備以滿足您自己的要求和需要。
我們希望這篇對嵌入式 Linux 領(lǐng)域的介紹性概述能激起您進行試驗的欲望,并且希望您將體會擺弄微型設(shè)備的樂趣以滿足您的愛好。為進一步有助于您的項目,請參閱下面的“參考資料”,鏈接到有關(guān)我們這里已經(jīng)概述的技術(shù)的更深入的信息。
參考資料
引導(dǎo):
小型分發(fā)版:
工具鏈:
設(shè)備驅(qū)動程序:
有用的工具:
文件系統(tǒng):
GUI:
一般參考資料:
作者簡介
 |
|
 |
Anand
K Santhanam 在印度 Madras 大學(xué)獲得計算機科學(xué)工學(xué)學(xué)士學(xué)位。自 1999 年 7 月以來他一直在印度為 IBM Global
Services(軟件實驗室)工作。他是 IBM Linux 小組的成員,這個小組主要致力于嵌入式系統(tǒng)中的
ARM-Linux、設(shè)備驅(qū)動程序和電源管理的研究和開發(fā)。他感興趣的其它領(lǐng)域是 O/S 本質(zhì)和聯(lián)網(wǎng)。可以通過 asanthan@in.ibm.com 與他聯(lián)系。
|
 |
|
 |
Vishal
Kulkarni 從印度 Maharashtra 的 Shivaji 大學(xué)獲得電子工程的學(xué)士學(xué)位。自 1999 年 3 月以來他一直在印度為
IBM Global Services(軟件實驗室)工作。在此之前,他曾在美國 IBM Austin 工作了一年半多。他是 IBM Linux
小組的成員,這個小組主要致力于嵌入式設(shè)備上的 ARM-Linux、設(shè)備驅(qū)動程序和 GUI。他感興趣的其它領(lǐng)域是 O/S 本質(zhì)和聯(lián)網(wǎng)。可以通過 kvishal@in.ibm.com與他聯(lián)系。
|
|