基于QEMU的全数字仿真环境设计

2016-09-22 03:50罗永红李春雷中国工程物理研究院计算机应用研究所绵阳62900中国工程物理研究院研究生院绵阳62900
环境技术 2016年4期
关键词:外设串口进程

陈 瑀,罗永红,李春雷(. 中国工程物理研究院计算机应用研究所,绵阳 62900; 2. 中国工程物理研究院研究生院,绵阳 62900)

基于QEMU的全数字仿真环境设计

陈 瑀1,2,罗永红1,李春雷1
(1. 中国工程物理研究院计算机应用研究所,绵阳 621900; 2. 中国工程物理研究院研究生院,绵阳 621900)

嵌入式软件测试时需要搭建的测试环境和对硬件板卡的支持是软件测试人员会遇到的重要问题。主要阐述了怎么基于QEMU设计实现全数字仿真环境。通过脚本语言代替复杂的图形界面和测试引擎,以开源的QEMU模拟器作为Cortex-M3处理器的指令集仿真,通过对开发板LM3S9B81的串口仿真为例,实验验证了此全数字仿真环境设计的可行性。

QEMU;全数字;仿真

前言

系统真实运行环境和半实物仿真环境适合于系统功能测试,能够满足实时性要求,但软件的可控性差,软件和硬件故障难于分离,不便于故障的准确定位,而且在对某些系统进行大规模测试时,准备时间长,代价昂贵,可行性差。

全数字仿真平台(即仿真虚拟环境)是通过仿真嵌入式系统中的CPU,控制芯片,I/O,中断等一系列硬件资源,提供了被测软件所必须的硬件环境,从而可以在宿主机上对被测软件进行全面而灵活的测试。被测软件可以完全摆脱对硬件资源的依赖而运行在宿主 PC 机上,能充分利用 PC 机上丰富的资源进行有效全面的验证,建立仿真虚拟环境可为软件的调试运行、故障定位提供便利条件。

1 QEMU介绍

QEMU是一种快速的多体系结构仿真器,通过动态翻译的技术达到了优异的仿真速度。QEMU 还具备在多种不同宿主机上仿真多种不同目标CPU架构的特性,它可以利用在x86架构上仿真目标处理器架构为Cortex-M3的指令集。QEMU具有可扩展,可自定义新的指令集,开源并可移植,仿真速度快的优点。根据以上几点,可以选择使用QEMU进行处理器的指令集仿真,通过建立一个虚拟硬件环境,使得目标系统运行在仿真环境中就好像运行在真实的物理环境一样,它使得构建全数字仿真测试平台成为可能,图1是QEMU的基本框架示意图[1]。

控制器主要由设备管理,中断处理,源文件读取和目标文件的缓存几部分组成,主要负责对目标代码的执行文件的加载,目标文件的缓存,对外设的管理以及对中断控制的仿真。翻译核心是对目标文件的二进制数据的反汇编,以及生成一一对应的且与平台无关的TCG中间码,并将该TCG中间码翻译成目标架构。

步骤一:系统初始化过程中,以二进制文件流的方式加载目标二进制文件,保存文件的基本参数信息,包括文件的代码段、数据段和堆栈段。

步骤二:文件加载后,PC指针指向e_entry程序的入口地址,基本块为翻译单位,目标机的binary->TCG的中间码->宿主机 binary,将生成的翻译块存放到指令Cache中。QEMU采用直接块链技术,即在每一个基本块内部都增加了直接跳转指令。跳转指令的偏移量是通过QEMU的翻译过程动态生成的,既在首次执行到该跳转指令时,不对跳转指令的偏移量做任何设置,基本块代码执行结束后正常返回主循环,并将其对应的翻译块结构体地址以及分支编号保存至索引表中。当QEMU运行至下一基本块时,如果满足热路径算法的条件,则通过索引表找到之前的基本块,并将其跳转指令的偏移设置为下一个基本块代码段的起始地址。在修改跳转指令的偏移值后,之后对该块的运行将不再翻译,而通过跳转指令直接执行。

步骤三:在宿主机上申请一块内存空间进行指令Cache的缓存,将翻译块缓存到指令Cache中。刷新Cache采用最近最少使用的算法,替换掉驻留在Cache中未被使用时间最长的翻译块。

步骤四:linux系统给每个运行进程分配的内存空间为4G,其中0xC0000000到0xFFFFFFFF这个地址段是留给系统使用的,主要用于系统(linux内核)和进程通信和交换数据,用户可以使用3GB的空间(0x00000000-0xBFFFFFFF)。针对目标二进制文件用到的区域块主要包括代码存储区、SRAM和外设存储区,将这三个区域定义成3个数组,对于内存的操作可以映射成对三个数组中变量的操作。

