close

嵌入式設備上的 Linux 系統開發

Anand K Santhanam

, 軟件工程師, IBM Global Services
Vishal Kulkarni, 軟件工程師, IBM Global Services

如果您剛接觸嵌入式開發,那麼大量可用的引導裝載程序(bootloader)、規模縮小的分發版 (distribution)、文件系統和 GUI 看起來可能太多了。但是這些豐富的選項實際上是一種恩賜,允許您調整開發或用戶環境以完全符合您的需要。對 Linux 嵌入式開發的概述將幫助您理解所有這些選項。

Linux 正在嵌入式開發領域穩步發展。因為 Linux 使用 GPL(請參閱本文後面的 參考資料), 所以任何對將 Linux 定製於 PDA、掌上機或者可佩帶設備感興趣的人都可以從因特網免費下載其內核和應用程序,並開始移植或開發。許多 Linux 改良品種迎合了嵌入式/實時市場。它們包括 RTLinux(實時 Linux)、uclinux(用於非 MMU 設備的 Linux)、Montavista Linux(用於 ARM、MIPS、PPC 的 Linux 分發版)、ARM-Linux(ARM 上的 Linux)和其它 Linux 系統(請參閱 參考資料以鏈接到本文中提到的這些和其它術語及產品。)

嵌 入式 Linux 開發大致涉及三個層次:引導裝載程序、Linux 內核和圖形用戶界面(或稱 GUI)。在本文中,我們將集中討論涉及這三層的一些基本概念;深入了解引導裝載程序、內核和文件系統是如何交互的;並將研究可用於文件系統、GUI 和引導裝載程序的眾多選項中的一部分。

引導裝載程序

引 導裝載程序通常是在任何硬件上執行的第一段代碼。在象台式機這樣的常規系統中,通常將引導裝載程序裝入主引導記錄(Master Boot Record,(MBR))中,或者裝入 Linux 駐留的磁盤的第一個扇區中。通常,在台式機或其它系統上,BIOS 將控制移交給引導裝載程序。這就提出了一個有趣的問題:誰將引導裝載程序裝入(在大多數情況中)沒有 BIOS 的嵌入式設備上呢?

解決這個問題有兩種常規技術:專用軟件和微小的引導代碼(tiny bootcode)。

專用軟件可以直接與遠程系統上的閃存設備進行交互並將引導裝載程序安裝在閃存的給定位置中。 閃存設備是與存儲設備功能類似的特殊芯片,而且它們能持久存儲信息 ─ 即,在重新引導時不會擦除其內容。

這個軟件使用目標(在嵌入式開發中,嵌入式設備通常被稱為 目標)上的 JTAG 端口,它是用於執行外部輸入(通常來自主機機器)的指令的接口。JFlash-linux 是一種用於直接寫閃存的流行工具。它支持為數眾多的閃存芯片;它在主機機器(通常是 i386 機器 ─ 本文中我們把一台 i386 機器稱為 主機)上執行並通過 JTAG 接口使用並行端口訪問目標的閃存芯片。當然,這意味著目標需要有一個並行接口使它能與主機通信。Jflash-linux 在 Linux 和 Windows 版本中都可使用,可以在命令行中用以下命令啟動它:

Jflash-linux 

某些種類的嵌入式設備具有 微小的引導代碼─ 根據幾個字節的指令 ─ 它將初始化一些 DRAM 設置並啟用目標上的一個串行(或者 USB,或者以太網)端口與主機程序通信。然後,主機程序或裝入程序可以使用這個連接將引導裝載程序傳送到目標上,並將它寫入閃存。

在安裝它並給予其控制後,這個引導裝載程序執行下列各類功能:

  • 初始化 CPU 速度
  • 初始化內存,包括啟用內存庫、初始化內存配置寄存器等
  • 初始化串行端口(如果在目標上有的話)
  • 啟用指令/數據高速緩存
  • 設置堆棧指針
  • 設置參數區域並構造參數結構和標記(這是重要的一步,因為內核在標識根設備、頁面大小、內存大小以及更多內容時要使用引導參數)
  • 執行 POST(加電自檢)來標識存在的設備並報告任何問題
  • 為電源管理提供掛起/恢復支持
  • 跳轉到內核的開始

帶有引導裝載程序、參數結構、內核和文件系統的系統典型內存布局可能如下所示:


清單 1. 典型內存布局
   /* Top Of Memory */ 

Bootloader
Parameter Area
Kernel
Filesystem

/* End Of Memory */

嵌入式設備上一些流行的並可免費使用的 Linux 引導裝載程序有 Blob、Redboot 和 Bootldr(請參閱 參考資料獲得鏈接)。所有這些引導裝載程序都用於基於 ARM 設備上的 Linux,並需要 Jflash-linux 工具用於安裝。

一旦將引導裝載程序安裝到目標的閃存中,它就會執行我們上面提到的所有初始化工作。然後,它準備接收來自主機的內核和文件系統。一旦裝入了內核,引導裝載程序就將控制轉給內核。


設置工具鏈

設置工具鏈在主機機器上創建一個用於編譯將在目標上運行的內核和應用程序的構建環境 ─ 這是因為目標硬件可能沒有與主機兼容的二進制執行級別。

工具鏈由一套用於編譯、彙編和鏈接內核及應用程序的組件組成。 這些組件包括:

  • Binutils ─ 用於操作二進制文件的實用程序集合。它們包括諸如 arasobjdumpobjcopy 這樣的實用程序。
  • Gcc─ GNU C 編譯器。
  • Glibc─ 所有用戶應用程序都將鏈接到的 C 庫。避免使用任何 C 庫函數的內核和其它應用程序可以在沒有該庫的情況下進行編譯。

構建工具鏈建立了一個交叉編譯器環境。 本地編譯器編譯與本機同類的處理器的指令。 交叉編譯器運 行在某一種處理器上,卻可以編譯另一種處理器的指令。重頭設置交叉編譯器工具鏈可不是一項簡單的任務:它包括下載源代碼、修補補丁、配置、編譯、設置頭文 件、安裝以及很多很多的操作。另外,這樣一個徹底的構建過程對內存和硬盤的需求是巨大的。如果沒有足夠的內存和硬盤空間,那麼在構建階段由於相關性、配置 或頭文件設置等問題會突然冒出許多問題。

因此能夠從因特網上獲得已預編譯的二進制文件是一件好事(但不太好的一點是,目前它們大多數只限於基於 ARM 的系統,但遲早會改變的)。一些比較流行的已預編譯的工具鏈包括那些來自 Compaq(Familiar Linux )、LART(LART Linux)和 Embedian(基於 Debian 但與它無關)的工具鏈 ─ 所有這些工具鏈都用於基於 ARM 的平台。

內核設置

