嵌入式操作系统移植的软件仿真研究
摘 要:嵌入式系统开发要依赖真实的硬件平台,所以进行开发的成本较高。本文研究用软件仿真的方式来模拟各种硬件开发平台,使得开发者和学习者在模拟环境中进行嵌入式操作系统的移植工作,为在硬件平台上的移植以及后续的开发工作打下良好的基础。本文分析了常见的仿真平台,并给出uclinux在Skyeye上的移植过程。
关键词:嵌入式操作系统;移植;仿真;Skyeye;Armulator
中图分类号:TP316.2;TP391.9
嵌入式开发的首要任务是在嵌入式硬件平台上安装配置嵌入式操作系统,由于嵌入式硬件平台的异构性和多样性,加之嵌入式操作系统种类较多,导致嵌入式操作系统的移植往往比较复杂和容易出错。而且,嵌入式开发和实验平台成本较高,使得实验机会相对较少。因此本文讨论使用软件仿真的方式代替真实硬件平台,以便可以在缺少硬件平台的情况下掌握嵌入式操作系统移植的方法,提高在真实硬件平台上的成功率。由于仿真软件不能模拟硬件平台的所有特性,而且在硬件平台上的开发流程依赖真实的硬件特性,与仿真环境有一定区别,所以最终的仿真结果还需要在硬件平台上测试。
1 常见嵌入式仿真软件
嵌入式仿真软件是在宿主机上建立起一个内核与外设均可配置与裁剪的模拟平台,能进行指令级的模拟,操作系统和软件能在仿真软件上运行,就像在真正的硬件系统上一样。将仿真软件应用到嵌入式软件的开发与测试中,可以让软件和硬件开发同步进行,缩短开发周期;可以根据设计需要选择外设和芯片型号,构建新的嵌入式系统;可以提供比真正硬件环境下更丰富的测试环境,可以避免直接使用硬件测试带来的风险;能够方便的进行调试。嵌入式仿真软件中最核心的部分是指令模拟器,可以模拟ARM指令的执行过程。常见的嵌入式仿真软件有ARM公司的ARMmulator,清华大学Sky Eye项目中的指令模拟器,Linux上的开源软件GDB ARMulator等。ARM公司针对ARM相关应用开发和调试提供了一个开发软件套装ARM Developer Suite(ADS)。本文主要对ARMulator和skyeye进行介绍并研究嵌入式操作系统uClinux在skyeye上的具体移植方法。
2 ARMulator简介
通常所说的ARMulator有两种,一种是GDB/ARMulator,是国际开源组织的程序调试工具GDB自带的模拟器。另一种是ARM公司自己推出的它包含在在其集成成开发环境ADS中的ARM模拟器。他们都是指令集模拟器,需要和在通x86体系结构计算机上的运行的调试器软件连接,得以实现模拟ARM体系结构和指令集,并且给出了ARM程序的软件仿真开发和调试环境。除了能够仿真ARM处理器的体系结构和指令集,ARMulator还可以其他硬件结构如存储器和外围设备,例如中断控制器和定时器等,这样就模拟了一个进行嵌入式开发的最小子系统,另外使用者还可以扩展添加自己的外设。
通过分析ARMulator的源代码,我们可以看到它是由一个一个的模块(module)组成的,其中起核心作用的模块主要有:处理器核心模块;存储器模块。以及一些外设模块,如:中断控制器仿真模块;定时器仿真模块,用来为系统提供定时中断;堆栈跟踪器模块;显示管模块,等等。开发人员可以通过修改已有模块来生成满足特定需求的模块,也可以按照给定的接口规范编写出符合应用需求的其他外设仿真模块。而且,在ARMulator上可以很好的移植μC/OS-II操作系统。μC/OS-II是一个嵌入式实时操作系统内核,包含了任务调度、任务管理、时间管理、内存管理和任务间的通信与同步等基本功能。研究人员可以在ARMulator上移植和调试μC/OS-II,甚至可以在其上完成一些开发工作,这样就可以为在实际嵌入式硬件平台上移植和开发打下基础。
3 SkyEye概述
SkyEye是一个比较完整的嵌入式仿真软件环境,目前可以仿真大部分主流的嵌入式开发板和外部设备。SkyEye中的ARM模拟器是在GDBARMulator基础上进行开发和完善的。SkyEye是一个源代码开放的开源项目,由清华大学发起,支持windows系统和linux系统,目前已维护到2.0版本。SkyEye的目标是在常用的Linux平台上仿真多种主流的嵌入式开发板和外部设备,而在windows中是通过mingw和mysys构建GNU环境来实现对Skyeye的支持,从而建立一个可扩展的硬件模拟框架。SkyEye是指令级模拟器,可以模拟多种嵌入式开发板,可支持多种CPU指令集,而在SkyEye上运行的OS意识不到它是在一个虚拟的环境中运行,而且开发人员可以通过SkyEye调试操作系统和系统软件。
3.1 整体架构
SkyEye可以模仿多种完整的嵌入式计算机系统。其内部结构按功能可以分为四大部分:User Interface负责与用户的接口;FlagManagement负责符号管理;Target Controlling负责目标控制;Target Smiulating负责对目标进行模拟。在这四个部分中,最核心最重要的部分是目标模拟部分,它实现了对SkyEye硬件各个方面的模拟,并仿真执行每一条机器指令,体现了SkyEye硬件模拟器中的模拟逻辑。
3.2 Target Smiulating的功能结构
SkyEye目标模拟部分是整个仿真环境的关键,它包括以下几个主要模块:
(1)初始化模块:此模块的功能是实现对模拟硬件的配置和初始化,在模拟硬件开始运行前,需要修改配置文件中各选项的参数来进行配置和初始化。
(2)处理器模拟模块:模拟CPU指令执行过程、模拟内存管理单元和缓存、模拟协处理器。
(3)输入输出模拟模块:模拟各种外设的行为,主要包括模拟系统输入输出模块、模拟网络芯片模块、模拟LCD模块等。
(4)MEMORY模拟模块:此模块的主要功能是初始化内存,加载二进制镜像文件,模拟RAM和ROM的读写过程,此模块不涉及具体的CPU和开发板。
3.3 SkyEye的配置信息
Skyeye的配置信息包括静态配置信息和动态配置信息。他们都存在于SkyEye目标模拟模块中。
SkyEye的静态配置信息最为关键的数据结构是skyeye_config_t,它包含了SkyEye模拟的整个硬件的静态配置,skyeye_config_t结构中包含了开发板配置信息、CPU核心配置信息、内存图配置信息、网络配置信息和显示屏配置信息等与模拟硬件紧密相关的信息。
SkyEye的动态配置信息最为关键的数据结构是ARMul_State结构,它保存着SkyEye中随模拟的硬件运行而不断改变的硬件数据。通过分析ARMul_io的数据结构,可以了解如何一步一步的为某个具体的开发板添加虚拟硬件。
3.4 SkyEye的执行过程分析
SkyEye的执行按执行时间顺序可分为初始化配置过程和模拟执行过程两个阶段。第一阶段所做的工作包括:加载操作系统的可执行文件;根据skyeye.conf配置文件中的参数对模拟硬件进行配置;加载skyeye.conf配置文件中的所有BinaryImage格式文件;由GDB加载调试信息;由GDB加载操作系统可执行文件中的代码段和数据段等;执行相关模拟硬件的初始化函数。第二阶段所做的工作是根据具体硬件的配置参数,开始执行具体的硬件模拟过程。
对于输入输出硬件模拟部分,SkyEye把这一部分抽象了出来,建立了一个独立的I/O抽象层。然后再根据各种基于ARM的具体的CPU和开发板实现具体 I/O处理模拟。这样做是因为具体的CPU和开发板都有自己的各不相同扩展,这些扩展与硬件系统的I/O有很大的关系,这样做可以最大程度地减少代码冗,并且使结构和模块化更清晰,同时可以降低因开发板多样性带来的开发难度。
4 使用SkyEye建立嵌入式开发环境
由于Skyeye已经相对比较完善,可以仿真的开发板较多,本文选用Skyeye作为测试环境来分析嵌入式操作系统在仿真环境下的移植过程。
首先需要安装配置Skyeye开发环境,为下一步的一直工作做准备。
4.1 安装SkyEye
本文选用宿主机操作系统为ubuntu10.04,该版本为SkyEye开发团队测试通过的安装平台。SkyEye并不是在所有发行板上做测试,所以可以选用一个经过官方测试的发行版以避免在搭建平台过程中遇到未知问题。
(1)下载skyeye的发行包:http://sourceforge.net/projects/skyeye/files/skyeye/
以root权限登录ubuntu,用tar xvjf 命令解压下载的SkyEye发行包。
(2)编译安装程序
#./configure --prefix=/opt/skyeye
#make lib
#make
# make install_lib
# make install
需要说明的是,其中configure为配置编译环境,设置安装路径,make lib用来编译第三方的库,make来编译SkyEye的源代码
4.2 SkyEye的目录结构
SkyEye安装完后在opt目录下会生成以下目录:Bin目录用来存放SkyEye的工具软件。如nandflash镜像的制作工具mknandflashdump,SkyEye为命令行应用程序,对代码覆盖率结果文件进行格式转换的prof_convert工具,在xterm终端来显示串口的输出的uart_instance工具等等。Include目录中存放的是开发SkyEye插件时所用到的头文件。Info目录中存放的是info格式的文档。Lib目录中存放的是SkyEye的核心库文件libcommon.so和其他一些以动态库文件方式存在的插件。Testsuite中存放的是测试用例文件。
5 在SkyEye中模拟uClinux内核的移植
5.1 建立交叉编译环境
与具体开发板对应的SkyEye平台安装配置完成之后就可以进行uClinux操作系统的移植工作。移植前非常重要的准备工作就是建立交叉编译环境。嵌入式开发板资源有限,无法对操作系统进行编译,所以必须在其他平台上编译出嵌入式开发板上能够运行的操作系统代码,这就是交叉编译。仿真的嵌入式开发平台面临同样的问题。
交叉编译环境就是为了解决如何在宿主操作系统上生成在开发板上运行的代码的问题。在这里我们的宿主操作系统是ubuntu10.04。需要对将要运行在开发板上的 uClinux 的源代码重新编译,生成可以在SkyEye上运行的二进制文件。交叉编译环境是几个程序的集合,这些程序运行在宿主机器上,包括编译器、连接器等。在宿主机器上使用这些程序就能生成在开发板上运行的二进制代码。一些开源组织已经开发出了一些交叉编译工具,一般称之为交叉编译工具链。在本文中使用了ARM-ELF-TOOLS这个交叉编译工具链,首先下载arm-elf-tools-20040427版本,开发人员只需要在根目录下执行./arm-elf-tools-20040427.sh后,就可以在/usr/local/bin中生成以arm-elf 开头的可执行文件,其中 arm-elf-gcc 就是交叉编译器。
5.2 编译Linux内核
下载uClinux最新版本uClinux-dist-20121024.tar.bz2
将uClinux-dist-20121024.tar.bz2解压,然后进入解压后的目录uClinux-dist。
执行内核配置命令:make menuconfig
选择
Vendor/Product: GDB/ARMulator
Kernel Version: linux-2.6.x
Libc Version: uC-libc
保存退出
#make dep
#make
5.3 在Skyeye中运行uClinux
首先在uclinux-dist目录下添加文件skyeye.conf。
根据模拟使用的平台修改相应内容。
例如
cpu :arm7tdmi
mach: at91
mem_bank: map=M, type=RW, addr=0x00000000, size=0x00004000
mem_bank: map=M, type=RW, addr=0x01000000, size=0x00400000
mem_bank: map=M, type=R, addr=0x01400000, size=0x00400000, file=images/romfs.img
mem_bank: map=M, type=RW, addr=0x02000000, size=0x00400000
mem_bank: map=M, type=RW, addr=0x02400000, size=0x00008000
mem_bank: map=M, type=RW, addr=0x04000000, size=0x00400000
mem_bank: map=I, type=RW, addr=0xf0000000, size=0x10000000
lcd: state=on
然后执行
#./(skyeye目录)/binary/skyeye -e (uClinux目录)/linux-2.6.x/linux
6 结束语
目前的嵌入式硬件平台的仿真软件已经可以仿真一些主流的开发板,为嵌入式开发和学习提供了高效的低成本的实验环境,使得开发人员在没有硬件环境的情况下也能熟悉嵌入式硬件开发平台的结构,掌握嵌入式开发的方法。但是现在的嵌入式仿真软件还不成熟,易用性有待进一步提高,同时与真实的硬件平台有着一定的差距,不能完全仿真硬件的各种特性,最终的开发还是要在真实硬件平台上实现。因此开发人员应该采用软件仿真与硬件实现相结合的方式来提高开发效率并保证开发的可行性。
参考文献:
[1]陈渝等.源码开放的嵌入式系统软件分析与实践[M].北京:北京航空航天大学出版社,2004.
[2]沈沙等.uclinux操作系统在嵌入式SOC平台上的移植.计算机工程与应用[J].2004,40(26):104-108.
[3]Michael.Kang.SkyEye用户手册.[EB/OL].http://sourceforge.net,2010.
[4]uClinux in the GDB/ARMulator.http://www.uclinux.org.
[5]陈渝,杨晔,李明,等.嵌入式系统仿真环境SkyEye[J].电子设计应用,2004(2).
作者简介:李鑫(1979-),男,讲师,研究方向:嵌入式系统。
推荐访问: 移植 嵌入式 仿真 操作系统 研究