步骤五:QEMU执行翻译块,主要由cpu_loop()函数完成,直至目标二进制文件执行完成退出。

步骤六:中断处理负责响应虚拟外设的中断。当基本快执行完后,程序主循环检查当前的中断位,如果被置位,则响应外设发出的中断。

2 仿真环境架构设计

2.1总体设计框架

图1 QEMU基本框架示意图

图2 多进程设计

多进程设计在整体结构上可以建立如图2所示的结构。将原先虚拟内核,外设模拟,用户接口组成的一个进程分成虚拟机进程与交互进程两个进程。因此,原本不同模块间数据收发,整理,转发的时间同步问题转换为了进程间通信的问题。就可以利用进程通信上丰富且成熟的机制,如管道、共享内存、套接字等等,因此在程序设计实现的复杂度上低于单进程架构。而性能方面,管道和共享内存等机制可以提供接近于单线程的性能。

多进程还会使得系统的内核模块仿真和与用户的交互模块设计完全独立开来。可以使用成熟的开源的CPU仿真器嵌入到集成开发环境,达到软件调试的目的。也因此可以设计多套不同的交互部分,使面对不同应用场景使用。

将QEMU对于Cortex-M3部分的代码精简之后构建动态链接库,作为内核模拟模块,当上位机收到创建虚拟机进程的需求时,动态加载该部分即可实现对目标cpu指令集的仿真。

在内核模块和外设模块之间的数据通信是通过编写虚拟总线服务实现,虚拟外部总线控制器包括串口、CAN、1553B等控制器(目前只以实现串口为例),实现CPU访问虚拟外设,同时连接虚拟内部总线,进行内存单元的管理。同时产生数据的接收和发送中断,实现虚拟外设的数据的读写。虚拟内部总线实现虚拟CPU访问RAM、Flash功能,同时连接虚拟外部总线总线控制器,实现虚拟外设的数据收发。分层设计如图3所示。

应用层:上位机配置管理以资源视图的方式显示,针对各种总线服务进行资源分配及接口连接。

总线服务层:向应用层提供串口、CAN、1553B的总线通信接口,实现各种总线的接入,同时为上层提供发送控制命令,传递消息的功能,实现各个部件之间的协调和控制。

数据分发层:总线交换服务实现总线的仲裁(主从设备),各种总线数据的转发,建立数据接收方和发送方的传输通道,包括数据的单播、广播、组播等功能,连接虚拟外部总线控制器,实现虚拟外设数据的收发控制。将收到的总线数据分发给各虚拟外设,实现数据的通信。

传输层:实现虚拟外设的数据读写以及内部虚拟CPU访问存储仿真的数据通信。

2.2用户接口

全数字仿真环境的用户接口部分就是充当传统软件测试部分上位机的角色,提供测试人员与仿真环境的交互的接口,大多数成产品的全数字仿真环境都会编写图形界面供测试人员使用,本文出于快速开发,减少代码量以及今后分布式架构的可扩展性的考虑,选择Erlang脚本语言代替图形界面。

Erlang是一种通用的面向并发的编程语言。它在软并行系统时具有一下几个优点,进程属于Erlang语言本身所以创建,销毁进程十分迅速,进程在不同体系架构下都具有相同的行为,进程间不共享资源,这就避免了资源竞争的复杂情况,并且只设置了消息作为唯一的进程间通讯的手段,使得其进程间的通讯效率极高。[2]

虚拟机进程通过c语言编写,交互进程为Erlang脚本,图2的进程间的通信可以使用Erlang发布版中的几个库来实现,其中Erl接口(ei)是一套c的代码和宏,可以用它对Erlang的外部格式进行编码和解码,即在Erlang端通过其内置函数编码或者解码一条消息,在C这端通过ei对二进制流进行相应的处理。

2.3外设模拟

通常而言,在全数字仿真环境下,外部设备的仿真也将全部由软件模拟实现。由软件模拟的好处在于可以非常灵活的更改、添加、管理所有外部设备。并且软件具有容易复制分发的特点,也易于快速搭建模拟平台。和对处理器的仿真实现一样,在对外设仿真时,需要对外设的收发机制,内部逻辑,行为特征进行相应的抽象,并据此设计仿真实现的模型[3]。

图3 分层设计