Linux 社區正積極地為新硬件添加功能部件和支持、在內核中修正錯誤並且及時地進行常規改進。這導致大約每 6 個月(或 6 個月不到)就有一個穩定的 Linux 樹的新發行版。不同的維護者維護針對特定體系結構的不同內核樹和補丁。當為一個項目選擇了一個內核時,您需要評估最新發行版的穩定性如何、它是否符合項目 要求和硬件平台、從編程角度來看它的舒適程度以及其它難以確定的方面。還有一點也非常重要:找到需要應用於基本內核的所有補丁,以便為特定的體系結構調整 內核。

內核布局

內 核布局分為特定於體系結構的部分和與體系結構無關的部分。內核中特定於體系結構的部分首先執行,設置硬件寄存器、配置內存映射、執行特定於體系結構的初始 化,然後將控制轉給內核中與體系結構無關的部分。系統的其餘部分在這第二個階段期間進行初始化。內核樹下的目錄 arch/ 由不同的子目錄組成,每個子目錄用於一個不同的體系結構(MIPS、ARM、i386、SPARC、PPC 等)。每一個這樣的子目錄都包含 kernel/ 和 mm/ 子目錄,它們包含特定於體系結構的代碼來完成象初始化內存、設置 IRQ、啟用高速緩存、設置內核頁面表等操作。一旦裝入內核並給予其控制,就首先調用這些函數,然後初始化系統的其餘部分。

根據可用的系統資源和引導裝載程序的功能,內核可以編譯成 vmlinux、Image 或 zImage。vmlinux 和 zImage 之間的主要區別在於 vmlinux是實際的(未壓縮的)可執行文件,而 zImage是或多或少包含相同信息的自解壓壓縮文件 ─ 只是壓縮它以處理(通常是 Intel 強制的)640 KB 引導時間的限制。有關所有這些的權威性解釋,請參閱 Linux Magazine的文章「Kernel Configuration: dealing with the unexpected」(請參閱 參考資料)。

內核鏈接和裝入

一 旦為目標系統編譯了內核後,通過使用引導裝載程序(它已經被裝入到目標的閃存中),內核就被裝入到目標系統的內存(在 DRAM 中或者在閃存中)。通過使用串行、USB 或以太網端口,引導裝載程序與主機通信以將內核傳送到目標的閃存或 DRAM 中。在將內核完全裝入目標後,引導裝載程序將控制傳遞給裝入內核的地址。

內核可執行文件由許多鏈接在一起的對象文件組成。對象文件有許多節,如文本、數據、init 數據、bass 等等。這些對象文件都是由一個稱為 鏈接器腳本的文件鏈接並裝入的。這個鏈接器腳本的功能是將輸入對象文件的各節映射到輸出文件中;換句話說,它將所有輸入對象文件都鏈接到單一的可執行文件中,將該可執行文件的各節裝入到指定地址處。 vmlinux.lds是存在於 arch// 目錄中的內核鏈接器腳本,它負責鏈接內核的各個節並將它們裝入內存中特定偏移量處。典型的 vmlinux.lds 看起來像這樣:


清單 2. 典型的 vmlinux.lds 文件
OUTPUT_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 是裝入模塊地址;它表示將要裝入內核的目標虛擬內存中的地址。 TEXTADDR 是內核的虛擬起始地址,並且在 arch// 下的 Makefile 中指定它的值。這個地址必須與引導裝載程序使用的地址相匹配。

一旦引導裝載程序將內核覆制到閃存或 DRAM 中,內核就被重新定位到 TEXTADDR — 它通常在 DRAM 中。然後,引導裝載程序將控制轉給這個地址,以便內核能開始執行。

參數傳遞和內核引導

stext 是內核入口點,這意味著在內核引導時將首先執行這一節下的代碼。它通常用彙編語言編寫,並且通常它在 arch// 內核目錄下。這個代碼設置內核頁面目錄、創建身份內核映射、標識體系結構和處理器以及執行分支 start_kernel (初始化系統的主例程)。

start_kernel 調用 setup_arch 作為執行的第一步,在其中完成特定於體系結構的設置。這包括初始化硬件寄存器、標識根設備和系統中可用的 DRAM 和閃存的數量、指定系統中可用頁面的數目、文件系統大小等等。所有這些信息都以參數形式從引導裝載程序傳遞到內核。

將參數從引導裝載程序傳遞到內核有兩種方法:parameter_structure 和標記列表。在這兩種方法中,不贊成使用參數結構,因為它強加了限制:指定在內存中,每個參數必須位於 param_struct 中的特定偏移量處。最新的內核期望參數作為標記列表的格式來傳遞,並將參數轉化為已標記格式。 param_struct 定義在 include/asm/setup.h 中。它的一些重要字段是:


清單 3. 樣本參數結構
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 */
}

請注意:這些數表示定義字段的參數結構中的偏移量。這意 味著如果引導裝載程序將參數結構放置在地址 0xc0000100,那麼 rootdev 參數將放置在 0xc0000100 + 16,initrd_start 將放置在 0xc0000100 + 64 等等 ─ 否則,內核將在解釋正確的參數時遇到困難。

正如上 面提到的,因為從引導裝載程序到內核的參數傳遞會有一些約束條件,所以大多數 2.4.x 系列內核期望參數以已標記的列表格式傳遞。在已標記的列表中,每個標記由標識被傳遞參數的 tag_header 以及其後的參數值組成。標記列表中標記的常規格式可以如下所示:


清單 4. 樣本標記格式。內核通過 頭來標識每個標記。
#define    

struct {
u32 ;
u32 ;
};

