gem5模拟器提供了四个不同的CPU模型,两个不同的系统模型以及两个不同的内存系统模型,并且支持多种指令集(ARM、ALPHA、MIPS、Power、SPARC和x86),其中可以再ARM、ALPHA和x86三种架构上运行Linux。gem5的许可证是基于BSD的,这就为工业界和学术界的合作搭建了一个好的桥梁。虽然开发一个Full-system的模拟器是很复杂的,但gem5正在借助开源的强大合作力(如mailing lists,wiki,web-based
patch reviews,a publicly accessible source repository)不断完善自身功能。
(一)gem5有四个标签:普遍的面向对象,集成Python,领域特定语言和标准接口的使用。下面来一一讲解它们。
1. 普遍的面向对象
gem5的灵活性就是依赖于面向对象设计。gem5中所有的主要部件都是SimObjects。如下可以看做gem5的一个helloworld:
2. Python集成
虽然gem5中85%用C++写成的,但Python遍布在操作的各个角落,就连标准的main函数都是用Python写的,所有的命令行处理和启动代码也都是Python。
3. 领域特定语言
领域特定语言(DSL)可以带来很大的灵活性。gem5提供了两种领域特定语言:一个为了指定指令集(ISA DSL),另一个为了指定cache一致性协议(SLICC)。
4. 标准接口
它是与面向对象相呼应的,它是面向对象的基础。有两个核心的接口,port接口和message buffer接口。Ports用来连接两个memory对象,如CPU与cache,cache与总线,以及总线与设备和memories,并且Ports支持三种访问数据的机制:timing,atomic和functional。而message buffer与Ports类似,也是提供一个标准的通讯接口,不过它在信息归类(message typing)和存储(message
storage)上与Ports有一些小差别,不过这并不妨碍在将来将二者合二为一。
(二)再来看一下gem5的模拟功能。
gem5中可以选择不同的指令集架构,CPU模型和一致性协议,也能实现interconnection networks, devices 和 multiple systems。我们可以讲指令集与CPU模型进行组合,当然并不是所有的组合都能正常工作。
gem5可以以两种模式工作:System-call模拟(SE)和Full-System模拟(FS)。在SE中,gem5模拟了大部分通用的系统调用( 如read() ),不过目前这种模式还没有加入对多线程的支持。在FS中,我们可以运行OS,这样可以支持中断、异常、特权级别、I/O等,也正因为复杂,并不是所有的指令集架构都能支持FS模式。
再来看一下gem5支持的四种CPU模型:AtomicSimple、TimingSimple、InOrder和O3。前两个没有流水线,InOrder有一个in-order流水线,O3是out-of-order流水型的。
如果要深入了解GEM5,这个网站需要吃透——www.gem5.org。