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