姓名:屈彦维
学号:16020610026
引自:http://lw.3edu.net/qrs/lw_46749.html
嵌牛导读:综述开放源码的嵌入式仿真环境SkyEye:介绍SkyEye的背景、目标和存在的意义,对目前SkyEye本身进行简要的技术分析;介绍SkyEye上已经移植成功的操作系统和典型应用。讲述SkyEye正在开展的工作和将来的发展计划。
嵌牛鼻子:SkyEye 仿真 μClinuxμ/OS-II Linux 嵌入式系统
嵌牛提问:如何创造个开放源码的嵌入式仿真环境
嵌牛正文:
1 SkyEye的目标与意义
1.1 SkyEye产生的背景
操作系统是软件产业的基础和龙头,能左右软件产业发展的方向,是世界软件产业最大的利润来源。对于后PC时代和普适计算(pervasive computing)而言,嵌入式系统无处不在,其中关键的软件核心技术包括嵌入式操作系统和网络互联中间件等。
对于想进行嵌入式系统软件开发和学习,或者想研究嵌入式Linux等操作系统和一些底层系统软件(如TCP/IP等)的研究和开发人员来说,可能存在如下几方面的问题:①经常苦于经费不足,缺少足够的硬件开发板和完善的软件开发环境;相关的书籍对一些最新软件的分析还不够全面,无法深研究和开发嵌入式软件。②高层次的软件设计和开发一般不用过多考虑底层硬件的实现细节,如果直接处于一具体的硬件环境下,在开发和研究中可能会陷入硬件的具体细节中不能自拔,而不能把精力放到高层次的软件设计和开发上。③如果硬件开发环境不太稳定(这种情况经常见到),且对身体的硬件不是很了解,则可能在排除问题上花费大量不必要的时间。
对于想了解、学习一般操作系统的实现原理、Linux/μClinux操作系统或TCP/IP等系统级软件的实现的人员,目前一般采用的方法是看书和读源代码。这是一种静态的学习方法,但效率较低,比较枯燥,缺少一种动态和亲自实践的感觉。要想深入分析和开发软件,就要动手编程,不能只是看看书,读读代码,只有通过亲手实践才能够掌握软件设计的核心内容。
上面所指出的问题和需求促使了SkyEye项目的诞生。
1.2 SkyEye的目标和意义
SkyEye是开源软件(OpenSource Software)项目,中文名字是“天目”。SkyEye的目标是在通用的Linux和Windows平台实现一个仿真集成开发环境,模拟常见的嵌入式计算机系统;可在SkyEye上运行μClinux以及μC/OS-II等多种嵌入式操作系统和各种系统软件(如TCP/IP、图形子系统、文件子系统等),并可对它们进行源码级的分析和测试。SkyEye的推出具有下面三方面的意义。
①通过SkyEye仿真集成环境可以很方便地进入嵌入式系统软件学习和开发的广阔天地中。尤其对于缺少嵌入式硬件开发环境和软件开发环境的用户来说,它将是一个非常有效的学习工具和开发手段,因为SkyEye的整个软件系统都是Open Source的,且基于GPL协议(μC/OS-II除外)。因此,如果要学习Linux操作系统或者进行嵌入式系统开发,但苦于没有硬件支持,SkyEye仿真环境软件是一个很好的选择!
②如果想研究与具体硬件无关的系统软件(如TCP/IP协议栈等),采用SkyEye可以有效地提高工作效率,因为你可以直接在μCOS-II和μClinux for SkyEye上进行开发和调试,而与具体硬件打交道的各种Driver已经存在,且有源码级调试环境,只需关心高层的逻辑设计和实现就可以了。
③SkyEye本身作为一个开放式的项目体系,可以划分为多个独立的子项目系统。通过参与SkyEye的各个子项目,与大家共同交流、协议,可以进一步学习、分析、精通Linux内核,掌握ARM嵌入式CPU编程。
在32位嵌入式CPU领域中,ARM系列CPU所占比例相当大,而ARM7TDMI是其中使用最广泛的CPU之一,因此,SkyEye首先选择了ARM7TDMI作为仿真的目标CPU。目前,SkyEye上可运行并进行源码级调试的有μClinux、μC/OS-II操作系统和LwIP(一个著名的嵌入式TCP/IP实现)、ARM Linux等系统软件。SkyEye可用于学习、分析、开发这些系统软件,了解ARM嵌入式CPU编程,而这一切都可在一个集成环境中完成。如果能够改进SkyEye本身,则大家对ARM、8019Ethernet网络芯片等硬件的了解也会更深入。
SkyEye并不能完全取代开发板等硬件的功能,但通过它可以比较容易地进入到嵌入式软件开发的广阔天地中。由于SkyEye建立在GDB基础之上,使用者可以方便地使用GDB提供的各种调试手段对SkyEye仿真系统上的软件进行源码级的调试,还可以进行各种分析,如执行点分析、程序执行覆盖度分析等。由于SkyEye提供了源代码和相关文档,有经验的用户完全可以修改和扩展SkyEye来满足自已的需求。
2 SkyEye的技术分析
2.1 SkyEye总体结构
SkyEye基于GDB/ARMulator,模仿了一个完整的嵌入式系统,目前包括CPU、内存、I/O寄存器、时钟、UART、网络芯片、MMU、Cache,将来还会仿真LCD、USB等各种硬件。在SkyEye上运行的操作系统和各种系统软件“意识”不到它们是在一个虚拟的计算机系统上运行。
SkyEye从总体上分为四个层次。
①用户接口模块:包括命令行用户界面和图形用户界面,及时处理用户的输入命令,并把相关调试数据输出给用户。
②符号处理模块:主要处理执行文件的头信息,解释执行文件中嵌的debuger调试信息,管理符号表,解析源代码表达式,定位源代码中的语句位置和机器码的位置关系等。
③目标控制模块:主要完成执行控制(如执行断程序,设置中断条件等),程序栈结构分析,对具体目标硬件的控制(如本地调试、远程调试和仿真调试的控制)。
④目标仿真模块:主要是模仿计算机系统中的主要硬件(包括CPU、内存和各种硬件外设等)的执行,对执行文件的机器指令进行解释,并仿真执行每一条机器指令,产生相应的硬件响应。
2.2 SkyEye模拟的硬件介绍
目前,SkyEye仿真的CPU包含不带MMU的AT91X40和带MMU的ARM720T,它们都是基于ARM7TDMI CPU内核的。SkyEye还模拟了其它硬件外设,如串口、网络芯片、内存、时钟、网络HUB等。SkyEye的CPU仿真主要完成对ARM指令集处理、寄存器操作和CPU流水线处理等的仿真。
ARM720T具有MMU(Memory Management Unit),即存储器管理单元,是用来管理虚拟内存系统的操作。MMU的两具主要功能是:
*将虚地址转换成物理地址;
*控制存储器存取允许,MMU关掉时,虚地址直接输出到物理地址总线。
MMU本身有少量存储空间存放从虚拟地址到物理地址的匹配表,此表称作TLB(Translation Lookaside Buffers)。TLB表中保存的是虚地址及其对应的物理地址、权限、域和映射类型。当CPU对一虚拟地址进行存取时,首先搜索TLB表以查找对应的物理地址等信息。如果没有查到,则进行查找Translation Table,称为TTW(Translation Table Walk)。经过TTW后,将查到的信息保存到TLB,然后根据TLB表项的物理地址进行读写。
MMU/Cache的仿真主要是依据ARM720T处理器的体系结构进行的。ARM720T可以看成ARM7TDMI加上MMU/Cache模块,主要是仿真控制MMU/Cache的寄存器结构、TLB结构、Cache结构、Translation Table Walk的控制逻辑以及在此基础上内存的读取操作。
对于网络部分,SkyEye仿真的是兼容NE2000的8019as以太网网络芯片,支持8位数据通路,仿真实现了远程DMA信道和本地DMA信道两个部分。本地DMA完成控制器与仿真网络的数据交换,主处理器(Host)收发数据只需对远程DMA操作。当主处理器要向以太网络发送数据时,先将一帧(frame)数据经过远程DMA信道,送到以太网络控制器中发送缓存(Ring Buffer),然后发出传送命令。以太网络控制器在送出前一帧的数据后,继布完成此帧的发送。以太网络控制器接收到的数据通过MAC比较后,由FIFO存到接收缓冲区,收满1帧后,以中断或缓存器标志的方式通知主处理器。
为了有效支持网络仿真,SkyEye还设计了一个虚拟HUB-vnet,可以在一台Host主机上支持多个在SkyEye上运行的OS实例进行网络的通信互联,从而更有助于针对网络方面的开发和研究。
3 SkyEye上已经移植成功的OS
3.1 μClinux
μClinux是应用于嵌入式设备的一个Linux版本,是主要针对不带MMU的CPU而设计的Linux系统。ΜClinux系统对于内存的访问地址都是实际的物理地址。操作系统对内存空间没有保护(这实际上是很多嵌入式系统的特点),各个进程实际上共享一个运行空间(没有独立的地址转换表)。目前,SkyEye上可以运行μClinux的2003年最新版本。
3.2 μC/OS-II
SkyEye作为一个基于Atmel AT91X40开发板的仿真环境,在它上面可以移植各种适合地嵌入式开发应用的操作系统,将μC/OS-II移植琶SkyEye上是我们对此做的又一次尝试。ΜC/OS-II是一个简单、高效的嵌入式实时操作系统内核。自从1992年以来,已经被应用到各种嵌入式系统中。目前,它可以支持x86、ARM、PowerPC、MIPS等众多体系结构,并有上百个商业应用式系统中。目前,它可以支持x86、ARM、PowerPC、MIPS等众多体系结构,并有上百个商业应用实例,其稳定性和可用性是经过实践验证的。同时,它的源代码公开,任何人都可以从www.ucos-ii.com的网站上获得全部源码以及其在各种体系结构平台上的移植范例。无论是通常学习μC/OS-II来了解实时操作系统的构造,还是直接使用它来针对具体应用进行开发,都是非常方便和可行的。目前,SkyEye支持的μC/OS-II内核为2.5.1版。
3.3 ARM Linux
ARM Linux属于Linux标准发行内核中的一个分支,支持MMU的ARM系列CPU,如ARM720T、ARM920T、Intel StrongARM等。我们目前在SkyEye上仿真的CPU型号为CPU内核是ARM Linux内核选择的本系结构为CLPS711x/EP72lx,它支持ARM20T、UART串口等硬件,都是SkyEye目前仿真的硬件。目前SkyEye已经成功运行了版本为2.4.18的ARM Linux。有关ARM Linux的更多信息请访问http://www.arm.linux.org.uk/。
4 SkyEye目前支持的网络协议栈
4.1 μCLinux上的TCP/IP
μClinux上面有完整的TCP/IP协议栈,但缺少对SkyEye的网络仿真芯片(仿真兼容NE2000的8019as)的驱动程序。我们实现的驱动程序主要包括了初始化、中断处理、接收数据包的处理、发送数据包的处理等工作,再加上SkyEye的虚拟HUB-vet的协议,使μClinux on SkyEye的多个实例之间、实例与主机之间可以进行TCP/IP通信。
4.2 μC/OS-II上的LwIP
μC/OS-II本身没有TCP/IP协议栈,目前的一些第三方TCP/IP支持都是完全商业化的,很少给出源代码,影响了μC/OS-II的研究和推广。通过把开放源代码的TCP/IP协议栈LwIP移植到μC/OS-Ii上来,就获得了一套可免费研究、学习的嵌入式网络软件平台。其系统示意图如图1所示。
LwIP是瑞士计算机科学院(Swedish Institute of Computer Science)的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。LwIP的含义是Light Weight(轻型)IP协议。LwIP可以移植到操作系统上,也可以在无操作系统的情况下独立运行。我们目前使用的是LwIP的最新稳定版V0.5.3。
LwIP协议栈在设计时就考虑到了将来的移植问题,因此把所有与硬件、OS、编译器相关的部分独立出来,放在/src/arch目录下。因此,LwIP在μC/OS-II上的实现就是修改这个目录下的文件,其它的文件一般不应该修改。
我们在SkyEye中所仿真的网络芯片是NE2000,所以目前实现的网络设备驱动是针对NE2000的,其它类型的网络芯片驱动可以在LwIP的网站上找到。现在LwIP已经顺利运行在μC/OS-II上了,目前可以从Host主机和SkyEye上运行的μC/OS-II+LwIP顺利进行TCP/IP的通信。
4.3 更多的TCP/IP协议栈
除了LwIP之外,还有很多开源的嵌入式TCP/IP协议栈。它们各有各的特点,有些功能较全面,有些占用资源出奇的少,能适合不同场合的需要,而且多接触一些不同的思路,对协议和编码能有更好的理解。其中的代表有tinyTCP、ucIP、uIP等,它们的基本思路应该都是一致的。SkyEye小组希望能有列多对TCP/IP协议栈感兴趣的人参与进来,特别是ucIP,实际上它是专门为μC/OS-II设计的。
5 SkyEye上已经实现的简单应用
5.1 LwIP上的Echo服务器
做完LwIP的移植修改工作以后,就可以在μC/OS-II中初始化LwIP,并创建TCP或UDP任务进行测试了。值得注意的是:LwIP的初始化必须在μC/OS-II完全启动之后也就是在任务中进行,因为它的初始化用到了信号量等与OS相关的操作。
LwIP提供了两种API,供用户使用这个协议栈。
第一种是BSD API。这种API非常像BSD标准UNIX中的socket API,所以对其这样命名。它跟普通的socket API一样,是基于open-read-write-close模型的。它提供了一种标准的方法来使用LwIP协议栈。但这种API效率较低,消耗资源较多,因此不推荐使用。
第二种称为RAW API。这种API接口实际上是直接使用了LwIP协议栈中的回调函数(call back functions),从而使应用程序和协议栈代码能够更好地集成在一起,运行同一个线程即任务中。RAW API相对于普通BSD API来说,速度更快,消耗内存资源更少;唯一的缺点是编程复杂,对程序员的要求高。考虑到我们是在嵌入式设备中工作,这样的缺点是可以接受的。事实上,BSD API就是用RAW API来实现的。
利用Berkley API实现的tcpecho_thread是一个TCP Echo服务器,监听7号端口,这实际上是实现了RFC中最简单Echo协议:收到什么,就往回发同样的内容。编译运行后,用ping IP地址命令可以得到ICMP reply响应。用telnet IP地址7(登录7号端口)命令可以看到Echo Server的回显效果。说明ARP、ICMP、IP、TCP协议都已正确运行。
5.2μC/OS-II只提供了操作系统内核,用户要自己添加文件处理、人机界面、网络接口等重要部分。大部分人认识OS都是从这里开始的。
由于SkyEye下的仿真串口UART已经实现了中断方式的接收(实际是从键盘接收输入)和输出(实际上是输出到终端屏幕),所以实现一个类似Bash的简化版Shell并不困难。其本质思想就是:Shell作为一个μC/OS-II下的任务,工作于内核之外,占用一个任务号。它接收用户输入的字符,存储到缓冲区,并回显到屏幕上,以回车键为用户输入的结束信号,随后解析用户输入的命令名称、参数,调用相应的命令函数。一直到这个命令函数运行返回,才继续Shell的人机交互界面。
我们目前在μC/OS-II下实现的Shell被命名为Genie Shell。它实现了最基本的命令输入、解析参数、调用命令函数功能,以及两条示例性的命令。这个Shell的特色是采用了一些面向对象的思路来实现Shell的各种命令。Genie Shell把每个命令看成一个对象,对象的属性是命令名,而对象的方法就是命令的执行函数本身。用户输入命令及参数后,将参数传递给对象的方法并执行。要Shell中增加一条命令,就是增加一个对象,并实现这个对象的方法,以利于今后做进一步的扩充。
5.3μClinux上的应用程序
目前μClinux-dist-20030305已经可以在SkyEye上运行。其中的sash(shell)、ping、ifconfig、telnet,telnet server、ftp、ftp server、boa(http server)、mount with nfs support等主要的应用程序都可以成功地运行在SkyEye中,而且不需要对应用程序进行任何修改。
6 SkyEye正在开展的工作