孫立新
(中國民用航空飛行學(xué)院 空中交通管理學(xué)院,四川 廣漢 618307)
在嵌入式系統(tǒng)的使用過程中,或者在軟件開發(fā)過程中,系統(tǒng)軟件可能經(jīng)常被損壞。開發(fā)人員需要能方便地把嵌入式操作系統(tǒng)、文件系統(tǒng)和用戶應(yīng)用程序下載到特定的硬件平臺。目前,通常的做法有:
1)使用專用的仿真器。由于不同的硬件平臺都需要不同的仿真器,比如ARM,MIPS等,所以這種方法不僅昂貴,而且也不通用方便。
2)在Bootloader中增加下載的功能。當采用嵌入式Linux、Windows CE等較為復(fù)雜的操作系統(tǒng)時,一般需要設(shè)計一個獨立的Bootloader程序,對系統(tǒng)進行初始化并引導(dǎo)嵌入式操作系統(tǒng)。但由于不同硬件平臺的差異,會造成軟件開發(fā)和移植困難,如果還要實現(xiàn)從U盤或者SD卡上更新目標文件,難度就更大。
所以,筆者針對這兩種方法的不便,提出了一種通用的更新機制——基于Bootloader的雙系統(tǒng)更新機制。該更新機制是指在嵌入式系統(tǒng)中包含了兩個操作系統(tǒng)的映像,一個用于正常工作,而另一個用作軟件更新或者存儲器分區(qū)管理等。
嵌入式軟件平臺由以下幾部分組成:Bootloader、嵌入式操作系統(tǒng)內(nèi)核(kernel)和文件系統(tǒng)(file system)。其中文件系統(tǒng)是嵌入式系統(tǒng)軟件平臺占用存儲量最大的一部分,也是與用戶開發(fā)最相關(guān)的一部分。它存儲了系統(tǒng)配置文件、系統(tǒng)程序、用戶應(yīng)用程序等。文件系統(tǒng)包括根文件系統(tǒng)映像(例如ramdisk.image.Gz)以及其他類型的文件系統(tǒng)(例如jffs2、cramfs等)[1-2],如圖1所示。
Bootloader是嵌入式軟件中研究較多的領(lǐng)域。
1)Bootloader的開發(fā)
Bootloader的種類有U-BOOT,BLOB和RedBoot等,基本都支持SCC/FEC以太網(wǎng)、OOTP/TFTP引導(dǎo)、IP和MAC的預(yù)置功能[3-4]。其中U-BOOT是功能比較強大,應(yīng)用較廣泛的引導(dǎo)程序,本文中基于STB810的系統(tǒng)也采用U-BOOT。U-BOOT源代碼在sourceforge網(wǎng)站的社區(qū)服務(wù)器中,Internet上有一群自由開發(fā)人員對其進行維護和開發(fā)。
2)Bootloaderd的移植
Bootloader是依賴于硬件而實現(xiàn)的,每個目標板的硬件配置都不完全相同,因此Bootloader程序也都不會完全一樣。關(guān)于Bootloader的移植已有大量的研究成果[5-8]。
除此以外,還有很多成果是基于Bootloader的軟件更新機制的[9-10]。其中在參考文獻[9]中,提出建立雙Boot?loader機制實現(xiàn)從SD卡升級軟件。
目前,嵌入式系統(tǒng)一般都具有能穩(wěn)定工作的操作系統(tǒng),例如Linux,WinCE,uCOS,pSOS等。這些系統(tǒng)根據(jù)特定的硬件平臺做了性能優(yōu)化,并且支持的接口豐富、配置完整。所以,可以在不擴充Bootloader的情況下,通過增加一個裁減后的小系統(tǒng)來支持串口、USB、SD、網(wǎng)絡(luò)接口(http、tftp協(xié)議等)等不同方式地下載升級。這樣設(shè)計,不僅使用方便,而且減小了開發(fā)和移植的難度,提高了系統(tǒng)安全性。
具體方法描述如下:修改Bootloader,在系統(tǒng)啟動前的一段時間內(nèi)(通常為0.1~3 s)檢測特定條件(通常是串口的按鍵,或者是特殊按鍵組合),如果沒有按鍵,正常啟動主系統(tǒng);當有指定的鍵按下,則進入剪裁后的小系統(tǒng),從被支持的接口讀目標文件并寫入FLASH,從而更新主系統(tǒng)。流程圖見圖2,系統(tǒng)空間分配表見表1。
表1 系統(tǒng)空間分配表
在剪裁后的小系統(tǒng)中還可以增加分區(qū)管理和格式化等命令,方便更新操作。也可以利用操作系統(tǒng)中的LCD驅(qū)動以圖形方式顯示操作頁面和操作進度提示等,使方案具有良好的人機接口。
STB810是NXP公司的機頂盒產(chǎn)品方案,主芯片PNX8550包含有一個MI/s的CPU和兩個TriMedia的DSP處理器,已經(jīng)移植了嵌入式Linux操作系統(tǒng),相關(guān)驅(qū)動也已經(jīng)基本完成,比如網(wǎng)絡(luò)、USB、SD、IDE等,應(yīng)用軟件包中包含基本的應(yīng)用演示程序,比如媒體播放、GUI應(yīng)用等。系統(tǒng)中也有一個Bootloader,但該Bootloader的功能較弱。所以,在本方案中采用了U-BOOT作為替代,源代碼易于獲取。
上節(jié)已介紹了Bootloaderd的修改。本節(jié)主要介紹操作系統(tǒng)的剪裁。而剪裁后的系統(tǒng)使用gzip壓縮。
Linux中,一個完整的文件系統(tǒng)主要由/bin,/sbin,/dev,/proc,/etc這幾個必不可少的目錄和其他一些目錄組成(如:/usr,/home,/root,/boot,/lib,/mnt,/tmp,/var等)。
為了裁剪文件系統(tǒng),有必要了解整個文件系統(tǒng)包含的內(nèi)容及其啟動過程。
配置文件/etc/inittab中的指令進行一些初始化工作,如IDE、SCSI、NETWORK、AUDIO、設(shè)置系統(tǒng)時鐘、設(shè)置主機名等;掛載一些必要的文件系統(tǒng):/proc,/sys,/proc/bus/usb;建立設(shè)備節(jié)點;網(wǎng)絡(luò)設(shè)置等。
此外,還有動態(tài)設(shè)備進行管理,當新增加一個設(shè)備時,它會在/dev下創(chuàng)建該設(shè)備的節(jié)點,動態(tài)分配設(shè)備的主設(shè)備號、次設(shè)備號;當設(shè)備拔下來后,則會刪除以上建立的對應(yīng)東西。例如當需要從U盤更新軟件時就可以不剪裁。插入U盤,hotplug自動加載需要的模塊,udev創(chuàng)建相應(yīng)的/dev/sda1等節(jié)點,hotplug向HAL發(fā)消息,HAL收到消息后,根據(jù)配置文件,運行fstab-sync來修改fstab,創(chuàng)建/media的子目錄作為掛載點。
另外,在/opt目錄中,主要是飛利浦的一些應(yīng)用程序,如音視頻播放等。/lib目錄中,有文件系統(tǒng)的一些基本的庫和PNX8550芯片相關(guān)的一些必要模塊。在/usr目錄中,有可執(zhí)行命令、應(yīng)用程序(音視頻播放等)所需要的DirectFB庫文件,以及一些測試程序。這些程序或者庫文件在更新機制中基本不使用,可以剪裁。
文件系統(tǒng)中占空間比較大的主要是/bin,/sbin,/usr/bin,/usr/sbin中的一些可執(zhí)行文件、庫文件以及一些模塊。這部分通常通過Busybox來編譯,重新配置生成/bin,/sbin,/usr/bin,/usr/sbin中的可執(zhí)行文件,以減小這些可執(zhí)行文件的大小。注意,在編譯配置中不用動態(tài)模塊庫,只用靜態(tài)模塊。
文件系統(tǒng)采用initramfs,根文件系統(tǒng)(Rootfs)采用Busybox編譯成vmlinux,再用gzip壓縮,命名為tool.raw(剪裁后的小系統(tǒng)),將Bootloader映像文件命名為boot.raw,將主Linux系統(tǒng)(正常工作時使用的系統(tǒng))命名為linux.raw,這樣Flash的空間映像見表2。
基于Bootloader的雙系統(tǒng)更新機制是利用了一個裁
表2 STB810空間映像表
減的小系統(tǒng),方便實現(xiàn)各種接口的軟件更新機制和存儲器分區(qū)管理功能。當主文件系統(tǒng)損壞時提供系統(tǒng)恢復(fù)能力,提高了系統(tǒng)的安全性,但又不增加成本,并可大大節(jié)省軟件開發(fā)和移植的工作量。
[1]王亞軍,劉金剛.Linux運用于嵌入式系統(tǒng)的技術(shù)分析[J].計算機應(yīng)用研究.2005,22(5):102-104.
[2]詹榮開.嵌入式Bootloader技術(shù)內(nèi)幕[EB/OL].(2006-09-20)[2010-12-20].http://www-128.ibm.com/developerworks/cn/linux/l-loader/.
[3]陳渝,李明,楊曄.源碼開放的嵌入式系統(tǒng)軟件分析與實踐[M].北京:北京航空航天大學(xué)出版社.2004.
[4]張和君,張躍.基于GNU工具的嵌入式Bootloader設(shè)計與開發(fā)[J].計算機工程,2006(8):277-279.
[5]王東,李哲英.U-Boot在S3C44B0上的移植方法[J].北京交通大學(xué)學(xué)報,2005(4):76-80.
[6]孫棣華,趙君杰.U-Boot引導(dǎo)程序可視化配置[J].計算機應(yīng)用,2010,6:177-197.
[7]楊潔,趙剛.嵌入式系統(tǒng)中Bootloader的編譯與移植[J].四川大學(xué)學(xué)報:自然科學(xué)版,2007(8):835-839.
[8]王亞剛.嵌入式Bootloader機制的分析與移植[J].計算機工程,2010,3(6):267-269.
[9]王恒,王颋,王泉,等.基于Bootloader的可靠嵌入式軟件遠程更新機制[J].微計算機信息,2007,12(23):57-59.
[10]李權(quán),鄢萍,賀曉輝.高可靠性的嵌入式軟件現(xiàn)場更新方法[J].計算機應(yīng)用,2010(8):2228-2231.