一种ARM模拟器的实现(一)

本文介绍了一款专注于简化ARM环境、便于深入理解CPU工作方式的自研ARM模拟器。作者详细阐述了模拟器的功能、当前实现状态、测试方法以及版本共享策略。强调了模拟器的核心目标在于仿真软件功能,而非硬件强仿真,适用于Cortex-M3等MCU环境。
摘要由CSDN通过智能技术生成

一、我为什么要实现一个ARM模拟器

    看到我要实现一个ARM模拟器,估计得有人数落我了。主要的理由可能就是现在已经有很多ARM模拟器了,自己再去实现一个岂不是做重复工作(就是有人说的重新造轮子)。确实,现在已有了几款常见的ARM模拟器。比如:QEMU、SkyEye、RTSM、Microsoft Device Emulator等。但这些模拟器都有些不合我的心意。QEMU和SkyEye,似乎都很执着于模拟整个CPU环境,比如总线及设备,而且很在意于匹配Linux系统,所以上来就有硬盘引导之类的东西。但我只需要能够仿真一些软件功能的调试,仿真的是Cortex-M3之类的不需要操作系统的MCU环境。虽然这些需求在QEMU、SkyEye上自然也是可以改的,但是毕竟对原始代码的学习路线比较长。RTSM和Microsoft Device Emulator自不必说了,一个集成在ARM官方的RD-5中,一个是用于WinCE模拟的,定制成我的目标估计很不现实。前几天,有个兄弟帮我找到了另一个ARM模拟器的实现,是维多利亚大学的ARMSim#模拟器。这个模拟器有点奇怪,是加载汇编文件或者.O文件运行,但我试了下,无论输入汇编文件还是.O文件,都提报出错,暂时也做不了什么评估。

    所以,我的首要目的,就是希望能够有个最简单的ARM模拟环境,同时可以方便于我的定制。

    此外,做嵌入式的研发工作也好几年了,之前写过应用,也写过操作系统,算是对CPU的运作有一些了解,但总归不是很深入。自己动手实现一个ARM的模拟器,也可以从中加深对CPU工作方式的理解。

    以上这些,就是我实现一个ARM模拟器的初衷。而且,通过长期的业余投入,目前已经输出了2个版本。如果大家对这个课题有兴趣,不妨一起来讨论一下。如果没有兴趣或不主张自己实现模拟器,那请出门左转或右转,大家互不强迫。

二、功能简介

    本文所涉及的是ARM模拟器内核的动态库。它能够实现基本的ISA模拟和地址映射功能,并且提供了若干个回调接口,允许其他程序通过回调接口扩展成具体的CPU环境。SimARM的目标,只是用来仿真软件。因此,对于硬件的强仿真(比如模拟SPI/IIC之类的操作等)是当前所不支持的。

    本模拟器的实现,是从ARMv4/ARMv5核开始的。理由是ARMv4/ARMv5核的模型十分经典,并且指令系统相对单纯,作为项目的初始阶段是比较合适的。当前,模拟器对ARMv4/ARMv5的基本模拟已完成。以下是当前的规格:

ISA规格

 

 ARM  

 Thumb-1 

 Thumb-2 

备注

 ARM v4  

YES

YES

N/A 

 

ARM v5 

YES

YES

N/A 

 

ARM v6 

目前已实现ARMv6m的Thumb-2的反汇编功能

ARM v7 

 

ARM v8 

 

Instruction Cache 规格

Cache模型 

 2-way set associative 

Cache Line大小 

 256 Byte

Cache 总地址范围 

 1M Byte

备注 

 

Data Cache规格

目前暂不支持DataCache

模拟主频规格

ARM 32位指令模拟主频 

 125MHz

Thumb指令模拟主频 

 85MHz

备注 

 上述模拟主频的数据基于在Intel Core i5-4300U 2.5GHz处理器Windows 8 x64系统上测试得出;
 测试过程挂载了一个流水线监控函数;
 若不挂载任何监控回调函数,则模拟主频可达到185MHz以上

其他

  • 暂未做协处理器仿真,因此所有协处理器指令不被支持,MMU功能不被支持,但可通过总线监控程序模拟MMU;

  • 仿三级流水线流程,不实现更多级流水线以及流水线并行功能;

  • 支持申请多个核心,但暂不支持对等多核协作。

目前,模拟器的运行环境需求如下:

硬件架构 

 Intel x86硬件平台,需要SIMD扩展SSE2支持  