/* 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 還需要對閃存存儲庫、系統寄存器和其它特定設備執行內存映射。一旦完成了特定於體系結構的設置,控制就返回到初始化系統其餘部分的 start_kernel 函數。這些附加的初始化任務包含:

  • 設置陷阱
  • 初始化中斷
  • 初始化計時器
  • 初始化控制台
  • 調用 mem_init ,它計算各種區域、高內存區等內的頁面數量
  • 初始化 slab 分配器並為 VFS、緩衝區高速緩存等創建 slab 高速緩存
  • 建立各種文件系統,如 proc、ext2 和 JFFS2
  • 創建 kernel_thread ,它執行文件系統中的 init 命令並顯示 lign 提示符。 如果在 /bin、/sbin 或 /etc 中沒有 init 程序,那麼內核將執行文件系統的 /bin 中的 shell。

設備驅動程序

嵌入式系統通常有許多設備 用於與用戶交互,象觸摸屏、小鍵盤、滾動輪、傳感器、RA232 接口、LCD 等等。除了這些設備外,還有許多其它專用設備,包括閃存、USB、GSM 等。內核通過所有這些設備各自的設備驅動程序來控制它們,包括 GUI 用戶應用程序也通過訪問這些驅動程序來訪問設備。本節著重討論通常幾乎在每個嵌入式環境中都會使用的一些重要設備的設備驅動程序。

幀緩衝區驅動程序

這 是最重要的驅動程序之一,因為通過這個驅動程序才能使系統屏幕顯示內容。幀緩衝區驅動程序通常有三層。最底層是基本控制台驅動程序 drivers/char/console.c,它提供了文本控制台常規接口的一部分。通過使用控制台驅動程序函數,我們能將文本打印到屏幕上 ─ 但圖形或動畫還不能(這樣做需要使用視頻模式功能,通常出現在中間層,也就是 drivers/video/fbcon.c 中)。這個第二層驅動程序提供了視頻模式中繪圖的常規接口。

幀緩衝區是顯卡上的內存,需要將它內存映射到用戶空間以便可以將圖形和文本能寫 到這個內存段上:然後這個信息將反映到屏幕上。幀緩衝區支持提高了繪圖的速度和整體性能。這也是頂層驅動程序引人注意之處:頂層是非常特定於硬件的驅動程 序,它需要支持顯卡不同的硬件方面 ─ 象啟用/禁用顯卡控制器、深度和模式的支持以及調色板等。所有這三層都相互依賴以實現正確的視頻功能。與幀緩衝區有關的設備是 /dev/fb0(主設備號 29,次設備號 0)。

輸入設備驅動程序

可觸摸板是用於嵌入式設備的最基本的用戶交互設備之一 ─ 小鍵盤、傳感器和滾動輪也包含在許多不同設備中以用於不同的用途。

觸摸板設備的主要功能是隨時報告用戶的觸摸,並標識觸摸的坐標。這通常在每次發生觸摸時,通過生成一個中斷來實現。

然後,這個設備驅動程序的角色是每當出現中斷時就查詢觸摸屏控制器,並請求控制器發送觸摸的坐標。一旦驅動程序接收到坐標,它就將有關觸摸和任何可用數據的信號發送給用戶應用程序,並將數據發送給應用程序(如果可能的話)。然後用戶應用程序根據它的需要處理數據。

幾乎所有輸入設備 ─ 包括小鍵盤 ─ 都以類似原理工作。

閃存 MTD 驅動程序

MTD 設備是象閃存芯片、小型閃存卡、記憶棒等之類的設備,它們在嵌入式設備中的使用正在不斷增長。

MTD 驅動程序是在 Linux 下專門為嵌入式環境開發的新的一類驅動程序。相對於常規塊設備驅動程序,使用 MTD 驅動程序的主要優點在於 MTD 驅動程序是專門為基於閃存的設備所設計的,所以它們通常有更好的支持、更好的管理和基於扇區的擦除和讀寫操作的更好的接口。Linux 下的 MTD 驅動程序接口被劃分為兩類模塊:用戶模塊和硬件模塊。

用戶模塊
這些模塊提供從用戶空間直接使用的接口:原始字符訪 問、原始塊訪問、FTL(閃存轉換層,Flash Transition Layer ─ 用在閃存上的一種文件系統)和 JFS(即日誌文件系統,Journaled File System ─ 在閃存上直接提供文件系統而不是模擬塊設備)。用於閃存的 JFS 的當前版本是 JFFS2(稍後將在本文中描述)。

硬件模塊
這些模塊提供對內存設備的物理訪問,但並不直接使用它們。通過上述的用戶模塊來訪問它們。這些模塊提供了在閃存上讀、擦除和寫操作的實際例程。

MTD 驅動程序設置
為了訪問特定的閃存設備並將文件系統置於其上,需要將 MTD 子系統編譯到內核中。這包括選擇適當的 MTD 硬件和用戶模塊。當前,MTD 子系統支持為數眾多的閃存設備 ─ 並且有越來越多的驅動程序正被添加進來以用於不同的閃存芯片。

有兩個流行的用戶模塊可啟用對閃存的訪問: MTD_CHARMTD_BLOCK

MTD_CHAR 提供對閃存的原始字符訪問,而 MTD_BLOCK 將閃存設計為可以在上面創建文件系統的常規塊設備(象 IDE 磁盤)。與 MTD_CHAR 關聯的設備是 /dev/mtd0、mtd1、mtd2(等等),而與 MTD_BLOCK 關聯的設備是 /dev/mtdblock0、mtdblock1(等等)。由於 MTD_BLOCK 設備提供象塊設備那樣的模擬,通常更可取的是在這個模擬基礎上創建象 FTL 和 JFFS2 那樣的文件系統。

為了進行這個操作,可能需要創建分區表將閃存設備分拆到引導裝載程序節、內核節和文件系統節中。樣本分區表可能包含以下信息:


清單 5. MTD 的簡單閃存設備分區
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 */
}
}

上面的分區表使用了 MTD_BLOCK 接口對閃存設備進行分區。這些分區的設備節點是:


簡單閃存分區的設備節點
 User      device node         Major number    Minor number

Bootloader /dev/mtdblock0 31 0
Kernel /dev/mtdblock1 31 1
Filesystem /dev/mtdblock2 31 2

在本例中,引導裝載程序必須將有關 root 設備節點(/dev/mtdblock2)和可以在閃存中找到文件系統的地址(本例中是 FLASH_BASE_ADDRESS + 0x04000000 )的正確參數傳遞到內核。一旦完成分區,閃存設備就準備裝入或掛裝文件系統。

Linux 中 MTD 子系統的主要目標是在系統的硬件驅動程序和上層,或用戶模塊之間提供通用接口。硬件驅動程序不需要知道象 JFFS2 和 FTL 那樣的用戶模塊使用的方法。所有它們真正需要提供的就是一組對底層閃存系統進行 readwriteerase 操作的簡單例程。


嵌入式設備的文件系統

系統需要一種以結構化格式存儲和檢索信息的方法;這就需要文件系統的參與。Ramdisk(請參閱 參考資料)是通過將計算機的 RAM 用作設備來創建和掛裝文件系統的一種機制,它通常用於無盤系統(當然包括微型嵌入式設備,它只包含作為永久存儲媒質的閃存芯片)。

用戶可以根據可靠性、健壯性和/或增強的功能的需求來選擇文件系統的類型。下一節將討論幾個可用選項及其優缺點。

第二版擴展文件系統(Ext2fs)

Ext2fs 是 Linux 事實上的標準文件系統,它已經取代了它的前任 ─ 擴展文件系統(或 Extfs)。Extfs 支持的文件大小最大為 2 GB,支持的最大文件名稱大小為 255 個字符 ─ 而且它不支持索引節點(包括數據修改時間標記)。Ext2fs 做得更好;它的 優點是:

  • Ext2fs 支持達 4 TB 的內存。
  • Ext2fs 文件名稱最長可以到 1012 個字符。
  • 當創建文件系統時,管理員可以選擇邏輯塊的大小(通常大小可選擇 1024、2048 和 4096 字節)。
  • Ext2fs 了實現快速符號鏈接:不需要為此目的而分配數據塊,並且將目標名稱直接存儲在索引節點(inode)表中。這使性能有所提高,特別是在速度上。

