引言
近年來,隨著嵌入式系統(tǒng)的飛速發(fā)展和廣泛應(yīng)用,裸機(jī)模式已無法適應(yīng)日益復(fù)雜的系統(tǒng)開發(fā),嵌入式操作系統(tǒng)已經(jīng)成為開發(fā)中不可或缺的核心軟件,對(duì)其進(jìn)行學(xué)習(xí)研究的需求也日益突出。
嵌入式操作系統(tǒng)的學(xué)習(xí)平臺(tái)雖然多種多樣,但選擇一個(gè)合適的平臺(tái)卻并不簡(jiǎn)單。商業(yè)系統(tǒng)通常有著完善的支持,但復(fù)雜的架構(gòu)、昂貴的價(jià)格和不公開的源代碼使得它們難以成為初學(xué)者學(xué)習(xí)的對(duì)象。主流的開源操作系統(tǒng),雖然可以獲得源代碼實(shí)現(xiàn),但龐大的代碼行,使得系統(tǒng)的機(jī)理被復(fù)雜的細(xì)節(jié)掩蓋,依然令人望而卻步。專門的教學(xué)操作系統(tǒng),有針對(duì)地簡(jiǎn)化了代碼實(shí)現(xiàn),但又因?yàn)槿狈?yīng)用實(shí)例而缺乏公信力。
此外還存在硬件平臺(tái)成本過高造成的軟硬件脫節(jié)的問題,完全脫離硬件平臺(tái)的軟件學(xué)習(xí)使人難以全面掌握嵌入式系統(tǒng)。基于虛擬環(huán)境進(jìn)行仿真雖然一定程度上解決了這個(gè)問題,但是缺少硬件平臺(tái)的實(shí)踐終究無法獲得較深的感性認(rèn)識(shí),極易忽視很多真實(shí)環(huán)境的注意事項(xiàng)。
針對(duì)這些問題,本文提出了一種基于路由器設(shè)計(jì)嵌入式操作系統(tǒng)學(xué)習(xí)平臺(tái)的思路,以LinKsys WRT54GL路由器作為硬件平臺(tái),選擇開源OpenWrt作為主操作系統(tǒng)用于高級(jí)實(shí)踐開發(fā)的學(xué)習(xí),嵌入式Xinu作為從操作系統(tǒng)用于基礎(chǔ)理論的學(xué)習(xí)。把兩個(gè)優(yōu)秀的嵌入式操作系統(tǒng)集中到同一個(gè)硬件平臺(tái),比較好地解決了當(dāng)前嵌入式操作系統(tǒng)學(xué)習(xí)平臺(tái)存在的功能繁簡(jiǎn)不當(dāng)、軟硬件容易脫節(jié)的問題,同時(shí)大大降低了學(xué)習(xí)成本。
1 平臺(tái)的架構(gòu)設(shè)計(jì)
1.1 硬件平臺(tái)選擇
現(xiàn)在,市面上常用的無線路由器大多采用的是ARM或MIPS的處理器,這些產(chǎn)品本身就是嵌入式系統(tǒng)的典型應(yīng)用。更為重要的是有很多產(chǎn)品不僅有著強(qiáng)大的運(yùn)算能力和豐富的板載資源,而且支持眾多第三方固件,可以通過升級(jí)固件豐富功能,擴(kuò)展能力極佳,作為嵌入式操作系
統(tǒng)的硬件平臺(tái)非常合適。
LinKsys公司的WRT54GL是一個(gè)極易采購(gòu)的經(jīng)典無線路由器,它擁有200 MHz的處理器,板載4 MB Flash和16 MB Ram完全勝任嵌入式開發(fā)的學(xué)習(xí)、研究和開發(fā)。更為重要的是,在網(wǎng)絡(luò)上已有很多為它設(shè)計(jì)的開源項(xiàng)目,使得學(xué)習(xí)資源唾手可得。
1.2 軟件平臺(tái)架構(gòu)
考慮到學(xué)習(xí)研究的需要,源代碼的公開與否是選擇軟件平臺(tái)的首要條件,因此確立了以開源操作系統(tǒng)為選擇目標(biāo)。同時(shí)考慮到功能的平衡——既要能夠用于操作系統(tǒng)基本原理的學(xué)習(xí),又要能夠完成進(jìn)一步的高級(jí)功能學(xué)習(xí),繁簡(jiǎn)得當(dāng)?shù)碾p操作系統(tǒng)的軟件架構(gòu)就成為當(dāng)然的選擇。這樣的架構(gòu)使得既可以在學(xué)習(xí)初期利用代碼較為簡(jiǎn)潔的從操作系統(tǒng)完成理論的學(xué)習(xí)和實(shí)踐,又可以在后期利用功能強(qiáng)大的主操作系統(tǒng)完成進(jìn)階學(xué)習(xí),兩者結(jié)合相得益彰,貫穿整個(gè)嵌入式操作系統(tǒng)的學(xué)習(xí)過程。
1.2.1 主操作系統(tǒng)
在選定了WRT54GL作為硬件平臺(tái)后,自然就需要為其選擇適當(dāng)?shù)拈_源路由操作系統(tǒng)。開源路由操作系統(tǒng)非常之多,常見的有Vyatta、Cle arOS、Endian、Untangle、RouterOS、HyperWRT、OpenWrt、DD—WRT等。其中OpenWrt和DD—WRT獲得了更為廣泛的支持,有著良好的社區(qū)資源,它們都可以被看作一個(gè)獨(dú)立的嵌入式設(shè)備的Linux發(fā)行版,而不僅僅是一個(gè)單一的、靜態(tài)的固件,支持的硬件相當(dāng)豐富,WRT54GL也不例外。
DD—WRT功能強(qiáng)大而且簡(jiǎn)單易用,它重點(diǎn)關(guān)注的是Web配置方式,這使得DD—WRT的Web功能比OpenWrt強(qiáng)大得多,因此DD—WRT的用戶群很龐大。
OpenWrt的優(yōu)勢(shì)是用戶可以隨意地安裝軟件。OpenWrt的包管理提供了一個(gè)完全可寫的文件系統(tǒng),并允許自定義設(shè)備和應(yīng)用軟件包,具有完全定制的能力。
DD—WRT和OpenWrt各有優(yōu)缺點(diǎn)。總的來說DD—WRT傾向于關(guān)注使用者的感受,因此較為易用,OpenWrt傾向于關(guān)注開發(fā)者的使用,因此更為開放。
但是就學(xué)習(xí)研究而言,OpenWrt的擴(kuò)展性要更勝一籌。現(xiàn)在的DD—WRT雖然也可以自己裝軟件,但只能裝在jffs或mmc目錄中,除jffs、mmc、tmp目錄外其他的目錄是不可寫的,而OpenWrt則不存在這些限制。
此外,OpenWrt系統(tǒng)使用和Linux類似的庫文件,比如它所包含的uClibc的C庫使得開發(fā)人員通過簡(jiǎn)單的補(bǔ)丁包即可輕松運(yùn)行現(xiàn)有的Linux程序。而且程序通過TFTP和CFE上傳到路由器后,用戶還可以使用串行口進(jìn)行通信和調(diào)試。因此我們選擇OpenWrt作為主操作系統(tǒng),便于在掌握了操作系統(tǒng)基本理論之后,進(jìn)行高階的學(xué)習(xí)研究。
1.2.2 從操作系統(tǒng)
Xinu操作系統(tǒng)20世紀(jì)80年代中期誕生于美國(guó)普渡大學(xué),目標(biāo)主要是用于操作系統(tǒng)教學(xué)。它是一種小巧、優(yōu)雅的操作系統(tǒng),支持動(dòng)態(tài)創(chuàng)建進(jìn)程、動(dòng)態(tài)分配內(nèi)存等操作系統(tǒng)的功能,有shell命令和I/O函數(shù)。同時(shí)支持TCP/IP協(xié)議,可以管理本地和遠(yuǎn)程文件系統(tǒng)。
除了應(yīng)用于教育領(lǐng)域以外,由于Xinu的體積很小,功能強(qiáng)大,所以也非常適用于嵌人式環(huán)境,現(xiàn)在已被移植到從8位、16位到32位嵌入式處理器平臺(tái)上,并有多個(gè)工業(yè)級(jí)的應(yīng)用,有較好的應(yīng)用價(jià)值。
美國(guó)馬奎特大學(xué)的嵌入式Xinu項(xiàng)目對(duì)其進(jìn)行了相應(yīng)的研究,并將其移植到嵌入式MIPS平臺(tái)。嵌入式Xinu是一個(gè)持續(xù)研究和實(shí)施的項(xiàng)目,當(dāng)前版本支持Linksys公司的WRT54GL和WRT160NL的路由器,以及Qemu虛擬機(jī)。因此我們選擇嵌入式Xinu作為從操作系統(tǒng)進(jìn)行基礎(chǔ)理論的學(xué)習(xí)。
2 平臺(tái)的實(shí)現(xiàn)
2.1 硬件改造
由于WRT54GL無線路由器沒有把串口外接出來,為了便于OpenWrt和Xinu的移植,并能通過控制臺(tái)對(duì)它們進(jìn)行交互調(diào)試,需要對(duì)其進(jìn)行簡(jiǎn)單的硬件改造。
該路由器電路本身就有兩個(gè)UART接口,只是沒有從印刷電路板上用接插件引出來,因此將這兩個(gè)串口引出是平臺(tái)構(gòu)建的第一個(gè)步驟。
首先,需要將印刷電路板和路由器的外殼分離,找到Linksys公司提供的串行接頭連接,它位于電路板的右下角,有10個(gè)針腳支持兩個(gè)串行接口(UART0和UART1),可以用10-pin接插件將這10個(gè)針腳引出。
其次,由于路由器和PC機(jī)串口的電平不同,所以還要進(jìn)行相應(yīng)的電平轉(zhuǎn)換,把路由器的3.3 V電平轉(zhuǎn)換為RS-232的串口電平。這就需要制作一個(gè)轉(zhuǎn)換電路,這里采用的串行接口電平轉(zhuǎn)換芯片為ADM202,參考電路如圖1所示。
然后把引出的串口固定在前面板上,復(fù)原外殼即可,這樣就得到有兩個(gè)外接串口的路由器。使用時(shí)把UART0通過串口線和PC機(jī)的串口相連,通過任意串口通信軟件就可以進(jìn)行數(shù)據(jù)通信了。
2.2 OpenWrt的移植
由于WRT54GL路由器支持第三方固件,所以O(shè)penWrt移植并不困難,加之OpenWrt支持軟件包的定制安裝,不需完全從零開始構(gòu)建,所以可以直接利用現(xiàn)有比較穩(wěn)定可靠的鏡像資源加以改造。當(dāng)然,如果要構(gòu)建相應(yīng)的交叉開發(fā)環(huán)境,從頭做起的話,也可以參考相應(yīng)文獻(xiàn)。由于步驟和Xinu類似,這里不作展開。
2.2.1 部署OpenWrt
首先在www.openwrt.org網(wǎng)站下載WRT54Gsquashfs.bin固件,然后通過路由器管理菜單更新固件,相關(guān)步驟如下:http://192. 168.1.1→Adminisllration→Firmware Upgrade。需要注意的是,需要給PC分配192.168.1.2和192.168.1.254之間的一個(gè)靜態(tài)IP地址,以便使PC和路由器在同一個(gè)網(wǎng)段。當(dāng)路由器重新啟動(dòng)后,telnet到其IP地址為192.168.1.1,并發(fā)出以下命令:
root@OpenWrt:/#nvram set boot_wait=on
root@OpenWrt:/#nvram set boot_time=10
root@OpenWrt:/#nvram commit&&reboot
如果覺得使用命令行配置路由器比較麻煩,還可以添加相應(yīng)的Web GUI包,命令如下:
root@OpenWrt:/#opkg update
root@OpenWrt:/#opkg install luci-light
root@OpenWrt:/#opkg install luci
然后用瀏覽器打開http://192.1 68.1.1,就能夠更容易地配置路由器了。
2.2.2 更新現(xiàn)有OpenWrt
OpenWrt的軟件包定制安裝和標(biāo)準(zhǔn)Linux沒什么區(qū)別,這里只介紹如何更新已經(jīng)運(yùn)行了OpenWrt操作系統(tǒng)的路由器固件的方法。
步驟和部署OpenWrt極為相似,所不同的是不需要運(yùn)行NVRAM命令,另外固件文件名不同。第一次部署路由器固件時(shí),需要用.bin文件,更新升級(jí)已有固件時(shí)則需要用.trx文件。原因是,.bin是將路由器的相關(guān)配置信息和.trx封裝在一起而生成的鏡像,在第一次部署固件鏡
像文件時(shí),需要提供這樣的信息,而在后續(xù)升級(jí)時(shí)則不再需要,用.trx文件即可,命令如下:
root@OpenWrt:/#cd/tmp
root@OpenWrt:/tmp#mtd-r write openwrt-XXX.trx linux
重啟后路由器就重新引導(dǎo)到新版本的固件。
2.3 嵌入式Xinu的編譯與移植
Xinu的移植和完整的OpenWrt移植一樣,涉及從交叉編譯工具環(huán)境構(gòu)成到鏡像生成及部署的一系列工作,下面作簡(jiǎn)要介紹。
2.3.1 構(gòu)建MIPS交叉編譯環(huán)境
移植Linux需要專門的交叉編譯環(huán)境,選擇Linux環(huán)境構(gòu)建基于MIPS架構(gòu)平臺(tái)的交叉編譯工具鏈,如果采用Windows的環(huán)境也可基于Cygwin來構(gòu)建類似的交叉編譯工具鏈,下面的操作需要擁有ROOT權(quán)限。
首先下載binutils,現(xiàn)在可以得到的較新版本是2.2.2,命令如下:
./configure -prefix=/usr/local/project/mipsel-dev-target=mipsel
make
make install
由于這里采用的Linux開發(fā)環(huán)境是ubuntul2.04操作系統(tǒng),它的安全管理會(huì)把警告也強(qiáng)制轉(zhuǎn)化為錯(cuò)誤處理,這就可能造成編譯錯(cuò)誤。因此,還需要為configure添加“-disable-werror”選項(xiàng),或者待配置完后修改Makfile中的對(duì)應(yīng)選項(xiàng)。
第二步是為include目錄建立鏈接。
Xinu有自己的小型庫用于編譯,并不需要完整的UNIX交叉編譯器環(huán)境,但是因?yàn)镚CC在編譯時(shí)需要關(guān)聯(lián)相應(yīng)的頭文件,所以這里還需要建立一個(gè)鏈接,將目標(biāo)平臺(tái)相關(guān)的include和宿主PC機(jī)的include目錄鏈接起來。
mkdir-P/usr/local/project/mipsel-dev/mipsel/usr
In-S/usr/include/usr/local/project/mipsel-dev/mipsel/usr/in-clude
第三步是安裝GNU C Compiler編譯器,設(shè)計(jì)中采用的GCC是最新版本的4.7.2,下載解壓后進(jìn)行編譯安裝。由于ubuntul2.04的環(huán)境,安裝4.6版本以上的GCC需要GMP、MPFR、MPC這三個(gè)庫,所以還需要從網(wǎng)上下載三個(gè)庫的壓縮包。需要注意的是,由于MPFR依賴GMP,而MPC依賴GMP和MPFR,所以要先安裝GMP,其次MPFR,最后才是MPC。這里三個(gè)庫在本設(shè)計(jì)實(shí)際使用的版本分別是gmp5.0.1、mpfr2.4.2和mpc 0.8.1。限于篇幅僅對(duì)安裝gcc-4.7.2作簡(jiǎn)要敘述。
當(dāng)以上步驟都完成,就在宿主機(jī)上構(gòu)建了基于littleendian的MIPS架構(gòu)的gcc cross—compiler。可以看到/usr/local/project/ mipsel —dev/bin/mipsel—gcc,表明安裝成功。
2.3.2 構(gòu)建Xinu鏡像
下載并解壓相應(yīng)的壓縮包,可以看到類似這樣的目錄結(jié)構(gòu):device、lib、loader、system、compile、include、mailbox、shell、test。
和交叉編譯相關(guān)的主要是compile下的相關(guān)文件,由于采用的嵌入式Xinu是最新版本的xinu_mips-2.01,它支持三種不同平臺(tái)wrt54gl、wrt160nl和虛擬器版本的mipsel—qemu。因此根據(jù)我們的硬件平臺(tái),進(jìn)入xinu mips2.01/compile/platforms/wrt54gl目錄,對(duì)其中的文件platformVars作對(duì)應(yīng)修改,去除CFLAGS的-Werror選項(xiàng),目的依然是防止把警告當(dāng)成錯(cuò)誤。另外最重要的一個(gè)設(shè)置是MIPS_ROOT變量,它指出了交叉編譯工具所在的目錄,如MIPS_ROOT=/usr/local/project/mipsel-dev/bin,這需要根據(jù)前面的交叉編譯工具的路徑相應(yīng)調(diào)整。然后在compile/目錄下運(yùn)行make clean和make這兩個(gè)命令,就可以獲得相應(yīng)的鏡像文件xinu.boot。
2.3.3 部署Xinu鏡像
部署并運(yùn)行編譯好的Xinu鏡像的第一步是在PC機(jī)上運(yùn)行TFTP服務(wù)器,它可以將鏡像文件通過網(wǎng)絡(luò)連接傳輸?shù)铰酚善魃稀inux上安裝TFTP服務(wù)器相當(dāng)簡(jiǎn)單,只要下載tftp—server軟件包后安裝即可,這里不再詳述。
安裝完TFTP服務(wù)后,還需簡(jiǎn)單的設(shè)置以使服務(wù)運(yùn)行起來,xinetd是一個(gè)服務(wù)器守護(hù)程序,可以運(yùn)行許多不同類型的服務(wù)器上。當(dāng)tftp服務(wù)正常運(yùn)行,且xinu.boot文件也正確復(fù)制后,就可以進(jìn)行最后的引導(dǎo)工作了。由于路由器默認(rèn)的IP地址是192.168.1.1,所以還需要把PC機(jī)的IP也設(shè)在相同的網(wǎng)段,如192.168.1.2。
這時(shí)已經(jīng)在物理上通過串口將作為后端的路由器和作為宿主機(jī)的PC機(jī)連接起來了,通過相應(yīng)的串口通信程序就可實(shí)現(xiàn)兩者的數(shù)據(jù)交互。如果一切正常,將可以看到路由器的命令提示符CFE》。
命令格式為boot—elf[host ip]:xinu.boot,其中[hostip]就是鏈接了作為后端的路由器的PC機(jī),如CFE》boot—elf 192.168. 1.2:xi nu.boot。
這樣就可以在路由器上將Xinu引導(dǎo)起來,順利的話將看到xsh$提示符。Xinu提供了一些最基本的命令,可以用help來查看。
至此已經(jīng)完成了基本的嵌入式Xinu部署的整個(gè)流程,進(jìn)一步的工作就是修改Xinu的源代碼,重新生成鏡像文件,用boot—elf[host ip]:xinu.boot命令重新引導(dǎo)運(yùn)行新的系統(tǒng)。
結(jié)語
本文詳細(xì)闡述了將WRT54GL路由器改造為適合于學(xué)習(xí)開源OpenWrt與Xinu操作系統(tǒng)的平臺(tái)的過程。整個(gè)改造過程簡(jiǎn)單、易行,可以貫穿整個(gè)嵌入式操作系統(tǒng)的學(xué)習(xí)過程。
責(zé)任編輯:gt
-
嵌入式
+關(guān)注
關(guān)注
5083文章
19131瀏覽量
305495 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6834瀏覽量
123345 -
路由器
+關(guān)注
關(guān)注
22文章
3732瀏覽量
113843
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論