|
Step by Step 構建嵌入式Linux系統平臺1 J& S- D2 j) g9 y
: p3 I; X; U5 Q0 前言
. Y9 k4 {7 ^* F$ o9 Y8 a8 b# D& V嵌入式系統的商品化作業系統十分豐富,如Palm OS、VxWorks、pSOS、Neculeus和Windows CE等。高端嵌入式系統要求許多高級的功能,但其價格也相對昂貴,一般用戶難以接受。微軟的Windows CE也有此類功能,卻不具備大多數嵌入式系統要求的即時性能,而且難以移植。# J6 r0 L, W2 u7 U; K/ h0 {
Linux為嵌入式系統提供了一個極有吸引力的選擇,對於嵌入式系統而言,性能、成本和可靠性是最至關重要的三個因素。首先,眾多文獻資料表明,Linux是當前可獲得的最簡捷、最快速的作業系統,其性能優越之處,是把圖形處理為一個用戶級的應用,圖形可根據需要被選擇是否運行。Linux系統中存在適度複雜的圖形介面,但是它們並沒有與作業系統的內核緊緊捆綁在一起,圖形介面可按需求關閉。這樣就可以在Linux內核上運行專門為嵌入式系統定制的圖形系統,從而獲得優越的性能。其次,Linux 系統源代碼完全公開,可以用非常便宜的價格得到各種Linux分發版,不必考慮許可成本,將用戶從許可證的限制中解脫出來,無需去為資金短缺而煩憂。 Linux能正常運行於記憶體缺乏,容量緊張的系統中,減少在硬體升級上的開支。另外,在系統穩定性方面,Linux幾乎不崩潰,Linux的穩定性是由於它沒有像其他作業系統一樣內核極其龐大。考察資料表明,Linux與其他Unix系統和大型作業系統如VMS、IBM大型機等一樣具有相同的可靠性。在上述優勢之外,Linux還擁有眾多硬體支援的特點和強大的網路支援功能。正因為Linux在價格、性能、穩定性以及用戶定制等方面的突出優勢,用它來構建系統操作平臺是一個很不錯的解決方案。
+ E8 C/ M+ ]$ y6 l" e' W: I" |
5 t5 R( k5 E2 S& A9 [' f" G1 開發中的關鍵問題及解決方案9 Z) _3 S: c* O! @& F! m- {( J- |8 Q" t
1.1 硬體及軟體環境
0 |6 h+ L" h$ j3 t. WLinux 系統的硬體環境以PC104卡為核心,卡上集成美國國家半導體公司(NS Geode)GX1 300MHz CPU,SVGA/LCD/LAN介面以及增強型IDE硬碟介面,支援CompactFlash卡。硬碟和光碟機接至PC104的IDE1口,設置跳線使硬碟為主設備(master),光碟機為從設備(slave),CompactFlash裝在IDE2口,設為主設備,這樣Linux識別 CompactFlah卡為/dev/hdc,而硬碟和光碟機分別為/dev/had,/dev/hdb.我的Linux開發系統是Red Hat 7.2版,通過PC104上的光碟機安裝在硬碟上。
- f9 C R2 G2 @/ i! ~CompactFlash卡容量為32M,如果系統的BIOS支援自動檢測,應該可以直接探測到它。如果不行的話,需要自己輸入卡的各項參數。確保不要帶電插拔CompactFlash卡,因為這可能導致卡上資料的丟失。0 Y! u1 N# F- }
由於像Red Hat或Mandrake這樣的Linux分發版體積龐大(如果帶X-Windows基本都在1G以上),是不可能裝在容量只有32M的 CompactFlash卡上的。目前有許多小型的嵌入式Linux版本,比較有名的有:
: a! C M" J1 q# ^ETLinux — 設計用於在小型工業電腦,尤其是 PC/104 模組上運行的 Linux 的完全分發版。/ g) Z4 W. c' y8 }: ?4 ?' E: Z" V
LEM — 運行在 386 上的小型(<8 MB)多用戶、網路 Linux 版本。
3 K' S0 J/ k9 c, k2 m) rLOAF — "Linux On A Floppy"分發版,運行在 386 上。7 @& L( N: W( j: }
uClinux — 在沒有 MMU 的系統上運行的 Linux。目前支持 Motorola 68K、MCF5206 和 MCF5207 ColdFire 微處理器。
6 R! d* O! K( C; U6 \出於深入瞭解Linux系統運行環境和機制的想法,建議自己構建Linux系統,這對於將來系統內核版本的升級和應用功能的拓展很有好處。選擇Red Hat 7.2的Linux版本。
p/ V4 S5 ^0 H. D8 ?
' e$ t; c& M8 e7 L; z7 [' K1.2 系統分區和格式化% M) C x. t- Y6 U7 X
首先,需要在CompactFlash卡上建立分區和格式化,在Linux下用fdisk命令可以在CompactFlash卡上創建分區,命令格式為fdisk /dev/hdc,然後用mke2fs命令創建ext2檔系統.
, {, m `6 h7 P9 B: K! z5 Z1.2 系統分區和格式化
7 q# g$ U, E2 y" m: m/ m _) G首先,需要在CompactFlash卡上建立分區和格式化,在Linux下用fdisk命令可以在CompactFlash卡上創建分區,命令格式為fdisk /dev/hdc,然後用mke2fs命令創建ext2檔系統.5 i4 v& R6 }: r% r; f7 {
1.3 編譯內核
2 k1 r1 U$ u! E6 r7 }/ k接下來要做的事情是編譯一個自己的內核。內核負責管理系統的進程、記憶體、設備驅動程式、檔和網路系統,決定著系統的性能和穩定性。從技術上而言, Linux 是一個內核,而且只是一個內核。其餘我們通常稱之為 "Linux" (例如一個 shell 和編譯器)的部分實質上只是整個套裝軟體的一部分,它們從技術上而言是與 Linux (內核)分開的。選擇與開發系統一樣的內核版本2.4.7,在Linux內核版本發佈的官方網站 http://www.kernel.org 上可以找到內核源代碼。+ c1 y E! v4 d7 ^
在編譯內核的時候,由於內核是在特定的機器上使用的,所以應該對機器的情況瞭若指掌。另一方面,為了降低過高的複雜性,可以不用kernel module支援,把所有需要的東西直接編譯到內核�。IDE支持是必不可少的,因為Linux認CompactFlash卡為IDE硬碟,Frame buffer的支援也是必要的,這來源於GUI系統—MiniGUI的要求,網路支援可以不要,但是如果認為顯示幕將來有這方面的要求也可以把它加上。! s5 R: b% T$ }& k( P
1.4 創建根檔系統(Root Filesystem)
% m+ S' y- v V# ]9 B& o6 r% |' _ U在編譯好內核後,需要在CompactFlash卡上創建根檔系統。每台機器都有根檔系統(一般在本地盤中,當然也可以在RAM盤或網路盤中),它包含系統引導和使其他檔系統得以mount所必要的檔,根檔系統應該有單用戶狀態所必須的足夠的內容。還應該包括修復損壞系統、恢復備份等的工具。- s4 _4 p, y. F3 I: U7 b
如果有一個任務比其他任務更能簡化從頭構建 Linux 根檔系統過程的話,那就是構建和安裝 BusyBox 套裝軟體。BusyBox 是一個可執行檔,它提供許多其他常用命令行工具的功能,所有這些功能都合為一體。BusyBox 的文檔聲稱構建一個有效系統所需要的全部就是 BusyBox 和"/dev、/etc 以及內核"— 而且他們沒有開玩笑。4 z/ _. n/ k1 R0 o& o9 K* @8 [& o' S# {
Busybox 編譯出一個單個的獨立執行程式,就叫做 busybox。但是它可以根據配置,執行 ash shell 的功能,以及幾十個各種小應用程式的功能。這其中包括有一個迷你的 vi 編輯器,系統不可或缺的 /sbin/init 程式,以及其他諸如 sed, ifconfig, halt, reboot, mkdir, mount, ln, ls, echo, cat ... 等等這些都是一個正常的系統上必不可少的。但是如果我們把這些程式的原件拿過來的話,它們的體積加在一起,讓人吃不消。可是 busybox 有全部的這麼多功能,大小也不過 100K 左右。而且,用戶還可以根據自己的需要,決定到底要在 busybox 中編譯進哪幾個應用程式的功能。這樣的話,busybox 的體積就可以進一步縮小了。Busybox的具體編譯和配置方法請參閱Busybox的官方文檔,用戶可以在http://www.busybox.net/上找到.
- {" S8 Y; Q) o5 a: W; q4 x系統啟動後內核調用的第一個進程是/sbin/init。init進程是系統所有進程的起點,內核在完成核內引導以後,即在本線程(進程)空間內載入 init程式,它的進程號是1。init程式需要讀取/etc/inittab檔作為其行為指標,inittab是以行為單位的描述性(非執行性)文本,inittab檔至少應該包含下麵幾行:
2 m% V6 Q8 j7 o::sysinit:/etc/init.d/rcS //運行系統公共腳本
3 t% a% e/ G+ Z/ H::respawn:/bin/sh //立即進入shell環境' v y4 A3 ^* l' ^0 D
::ctrlaltdel:/bin/umount -a //捕捉Ctrl+Alt+Del快捷鍵,退出系統
6 [) R2 `7 |. J. v) s3 p6 L由於init進程第一個執行的腳本檔是/etc/init.d/rcS,編輯rcS檔:4 }4 `9 z# }8 p4 k. f7 {/ ?7 j2 @
#! /bin/sh" b9 u2 W7 G1 R" p! ` r
mount -a* i4 [- `- L* {( f! q% f
接著還需要編寫/etc/fstab檔:
% I: c+ `; ` L- l( z+ W1 Sproc /proc proc defaults 0 0/ ]2 ? u4 s) f% `. p" s' d
none /var/shm shm defaults 0 0 |
|