因為 Ext2 文件系統的穩定性、可靠性和健壯性,所以幾乎在所有基於 Linux 的系統(包括台式機、服務器和工作站 ─ 並且甚至一些嵌入式設備)上都使用 Ext2 文件系統。然而,當在嵌入式設備中使用 Ext2fs 時,它有一些 缺點

  • Ext2fs 是為象 IDE 設備那樣的塊設備設計的,這些設備的邏輯塊大小是 512 字節,1 K 字節等這樣的倍數。這不太適合於扇區大小因設備不同而不同的閃存設備。
  • Ext2 文件系統沒有提供對基於扇區的擦除/寫操作的良好管理。在 Ext2fs 中,為了在一個扇區中擦除單個字節,必須將整個扇區複製到 RAM,然後擦除,然後重寫入。考慮到閃存設備具有有限的擦除壽命(大約能進行 100,000 次擦除),在此之後就不能使用它們,所以這不是一個特別好的方法。
  • 在出現電源故障時,Ext2fs 不是防崩潰的。
  • Ext2 文件系統不支持損耗平衡,因此縮短了扇區/閃存的壽命。(損耗平衡確保將地址範圍的不同區域輪流用於寫和/或擦除操作以延長閃存設備的壽命。)
  • Ext2fs 沒有特別完美的扇區管理,這使設計塊驅動程序十分困難。

由於這些原因,通常相對於 Ext2fs,在嵌入式環境中使用 MTD/JFFS2 組合是更好的選擇。

用 Ramdisk 掛裝 Ext2fs
通過使用 Ramdisk 的概念,可以在嵌入式設備中創建並掛裝 Ext2 文件系統(以及用於這一目的的任何文件系統)。


清單 6. 創建一個簡單的基於 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 是用於在任何設備上創建 ext2 文件系統的實用程序 — 它創建超級塊、索引節點以及索引節點表等等。

在上面的用法中, /dev/ram 是上面構建有 4096 個塊的 ext2 文件系統的設備。然後,將這個設備( /dev/ram )掛裝在名為 /mnt 的臨時目錄上並且複製所有必需的文件。一旦複製完這些文件,就卸裝這個文件系統並且設備( /dev/ram )的內容被轉儲到一個文件(ext2ramdisk)中,它就是所需的 Ramdisk(Ext2 文件系統)。

上面的順序創建了一個 4 MB 的 Ramdisk,並用必需的文件實用程序來填充它。

一些要包含在 Ramdisk 中的重要目錄是:

  • /bin ─ 保存大多數象 initbusyboxshell 、文件管理實用程序等二進制文件。
  • /dev─ 包含用在設備中的所有設備節點
  • /etc─ 包含系統的所有配置文件
  • /lib─ 包含所有必需的庫,如 libc、libdl 等

日誌閃存文件系統,版本 2(JFFS2)

瑞典的 Axis Communications 開發了最初的 JFFS,Red Hat 的 David Woodhouse 對它進行了改進。 第二個版本,JFFS2,作為用於微型嵌入式設備的原始閃存芯片的實際文件系統而出現。JFFS2 文件系統是日誌結構化的,這意味著它基本上是一長列節點。每個節點包含有關文件的部分信息 ─ 可能是文件的名稱、也許是一些數據。相對於 Ext2fs,JFFS2 因為有以下這些 優點而在無盤嵌入式設備中越來越受歡迎:

  • JFFS2 在扇區級別上執行閃存擦除/寫/讀操作要比 Ext2 文件系統好。
  • JFFS2 提供了比 Ext2fs 更好的崩潰/掉電安全保護。當需要更改少量數據時,Ext2 文件系統將整個扇區複製到內存(DRAM)中,在內存中合併新數據,並寫回整個扇區。這意味著為了更改單個字,必須對整個扇區(64 KB)執行讀/擦除/寫例程 ─ 這樣做的效率非常低。要是運氣差,當正在 DRAM 中合併數據時,發生了電源故障或其它事故,那麼將丟失整個數據集合,因為在將數據讀入 DRAM 後就擦除了閃存扇區。JFFS2 附加文件而不是重寫整個扇區,並且具有崩潰/掉電安全保護這一功能。
  • 這可能是最重要的一點:JFFS2 是專門為象閃存芯片那樣的嵌入式設備創建的,所以它的整個設計提供了更好的閃存管理。

因為本文主要是寫關於閃存設備的使用,所以在嵌入式環境中使用 JFFS2 的 缺點很少:

  • 當文件系統已滿或接近滿時,JFFS2 會大大放慢運行速度。這是因為垃圾收集的問題(更多信息,請參閱 參考資料)。

創建 JFFS2 文件系統
在 Linux 下,用 mkfs.jffs2 命令創建 JFFS2 文件系統(基本上是使用 JFFS2 的 Ramdisk)。


清單 7. 創建 JFFS2 文件系統
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 選項確定閃存的擦除扇區大小(通常是 64 千字節)。 -p 選項用來在映像的剩餘空間用零填充。 -o 選項用於輸出文件,通常是 JFFS2 文件系統映像 ─ 在本例中是 jffs.image。一旦創建了 JFFS2 文件系統,它就被裝入閃存中適當的位置(引導裝載程序告知內核查找文件系統的地址)以便內核能掛裝它。

tmpfs
當 Linux 運行於嵌入式設備上時,該設備就成為功能齊全的單元,許多守護進程會在後台運行並生成許多日誌消息。另外,所有內核日誌記錄機制,象 syslogd、dmesg 和 klogd,會在 /var 和 /tmp 目錄下生成許多消息。由於這些進程產生了大量數據,所以允許將所有這些寫操作都發生在閃存是不可取的。由於在重新引導時這些消息不需要持久存儲,所以這個 問題的解決方案是使用 tmpfs。

tmpfs 是基於內存的文件系統,它主要用於減少對系統的不必要的閃存寫操作這一唯一目的。因為 tmpfs 駐留在 RAM 中,所以寫/讀/擦除的操作發生在 RAM 中而不是在閃存中。因此,日誌消息寫入 RAM 而不是閃存中,在重新引導時不會保留它們。tmpfs 還使用磁盤交換空間來存儲,並且當為存儲文件而請求頁面時,使用虛擬內存(VM)子系統。

tmpfs 的 優點包括:

  • 動態文件系統大小 ─ 文件系統大小可以根據被覆制、創建或刪除的文件或目錄的數量來縮放。使得能夠最理想地使用內存。
  • 速度 ─ 因為 tmpfs 駐留在 RAM,所以讀和寫幾乎都是瞬時的。即使以交換的形式存儲文件,I/O 操作的速度仍非常快。

tmpfs 的一個 缺點是當系統重新引導時會丟失所有數據。因此,重要的數據不能存儲在 tmpfs 上。