用插件的方式实现,为不同的外设构建动态链接库,虚拟机初始化时按需加载,每个动态链接库对应着一个外设类型,该类型实现类似于面向对象语言的类,在结构体中定义相应的数据属性以及使用函数指针实现相应外设的行为方法和内部逻辑。并且通过向外提供访问其内部结构体的接口,而上位机正是通过这些接口来访问访问到插件的内部数据以及回调外设的内部函数,外设仿真模型如图4所示。

参照上述模型,给出本环境的外设仿真流程:

步骤一:虚拟外设注册过程:创建设备结构体,并挂接在设备树里;

步骤二:调用设备特定的初始化函数来为设备初始化配置空间、分配IRQ号,同时注册设备端口读写函数等;

步骤三:通过消息代理模块(UDP数据收发功能)接收虚拟验证总线上的数据,按照通信协议解析,设置到对应的读寄存器中,并产生接收中断;将要发送的数据按照UDP数据格式打包,通过消息代理发送到虚拟验证总线上的其他节点,同时产生发送中断。

3 仿真环境实验验证

在实验验证的工作中,将以一个串口例程为例,主要验证本次设计的仿真环境架构是否合理,上下位机各个资源的通讯是否正常,提出的外设模型下的外部设备是否能够正常工作,从而证明基于QEMU的全数字仿真环境的设计是正确有效的。

该串口例程的功能为向串口写入数据,如果在真实环境下,可以由串口调试助手接受数据,这里全数字仿真平台由上位机接受数据,并显示在终端上。

步骤一:使用脚本命令启动主节点作为上位机,之后开启另一个终端启动从节点作为虚拟目标机,如图5所示。

步骤二:Erlang脚本下发命令给从节点:插件扫描,设备配置,连接,虚拟机启动。

步骤三:设备管理收到命令之后做消息处理,将虚拟机配置结果上报给主节点,并打印至终端上,如图6所示。

步骤四:将串口例程编译为ELF格式,放入仿真平台测试文件下(相当于实物平台的代码烧录操作),运行结果如图7所示,上位机成功收到例程写入串口的数据。

图4 外设仿真模型

图5 主节点启动

图6 虚拟机配置信息 

图7 终端显示串口输出

4 下一步工作

通过上述设计、实现、验证的工作,证明了本文所设计的全数字仿真测试环境的可行性,但是还有诸多不足和可改进的地方。首先,本环境给出了通用外设的仿真模型,仅仅具体实现了串口总线的仿真,对于大多数的嵌入式被测程序而言,CAN、1553B、以太网等外设的仿真是程序运行的必要条件,之后的工作可以继续完善外设仿真。其次,本次设计的仿真环境因快速开发的原则而放弃了图形界面的设计,导致对于用户交互并不友好。最后,选择Erlang作为上位机框架开发就是看重其优秀的并发性特性,这也为日后拓展分布式,多核仿真的高性能仿真平台预留下空间。

[1] QEMU uesr mannul[EB/OL].[2012-08-01]. http://wiki.qemu. org/mannul/.

[2] Erlang程序设计[M].北京:人民邮电出版社. 2008.

[3]吴守兵,周洋.微机原理·外设·接口[M].北京:清华大学出版社,2002.

陈瑀 男,中国工程物理研究院计算机应用研究所,在读研究生。主要研究方向为:计算机应用技术。

Design of All-digital Simulation Environment Based on QEMU

CHEN Yu1,2, LUO Yong-hong1, LI Chun-lei1
(1. The institute of computer application of CAEP, Mianyang 621900;2. The Graduate School of CAEP, Mianyang 621900)

When the embedded software is tested, it is an important issue to build testing environment and supporting of hardware for software tester. This paper mainly expounds how to design all-digital simulation environment based on QEMU. It takes place of complex graphical interface and test engine by script language, and takes the open source QEMU simulator as the instruction simulation of Cortex-M3 processor. Taking the serial port simulation of the development board LM3S9B81 as the example, the feasibility of the all-digital simulation environment design is verified by experiments.

QEMU; all- digital; simulation

TP302

B

1004-7204(2016)04-0046-05

猜你喜欢
外设串口进程
浅谈AB PLC串口跟RFID传感器的通讯应用
债券市场对外开放的进程与展望
改革开放进程中的国际收支统计
数字电源内部数据传输的串口通信方法实现
USB接口的多串口数据并行接收方法探索
串口技术的实物调试和虚拟仿真联合教学模式
社会进程中的新闻学探寻
俄罗斯现代化进程的阻碍
外设天地行情
外设天地行情