摘要:针对现有嵌入式操作系统学习中存在的问题,设计了一种既适合基本理论学习,又可以进行高级开发实践的学习平台。通过对WRT54 GL路由器硬件的简单改造,使其成为学习开源OpenWrt和Xinu操作系统的优秀平台。平台设计简单易行,简繁得当,费用低廉,是嵌入式操作系统学习的一个好的选择。
关键词:路由器;嵌入式操作系统;OpenWrt;Xinu
引言
近年来,随着嵌入式系统的飞速发展和广泛应用,裸机模式已无法适应日益复杂的系统开发,嵌入式操作系统已经成为开发中不可或缺的核心软件,对其进行学习研究的需求也日益突出。
嵌入式操作系统的学习平台虽然多种多样,但选择一个合适的平台却并不简单。商业系统通常有着完善的支持,但复杂的架构、昂贵的价格和不公开的源代码使得它们难以成为初学者学习的对象。主流的开源操作系统,虽然可以获得源代码实现,但庞大的代码行,使得系统的机理被复杂的细节掩盖,依然令人望而却步。专门的教学操作系统,有针对地简化了代码实现,但又因为缺乏应用实例而缺乏公信力。
此外还存在硬件平台成本过高造成的软硬件脱节的问题,完全脱离硬件平台的软件学习使人难以全面掌握嵌入式系统。基于虚拟环境进行仿真虽然一定程度上解决了这个问题,但是缺少硬件平台的实践终究无法获得较深的感性认识,极易忽视很多真实环境的注意事项。
针对这些问题,本文提出了一种基于路由器设计嵌入式操作系统学习平台的思路,以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各有优缺点。总的来说DD—WRT倾向于关注使用者的感受,因此较为易用,OpenWrt倾向于关注开发者的使用,因此更为开放。
但是就学习研究而言,OpenWrt的扩展性要更胜一筹。现在的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操作系统的平台的过程。整个改造过程简单、易行,可以贯穿整个嵌入式操作系统的学习过程。