掛裝 tmpfs
諸如 Ext2fs 和 JFFS2 等大多數其它文件系統都駐留在底層塊設備之上,而 tmpfs 與它們不同,它直接位於 VM 上。因而,掛裝 tmpfs 文件系統是很簡單的事:


清單 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 上創建 tmpfs 並將 tmpfs 的最大大小限制為 512 K。同時,tmp/ 和 log/ 目錄成為 tmpfs 的一部分以便在 RAM 中存儲日誌消息。

如果您想將 tmpfs 的一個項添加到 /etc/fstab,那麼它可能看起來像這樣:

tmpfs /var tmpfs size=32m 0 0

這將在 /var 上掛裝一個新的 tmpfs 文件系統。


圖形用戶界面(GUI)選項

從用戶的觀 點來看,圖形用戶界面(GUI)是系統的一個最至關重要的方面:用戶通過 GUI 與系統進行交互。所以 GUI 應該易於使用並且非常可靠。但它還需要是有內存意識的,以便在內存受限的、微型嵌入式設備上可以無縫執行。所以,它應該是輕量級的,並且能夠快速裝入。

另一個要考慮的重要方面涉及許可證問題。一些 GUI 分發版具有允許免費使用的許可證,甚至在一些商業產品中也是如此。另一些許可證要求如果想將 GUI 合併入項目中則要支付版稅。

最 後,大多數開發人員可能會選擇 XFree86,因為 XFree86 為他們提供了一個能使用他們喜歡的工具的熟悉環境。但是市場上較新的 GUI,象 Century Software 的 Microwindows(Nano-X)和 Trolltech 的 QT/Embedded,與 X 在嵌入式 Linux 的競技舞台中展開了激烈競爭,這主要是因為它們佔用很少的資源、執行的速度很快並且具有定製窗口構件的支持。

讓我們看一看這些選項中的每一個。

Xfree86 4.X(帶幀緩衝區支持的 X11R6.4)

XFree86 Project, Inc. 是一家生產 XFree86 的公司,該產品是一個可以免費重複分發、開放源碼的 X Window 系統。X Window 系統(X11)為應用程序以圖形方式進行顯示提供了資源,並且它是 UNIX 和類 UNIX 的機器上最常用的窗口系統。它很小但很有效,它運行在為數眾多的硬件上,它對網絡透明並且有良好的文檔說明。X11 為窗口管理、事件處理、同步和客戶機間通信提供強大的功能 ─ 並且大多數開發人員已經熟悉了它的 API。它具有對內核幀緩衝區的內置支持,並佔用非常少的資源 ─ 這非常有助於內存相對較少的設備。X 服務器支持 VGA 和非 VGA 圖形卡,它對顏色深度 1、2、4、8、16 和 32 提供支持,並對渲染提供內置支持。最新的發行版是 XFree86 4.1.0。

它的 優點包括:

  • 幀緩衝區體系結構的使用提高了性能。
  • 佔用的資源相對很小 ─ 大小在 600 K 到 700 K 字節的範圍內,這使它很容易在小型設備上運行。
  • 非常好的支持:在線有許多文檔可用,還有許多專用於 XFree86 開發的郵遞列表。
  • X API 非常適合擴展。

它的 缺點包括:

  • 比最近出現的嵌入式 GUI 工具性能差。
  • 此外,當與 GUI 中最新的開發 ─ 象專門為嵌入式環境設計的 Nano-X 或 QT/Embedded ─ 相比時,XFree86 似乎需要更多的內存。

Microwindows

Microwindows 是 Century Software 的開放源代碼項目,設計用於帶小型顯示單元的微型設備。它有許多針對現代圖形視窗環境的功能部件。象 X 一樣,有多種平台支持 Microwindows。

Microwindows 體系結構是基於客戶機/服務器的並且具有分層設計。最底層是屏幕和輸入設備驅動程序(關於鍵盤或鼠標)來與實際硬件交互。在中間層,可移植的圖形引擎提供對線的繪製、區域的填充、多邊形、裁剪以及顏色模型的支持。

在 最上層,Microwindows 支持兩種 API:Win32/WinCE API 實現,稱為 Microwindows;另一種 API 與 GDK 非常相似,它稱為 Nano-X。Nano-X 用在 Linux 上。它是象 X 的 API,用於佔用資源少的應用程序。

Microwindows 支持 1、2、4 和 8 bpp(每像素的位數)的 palletized 顯示,以及 8、16、24 和 32 bpp 的真彩色顯示。Microwindows 還支持使它速度更快的幀緩衝區。Nano-X 服務器佔用的資源大約在 100 K 到 150 K 字節。

原始 Nano-X 應用程序的平均大小在 30 K 到 60 K。由於 Nano-X 是為有內存限制的低端設備設計的,所以它不像 X 那樣支持很多函數,因此它實際上不能作為微型 X(Xfree86 4.1)的替代品。

可以在 Microwindows 上運行 FLNX,它是針對 Nano-X 而不是 X 進行修改的 FLTK(快速輕巧工具箱(Fast Light Toolkit))應用程序開發環境的一個版本。本文中描述 FLTK。

Nano-X 的 優點包括:

  • 與 Xlib 實現不同,Nano-X 仍在每個客戶機上同步運行,這意味著一旦發送了客戶機請求包,服務器在為另一個客戶機提供服務之前一直等待,直到整個包都到達為止。這使服務器代碼非常簡單,而運行的速度仍非常快。
  • 佔用很小的資源

Nano-X 的 缺點包括:

  • 聯網功能部件至今沒有經過適當地調整(特別是網絡透明性)。
  • 還沒有太多現成的應用程序可用。
  • 與 X 相比,Nano-X 雖然近來正在加速開發,但仍沒有那麼多文檔說明而且沒有很好的支持,但這種情形會有所改變。

Microwindows 上的 FLTK API

FLTK 是一個簡單但靈活的 GUI 工具箱,它在 Linux 世界中贏得越來越多的關注,它特別適用於佔用資源很少的環境。它提供了您期望從 GUI 工具箱中獲得的大多數窗口構件,如按鈕、對話框、文本框以及出色的「賦值器」選擇(用於輸入數值的窗口構件)。還包括滑動器、滾動條、刻度盤和其它一些構 件。

針對 Microwindows GUI 引擎的 FLTK 的 Linux 版本被稱為 FLNX。FLNX 由兩個組件構成:Fl_Widget 和 FLUID。Fl_Widget 由所有基本窗口構件 API 組成。FLUID(快速輕巧的用戶界面設計器(Fast Light User Interface Designer, FLUID))是用來產生 FLTK 源代碼的圖形編輯器。總的來說,FLNX 是能用來為嵌入式環境創建應用程序的一個出色的 UI 構建器。

