摘 要 嵌入式系統的特點決定了它具有功能的專用性,而不能作為一種通用的電腦系統。基於Linux作業系統開發嵌入式產品,必須對它的啟動程式進行定製。本文研究了Linux作業系統的啟動過程,並給出了如何為嵌入式Linux系統添加使用者自己的啟動服務,以及指定開機後啟動並執行主功能程式的方法。 關鍵詞 嵌入式 Linux 啟動程式 一、嵌入式系統的概念及特點[1] 引用電氣工程師協會IEE給嵌入式系統下的一個定義:嵌入式系統是用來控制或監視機器、裝置或工廠等大規模系統的裝置。但是後來隨著嵌入式系統的發展,這個定義就變得不是很準確。比如說像手機、PDA及電子詞典之類的小型裝置,它們均由內部的嵌入式系統控制,但是卻不可稱之為大規模的系統。 有些文獻這樣下定義我覺得比較確切:嵌入式系統是電腦軟體與硬體的綜合體,它是以應用為中心,以電腦技術為基礎,軟硬體均可裁剪,能夠適應實際應用中對功能、可靠性、成本、體積、功耗等嚴格要求的專用電腦系統。 嵌入式系統具有以下幾個特點: 1、 嵌入式系統是先進的電腦技術、半導體技術以及電子技術與各個行業的具體應用相結合的產物。也就是說嵌入式系統並不像通用電腦那樣通用,而是與各待業的特定應用相關聯的,每行每業的嵌入式系統要實現的功能也不一樣。因此,在嵌入式系統上沒有哪個公司的作業系統和處理器能夠壟斷市場。 2、 嵌入式系統實現的功能單一,通常是面向使用者、面向產品、面向特定應用的,一般只實現某行業的特定功能。 3、 成本低、體積小、功耗低及可靠性高,在運行速度及儲存容量上有一定的限制。 4、 嵌入式系統本身不具備在其上進一步開發的能力,必須要在相關的開發平台上開發。 5、 全自動操作迴圈,一直重複地執行一個特定的程式 嵌入式系統的靈魂應該說是它的嵌入式作業系統,本文使用的是嵌入式Linux,硬體基礎是基於x86的嵌入式主板。由上述嵌入式系統的特點可知,為了讓嵌入式系統具有一個產品或儀器的特性,不能讓像通用電腦那樣開機後進入案頭系統,而是要運行指定服務和一個特定的使用者應用程式。本文將如何讓Linux開機後執行指定服務和運行一特定的使用者程式進行探討。 二、Linux系統的啟動過程 讓我們先瞭解一下Linux系統啟動的過程。當引導程式(如LILO)載入Linux核心映象啟動時,它先進行核心的初始化工作,主要是檢測整個硬體環境。核心初始化完成後,系統就啟動init進程,它是系統的第一個使用者級進程。Linux系統具有許多運行層級,它由檔案/etc/inittab檔案決定,各層級的功能如下: 0:終止或停止系統的運行 1:單一使用者模式 2:多使用者模式,但無網路功能 3:多使用者模式且有網路功能 4:保留,使用者可以定義自己的啟動模式 5:圖形介面登陸模式 6:重新啟動系統 init進程運行後,它會訪問/etc/inittab檔案,該檔案確定系統運行於上面的哪個層級。由於嵌入式系統的特性,我們要讓系統運行於層級1上,即單一使用者模式,這隻要在/etc/inittab檔案的id:3:initdefault行,將3改為0即可。同時每個層級還對應了一個啟動各種服務的指令碼目錄,一般在/etc/rc.d/下面。 接著init進程又分別啟動/etc/rc.d/rc.sysinit和與等級n相對應的/etc/rc.d/rcn.d目錄裡的初始化進程,最後init會運行使用者登陸程式,這時在終端上就會顯示login:的登入資訊,使用者登入成功後會啟動shell程式,shell啟動後,它會讀取並執行檔案/etc/profile,/etc/bashrc,和使用者主目錄下的檔案.bashrc,這些檔案負責建立使用者自己的環境。 三、設定特定服務及開機啟動程式 如前所述,添加指定服務,定製特定的啟動程式,就從設定檔/etc/rc.d/rcn.d和/etc/profile入手。 1、添加指定的服務:是指在系統啟動時進行一些使用者所需要的操作,如初始化使用者應用程式或使用者開發的新硬體等等。可以增加自己的指令碼程式來完成這些工作,主要步驟如下: (1) 仿照系統目錄/etc/rc.d/init.d裡的任何一個指令檔的格式自己編寫一個啟動服務指令檔。 (2) 將寫好的指令檔拷貝到/etc/rc.d/init.d目錄下。因為/etc/rc.d/rcn.d只是/etc/rc.d/init.d的一個連結,故要將真實的檔案先拷到後者的目錄下。 (3) 在相應的運行層級n的/etc/rc.d/rcn.d下建立該指令檔的連結。如運行層級為2,則n=2,目錄即為/etc/rc.d/rc2.d。假如該指令碼名為initform,連結名定為my_initform,則鍵入如下命令即可:ln –s /etc/rc.d/init.d/initform /etc/rc.d/rc2.d/my_initform。 完成以上幾步後,系統開機後就會自動執行指令碼initform裡的服務。 2、運行特定使用者應用程式:這裡主要是指GUI應用程式,如果原系統啟動後直接進入案頭系統,則要將傳統型程式在相應指令碼中屏蔽,然後修改/etc/profile指令碼定製使用者自己的程式。步驟如下: (1) 在startx指令碼中將運行相應的案頭系統程式屏蔽。例如案頭系統程式名為qvwm(紅旗嵌入式Linux的案頭系統),則修改內容如下: …… # xinit /usr/bin/qvwm #加個“#”表示將這行指令碼屏蔽掉 (2) 修改/etc/profile,啟動使用者應用程式。如使用者應用程式名稱為start_initform,且在目錄/root/ 下,則在它的末尾加上如下幾行內容: …… export LC_ALL=zh_CN.GB2312 #設定中文化環境 cd /root/ #切換到應用程式目前的目錄 xinit ./start_initform #運行指定的使用者應用程式 修改完成後,重新啟動系統,則當系統初始化完後,會執行使用者指定的服務,且最後運行使用者應用程式,達到嵌入式系統的要求。 參考文獻 1 李善平,劉文峰,王煥龍. Linux與嵌入式系統. 清華大學出版社,2002 2 鄒思軼. 嵌入式Linux設計與應用. 清華大學出版社,2002 3 王學龍. 嵌入式Linux系統設計與應用. 清華大學出版社,2001 4 於明儉,陳向明,方漢. Linux程式設計權威指南. 機械工業出版社,2001 5 聯想軟體超星空工作室. 精通Linux系統管理與應用開發技術. 清華大學出版社,2001 6 李主琛. Linux物件導向視窗進階編程. 科學出版社,2001 7 徐千洋. Linux 函數庫參考手冊. 中國青年出版社,2002 附:一個開機啟動的執行個體 假設你編譯出的應用程式名稱字是“write”,這個就是你想開機後自動啟動並執行程式。 想要實現的系統的啟動順序為: ①vivi,②kernel,③root檔案系統,④你的程式“write”,只需要重新做檔案系統即可。 需對現有檔案系統進行兩處修改: 1)將你的程式“write ”拷貝到系統根目錄下,變更檔屬性(輸入命令:chmod 777 write) 2)修改檔案 rootfs/usr/etc 下的 rc.local 檔案(該檔案裡指定了檔案系統啟動完後,要啟動的一些程式) 在其倒數第三行添加 /write 如下 /write cd /Qtopia/bin ./qpe -qws 3) 重新製作檔案系統./mkcramfs rootfs 2410f.cramfs 4) 重新燒寫檔案系統2410f.cramfs |