操作系统 

 Windows XP SP2及以上操作系统

最小执行内存 

 260M Byte

备注 

 执行内存主要来源于指令Cache的需求

此外,当前版本的模拟器运行的用户态,因此不需要安装驱动,但也因此其模拟性能会受其他的应用程序的影响。

三、版本、测试、及共享

    本模拟器目前为1.0.1.2版本。版本号的最后一位如果是奇数标识该版本为已经过一定程度的测试,如果为偶数表示版本的测试强度还不足,可能是未稳定版本。

    在本模拟器的测试过程中,最为复杂的测试是对于所有仿真指令的正确性测试。目前,我需要人工来构造能够覆盖被仿真指令所有条件分支的用例,然后通过真机单步执行结果和模拟机单步执行结果的逐一比对,才能验证所有指令仿真的正确性。这个工作量是非常大的。因此,目前我还不能确保每个版本都对指令仿真正确性做逐一验证。若未执行过这些完备验证,模拟器的版本尾号都将置为偶数。

    本模拟器目前共享目标文件。下载地址为:http://download.csdn.net/detail/season_lzw/9124157。模拟器的源代码暂不开放,但我会陆续对其中的技术方案做讲解。

四、关于本类博客文章的后续内容

    前面说到,模拟器的源代码暂不开放。因为目前我还在对模拟器做持续完善,我暂不希望分散精力去应对分裂版本的管理问题。同时,我认为开源的本质目标还是为了知识的交流,但不可否认的现状是很多个人或团体只是将开源当作是免费的物资来源并不做任何知会就将其投入商业用途,这是对他人劳动的不尊重。

    那么,既然是知识交流,我会在本类博客文章的后续内容中逐步公开实现ARM模拟器的技术方法,以及我测得的数据和一些注意事项。希望后续所公开的技术知识对于对于这一课题有技术兴趣的人能够起到帮助。


SimIt-ARM-3.0 给予命令行ARM指令模拟器,短小精悍,是研究ARM处理器的好工具,该模拟器既可以运行用户级别的ELF程序,又可以模拟运行Linux操作系统;提供了简单易用的调试命令,可以逐条跟踪指令的执行。 SimIt-ARM-3.0-gk-20150902.tar.bz2 HowTo 0.what is SimIt-ARM-3.0 SimIt-ARM 3.0 is an instruction-set simulator that runs both system-level and user-level ARM programs, for more about it please read user's guide file. 1.how to build tar jxvf SimIt-ARM-3.0-gk-20150902.tar.bz2 cd SimIt-ARM-3.0-gk ./configure make make install After these steps, the ./build/bindirectory contains the following programs: ema An ARM interpreter. To test the installation was successful type ./build/bin/ema test/wc configure modifiy PATH environment variable: PATH=$PATH:$HOME/SimIt-ARM-3.0-gk/build/bin ; export PATH 2. how to use 2.1 run user-level ARM programs [root@ORA9 SimIt-ARM-3.0-gk]# cd gcc-asm [root@ORA9 gcc-asm]# more hello.c /* * hello.c * Tue Sep 8 10:13:40 CST 2015 */ int main() { printf("hello world\n"); __asm("mov r0,#2\n\t" "swi 0x1\n\t"); // syscall: exit(2); } [root@ORA9 gcc-asm]# arm-linux-gcc -v Reading specs from /usr/local/arm/3.4.1/bin/../lib/gcc/arm-linux/3.4.1/specs Configured with: /opt/crosstool/crosstool-0.28/build/arm-linux/gcc-3.4.1-glibc-2.3.2/gcc-3.4.1/configure --target=arm-linux --host=i686-host_pc-linux-gnu --prefix=/opt/crosstool/arm-linux/gcc-3.4.1-glibc-2.3.2 --with-float=soft --with-headers=/opt/crosstool/arm-linux/gcc-3.4.1-glibc-2.3.2/arm-linux/include --with-local-prefix=/opt/crosstool/arm-linux/gcc-3.4.1-glibc-2.3.2/arm-linux --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long Thread model: posix gcc version 3.4.1 [root@ORA9 gcc-asm]# arm-linux-gcc hello.c -o hello -static [root@ORA9 gcc-asm]# ls -l hello* -rwxr-xr-x 1 root root 520775 Sep 8 10:18 hello -rw-r--r-- 1 root root 160 Sep 8 10:15 hello.c [root@ORA9 gcc-asm]# file hello hello: ELF 32-bit LSB executable, ARM, vers
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值