Fl_Widget 佔用的資源大約是 40 K 到 48 K,而 FLUID(包括了每個窗口構件)大約佔用 380 K。這些非常小的資源佔用率使 Fl_Widget 和 FLUID 在嵌入式開發世界中非常受歡迎。

優點包括:

  • 習慣於在象 Windows 這樣已建立得較好的環境中開發基於 GUI 的應用程序的任何人都會非常容易地適應 FLTK 環境。
  • 它的文檔包括一本十分完整且編寫良好的手冊。
  • 它使用 LGPL 進行分發,所以開發人員可以靈活地發放他們應用程序的許可證。
  • FLTK 是一個 C++ 庫(Perl 和 Python 綁定也可用)。面向對象模型的選擇是一個好的選擇,因為大多數現代 GUI 環境都是面向對象的;這也使將編寫的應用程序移植到類似的 API 中變得更容易。
  • Century Software 的環境提供了幾個有用的工具,諸如 ScreenToP 和 ViewML 瀏覽器。

它的 缺點是:

  • 普通的 FLTK 可以與 X 和 Windows API 一同工作,而 FLNX 不能。它與 X 的不兼容性阻礙了它在許多項目中的使用。

Qt/Embedded

Qt/Embedded 是 Trolltech 新開發的用於嵌入式 Linux 的圖形用戶界面系統。Trolltech 最初創建 Qt 作為跨平台的開發工具用於 Linux 台式機。它支持各種有 UNIX 特點的系統以及 Microsoft Windows。KDE ─ 最流行的 Linux 桌面環境之一,就是用 Qt 編寫的。

Qt/Embedded 以原始 Qt 為基礎,並做了許多出色的調整以適用於嵌入式環境。Qt Embedded 通過 Qt API 與 Linux I/O 設施直接交互。那些熟悉並已適應了面向對象編程的人員將發現它是一個理想環境。而且,面向對象的體系結構使代碼結構化、可重用並且運行快速。與其它 GUI 相比,Qt GUI 非常快,並且它沒有分層,這使得 Qt/Embedded 成為用於運行基於 Qt 的程序的最緊湊環境。

Trolltech 還推出了 Qt 掌上機環境(Qt Palmtop Environment,俗稱 Qpe)。Qpe 提供了一個基本桌面窗口,並且該環境為開發提供了一個易於使用的界面。Qpe 包含全套的個人信息管理(Personal Information Management (PIM))應用程序、因特網客戶機、實用程序等等。然而,為了將 Qt/Embedded 或 Qpe 集成到一個產品中,需要從 Trolltech 獲得商業許可證。(原始 Qt 自版本 2.2 以後就可以根據 GPL 獲得 。)

它的 優點包括:

  • 面向對象的體系結構有助於更快地執行
  • 佔用很少的資源,大約 800 K
  • 抗鋸齒文本和混合視頻的像素映射

它的 缺點是:

  • Qt/Embedded 和 Qpe 只能在獲得商業許可證的情況下才能使用。

結束語

嵌入式 Linux 開發正迅速地發展著。您必須學習並從引導裝載程序和分發版到文件系統和 GUI 中的每一個事物的各種選項中作出選擇。但是要感謝有這種選擇自由度以及非常活躍的 Linux 社區,Linux 上的嵌入式開發已經達到了新的境界,並且調整模塊以適合您的規範從未比現在更簡單。這已經導致出現了許多時新的手持和微型設備作為開放盒,這是件好事 ─ 因為事實是您不必成為一個專家從這些模塊中進行選擇來調整您的設備以滿足您自己的要求和需要。

我們希望這篇對嵌入式 Linux 領域的介紹性概述能激起您進行試驗的慾望,並且希望您將體會擺弄微型設備的樂趣以滿足您的愛好。為進一步有助於您的項目,請參閱下面的「參考資料」,鏈接到有關我們這裡已經概述的技術的更深入的信息。


參考資料

引導

小型分發版

工具鏈

  • Wiki 工具鏈頁面包含到本文提到的所有三個工具鏈的鏈接,還有對它們的評論。
設備驅動程序

有用的工具

  • 請查看 LART 上的 Jflash-linux


  • BinutilsGCCGlibc都可從 Free Software Foundation 下載獲得。


  • 許多有用的下載都可從 Netwinder.org獲得,這是一個致力於 NetWinder 平台上開發工作的志願者站點。


  • 請在 Mark Nielsen 寫得非常棒的 How to use a Ramdisk for Linux一文中閱讀有關 Ramdisk 的所有信息。


  • FLNX 是以 FLTK(快速輕巧的工具箱)為基礎的。
文件系統

GUI

一般參考資料

  • General Public License 或 GPL確保用戶複製、分發和修改軟件的權利。


  • ARM Linux是您了解有關 Linux 用於 ARM 處理器的信息的一個非常好的站點。它由 ARM 的創建者 Russell King 來維護。


  • Penguinppc.org是關於 Linux 用於 PowerPC 系列處理器的的主頁。該站點上有一個關於為基於 PPC 的體系結構建立工具鏈的資料豐富的教程。


  • Linux Devices是一個非常全面的站點,它包含有關 Linux 和嵌入式開發的出版發行、快速參考、新聞和特色報告等各種信息。


  • Silicon Penguin列表站點上擁有嵌入式 Linux 參考資料的詳盡集合。


  • ARMLinux - the book可從 Aleph One 上獲得。您可以定購一本,也可以 在線閱讀


  • 嵌入式 Linux 協會(Embedded Linux Consortium)是一個非贏利的互助協會,它歡迎致力於嵌入式 Linux 領域的開發人員成為會員。


  • IBM 的 Linux wristwatch是運行 Linux 的微型嵌入式設備的示例;本文的作者之一,Vishal Kulkarni 也參與了它的研發。請在 本文FreeOS.com,2001 年 3 月)中閱讀有關它的信息。


  • developerWorks上瀏覽 更多 Linux 參考資料


  • developerWorks上瀏覽 更多無線領域的參考資料

作者簡介


Anand K Santhanam 在印度 Madras 大學獲得計算機科學工學學士學位。自 1999 年 7 月以來他一直在印度為 IBM Global Services(軟件實驗室)工作。他是 IBM Linux 小組的成員,這個小組主要致力於嵌入式系統中的 ARM-Linux、設備驅動程序和電源管理的研究和開發。他感興趣的其它領域是 O/S 本質和聯網。可以通過 asanthan@in.ibm.com 與他聯繫。



Vishal Kulkarni 從印度 Maharashtra 的 Shivaji 大學獲得電子工程的學士學位。自 1999 年 3 月以來他一直在印度為 IBM Global Services(軟件實驗室)工作。在此之前,他曾在美國 IBM Austin 工作了一年半多。他是 IBM Linux 小組的成員,這個小組主要致力於嵌入式設備上的 ARM-Linux、設備驅動程序和 GUI。他感興趣的其它領域是 O/S 本質和聯網。可以通過 kvishal@in.ibm.com與他聯繫。



