一、我为什么要实现一个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系统上测试得出; |
其他
-
暂未做协处理器仿真,因此所有协处理器指令不被支持,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模拟器的技术方法,以及我测得的数据和一些注意事项。希望后续所公开的技术知识对于对于这一课题有技术兴趣的人能够起到帮助。