名詞釋義



何謂嵌入式系統
?

根據英國電機工程師協會的定義,嵌入式系統為控制、監視或輔助設備、機器或甚至工廠運作的裝置。它具備了下列的特性:

1. 通常執行特定功能,與一般桌上型辦公設備或資料庫伺服系統有很大的區別。

2. 以微電腦與周邊構成核心,其規模可由如8051單晶片到先進的x86晶片系統不等。

3. 嚴格的時序與穩定度要求,例如在機器控制上,稍有不慎則可能失去控制,釀成災害。

4. 全自動操作循環,例如斷電時的緊急處理,使覆電後仍能回覆原有的狀態。

嵌入式系統幾乎涵蓋所有微電腦控制的裝置,這些裝置的應用領域從汽車、飛機、火車、太空船、工具機、照相機、消費性及辦公室器具、手機、個人數位助理和其他手持式產品、到包括機器人和玩具等。


何謂ARM?

位 於英國劍橋區的ARM(Advanced RISC Machines),是由1980年代後期,一家叫做Acorn Computer的公司所分出來的,該公司專門研發RISC(精簡指令集)處理器和各種支援晶片。Acron Computer當時生產一款類似Apple II 的個人電腦,稱之為BB Micro,並且在英國大為暢銷。BB Micro和Apple II 一樣,使用8位元的6502 CPU作為個人電腦的核心,緊接著Acron Computer想要將處理器由8位元轉成32位元,並且以不犧牲現有設計的效率為前提來進行,以應用於下一代的個人電腦中,於是這顆處理器開始出貨,並 且以ARM2(代表Acron RISC Machine 2)為名。ARM2也成為Acron Computer的一系列個人電腦的核心,雖然價格低廉但展現優秀的效能。隨後Acron Computer在ARM2中加入快取記憶體,以加速處理器的操作速度,便是ARM3。此時蘋果電腦需要一顆體積小、省電及操作速度非常快,可應用於蘋果 電腦由電池啟動的產品Netwon上的處理器,ARM處理器吸引了蘋果電腦的注意,並且在1990年和Acron Computer合資成立了ARM公司。ARM公司的設計部門完全來自Acron Computer, 並且在1991年2月僱用新的執行長Mr. Robin Saxby 。新公司開始著手設計ARM6的核心和有快取記憶體、寫入緩衝區及完整的記憶體管理單元的ARM610,並將自己定位於微處理器的研發,而不是跨足於晶片 製造,並採取技術授權的商業模式,此一模式從一開始就被證實非常成功。

ARM也投資在軟體工具上,生產為ARM CPU所做的編譯器、組譯器及聯結器。 在1995年所發表的SDT2.0,ARM展示了具圖形使用者介面的計劃管理及偵錯者工具。而ARM之前所大量投資的軟體工具,有一些也成為嵌入式世界的最佳工具。

由於ARM6的工作電壓微5伏特,ARM7支援在3V工作的操作方式和增加嵌入式的偵錯能力。ARM7TDMI是以ARM7為發展基礎,其中包括一組額外的16位元指令集,用來改善已經非常精簡的程式碼,減少所需的記憶體空間。自1995年ARM7TDMI 問世以來它一直是ARM賣的最好的產品,它的價格、工作效能、低的消耗功率和精簡的程式碼等也一直是市場上的領先者,也因此就成為ARM眾多競爭者所想要趕上的產品。

在以von Neuman 架構設計的ARM7之後,ARM嘗試以資料匯流排和位址匯流排分開的Havard 架構來進行新的設計。在ARM的這個設計中,這些獨立匯流排的設計都連接到各自獨立的快取記憶體。這種設計所增加的額外費用非常少,ARM8 便是以這種方法設計的CPU,之後的ARM9也很快的跟隨這個架構,並很快的成為ARM7的後繼者。

ARM 的技術和其他的競爭者有哪些不同呢?ARM的技術最主要的基本優勢應該是效率。在ARM 處理器的核心中,每一個電晶體都是恰到好處的存在,並且提供高於其本身所花費用的利益。反之,當其他的設計者面對各式各樣的需求時,或許會使用稍微快一些 但通常較多電晶體的設計方法時,ARM的設計者通常是尋找最折衷的方法來完成設計。例如最初的ARM2會成為一個低耗電的CPU幾乎是個意外,在當時它的 速度不僅比Intel 286和386 CPU來的快,並且也是當時市面上(如Z80)嵌入式CPU的技術領先者,但是它僅僅使用非常少的電晶體和非常簡單的內部邏輯。

- Back -
何謂ARM-Linux?

ARM Linux主要是由Russell King和其他人的共同努力,將Linux作業系統成功的移植在以ARM處理器為核心的機器上。以下Linux系統好處的敘述,是從Linux核心的檔案中摘錄:
Linux 是UNIX的重新實作,由Linus Torvalds在一群由網路上組織鬆散的駭客群的協助下,所共同完成的作業系統,它的目標為和UNIX的POSIX規格完全相容。它具備有完整UNIX 所有的功能如多工處理、虛擬記憶體、程式庫共享、依需求載入執行檔、執行檔的共享式寫入時拷貝(copy-on-write)分頁機制、適當的記憶體管理 和TCP/IP 網路。

它是在 GNU General Public License 之下可自由的散佈。由軟體自由協會所提供的GNU工具來完成的Linux核心和大部分的程式,所組成的Linux系統都是屬於開放源碼。因為開放源碼,ARM Linux 便是在這種情況下,由世界許多的人和組織所不斷發展而成的。

ARM Linux正在被移植或已經移植到超過100種以上的不同種類機器,包括個人電腦、網路電腦和發展工具。也有以計劃的方式移植Linux到Palm上面和PDAs(如Geofox),如需更多資訊請參考文件頁。



何謂uCLnux?

uCLinux 是Linux 2.0核心的分支,是針對沒有記憶體管理單元的微控制器。


uCLinux 包括什麼?

一份正式的uClinux CD套件,會收到以RPM的格式存在,以方便安裝的uClinux二進位執行碼及原始碼。除此之外,還有展示用的Eagle CAD,一些已經完成uClinux 測試的元件資料及一份程式不大但所有功能正常的SuSE的5.3版套件,這片CD包括在Linux工作站發展所需的所有軟體。


Linux和uClinux的比較?

因 為uClinux是創造來支援沒有記憶體管理單元的微處理器,因此多工處理的能力變得很微妙。絕大部分在uClinux上執行的應用程式,並不需要多工處 理的能力。除此之外,大部分的二進制執行碼和原始碼都會被重新寫過以便更緊縮和減少程式碼,這意味著uClinux和Linux2.0的核心比起來將是非 常非常的小,小到只要保留Linux作業系統的穩定度,優越的網路能力和一優秀的檔案系統支援等主要優勢。


uClinux是一個網路的作業系統環境嗎?

UClinux仍具備有完整的TCP/IP能力,而且支援除TCP/IP外的多數其餘網路協定,可以說幾乎所有網路協定均可支援。事實上,uClinux是一具備支援網路協定的作業系統,對嵌入式系統而言更是完美的選擇。


uClinux支援何種檔案系統?

NFS, ext2,MS-DOS和FAT16/32是目前uClinux所能支援的少數檔案系統。


何處可取得uClinux的相關資料?

可以經由 https://www.uclinux.com/orderdesk/來訂購uClinux的正式版本,另一個選擇,則是因uClinux為開放原始碼的計劃,也可以直接下載原始碼。


為何要使用嵌入式Linux?

Linux 的能力、穩定性、彈性及scalability,再結合它所支援許多微處理機的架構、硬體設備、圖形支援和通信協定,建立了Linux逐漸成為受歡迎的軟 體平台,並被廣泛的應用在各種計劃和產品中。Linux的使用可以延伸到計算性應用的一系列產品,從IBM微小的Linux腕表到手持式裝置(包括PDA 和手機)和消費性娛樂系統到資訊家電產品、簡易型電腦、防火牆、機器人、電話網路建設之設備等和如以群為主的超級電腦。

因為Linux以 開放的和自由的原始碼的形式存在,它的許多差異性和結構及支援的軟體零件是,都是Linux逐步調適和發展以滿足市場和各種應用所需的多變化需求。有小的 程式核心版本和加強即時處理的版本,而儘管最初的Linux是PC架構的作業系統,現在的Linux已經可以架構在各種非x86的CPU上,而且在不論是 否具有記憶體管理單元的CPU,其中包括PowerPC, ARM, MIPS, 68K 和甚至微控制器上。

■推薦閱讀

 1.嵌入式Linux的資源、技術核心與發展課題(EEdesign)
不像Wintel陣營的PC世界,嵌入式Linux的一個很大優勢是它支援多種處理器,而且由於形成一個壯大的開放社群,在這裡有豐富的套件及開發工具, 其中有的是自由軟體,有的是廠商開發的版本。本文將對嵌入式Linux的資源做一介紹。 

 2.uClinux與Linux在ARM9式處理器上上的Context Switching和 IPC效能比較(Linuxdevices)
本篇為uClinux與Linux在ARM9處理器上使用的比較報告白皮書,比較的項目是context switching的速度和IPC (inter-process communication)的速度,這是Samsung在發展采用Linux式Miniket的多功能且不需硬碟camcorder時所做的報告,它的結果會讓你對uClinux的效能有全新的認識。原文:《Context Switching and IPC Performance Comparison between uClinux and Linux on the ARM9 based Processor 

3. Linux如何成為即時作業系統(Metrowerks)
今日的Linux核心標準和可下載的patches已包含許多功能及強化的效能,例如:強化的排程功能、虛擬記憶體、分享記憶體、POSIX Timers/ Asynchronous I/O/ threads、QoS功能、即時訊號等等,在在皆讓Linux更適合用在即時產品的發展上頭,本文將介紹Linux的即時作業系統特色。 原文:《Linux as a Real-Time Operating System 

4. 嵌入式設備上的 Linux 系統開發(IBM)
嵌入式 Linux 開發大致涉及三個層次:引導裝載程式、Linux 內核和圖形用戶介面(或稱 GUI)。在本文中,我們將集中討論涉及這三層的一些基本概念;深入瞭解引導裝載程式、內核和文件系統是如何交互的;並將研究可用於文件系統、GUI 和引導裝載程式的眾多選項中的一部分。

5. Smartphone系統整合技術(EEdesign)
Smartphone結合了手機和PDA的功能,設計上必須在成本和功能上做折衷,因此技術門檻很高。在作業系統軟體方面,Microsoft Windows Mobile和Symbian OS是兩大主流。此外,嵌入式Linux因為成本低廉,已是系統製造商為了降低成本,不得不採用的替代方案。

  • 更多技術文章

1.uClinux如何為無MMU處理器提供一個新選擇(embedded.com)
 原文:《How uClinux provides MMU-less processors with an alternative》

2.以Linux運作低成本、低功率的無MMU處理器 (Linuxdevices)
 
原文:《IRunning Linux on low cost, low power, MMU-less processors》

3.熟悉uClinux/ARM 2.6之系統開發(Samsung)
 原文:《Getting Familiar with uClinux/ARM 2.6》

4. CEO專訪:Arcturus 的D. Jeff Dionne(uClinux推動者)(2004-02-04 / Linuxdevices)
 原文:《CEO Interview: D. Jeff Dionne of Arcturus (and uClinux pioneer)》

5.可以執行多工作業的uClinux(2000-06-11 / Linuxdevices)
 原文:《uClinux DOES multi-task》

6.uClinux式參考設計有助於匯流性設備設計 (2003-02-17 / Linuxdevices)
 原文:《uClinux-based reference design aids convergence device designs》


■嵌入式Linux商用及開放軟體資源
  • 商用套件

AMIRIX: Embedded Linux

ARM-Linux

Coollogic: Coollinux

Coventive: XLinux

Esfia: RedBlue Linux

K-Linux

KYZO: PizzaBox Linux

Lineo: Embedix

LynuxWorks: BlueCat

MontaVista

Red Hat: Embedded Linux

RTLinux

TimeSys Linux

  • 開放源碼計畫資源

Embedded Debian Project

AMSEL

Embedded Gentoo

ETLinux

FREESCO

uClinux

muLinux

PeeWeeLinux


■其他好用資源

ARM Linux
這是瞭解有關 Linux 用於 ARM 處理器的資訊的一個非常好的網站。它由 ARM 的創建者 Russell King 來維護。

Penguinppc.org
這是關於 Linux 用於 PowerPC 系列處理器的的主頁。該站上有一個關於為基於 PPC 的體系結構建立工具鏈的資料豐富的教程。

Linux Devices
這是一個非常全面的網站,它包含有關 Linux 和嵌入式開發的出版發行、快速參考、新聞和特色報告等各種資訊。

Silicon Penguin
列表網站上擁有嵌入式 Linux 參考資料的詳盡集合。

ARMLinux - the book
這書可從 Aleph One 上獲得。您可以定購一本,也可以在線上閱讀。

嵌入式 Linux 協會(Embedded Linux Consortium)
是一個非贏利的互助協會,它歡迎致力於嵌入式 Linux 領域的開發人員成為會員。

uClinux開發者論壇

uClinux/ARM 2.6發展計畫

嵌入處理器和SoC的快速參考指南 (Embedded Processor and System-on-Chip Quick Reference Guide)

The uClinux Directory

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Bluelove1968 的頭像
    Bluelove1968

    藍色情懷

    Bluelove1968 發表在 痞客邦 留言(0) 人氣()