gem5有两种基本模式
FS:
能够启动完整的操作系统
建模硬件设备
中断,例外, 特权指令,故障处理函数。
SE:
用来运行单个应用,一系列指令在MP/SMT上。
建模用户可见的ISA和常见的系统调用
模拟系统调用,通过调用主机操作系统。
简化的地址翻译模型,没有调度
这两个模式是在编译时进行选择的,尽管代码没有很大差别。
你所关注的就是一个对象(C++或者python对象)
从SimObject基类继承而来。
基类包含创建的一般代码,配置参数,命名,检查点。等等。
针对对象类型的统一的基于方法的API
CPU, cache, memory
跨实现的插入兼容性。
功能性,详细的CPU模型
传统的cache VS 间接索引cache
很容易复制,多核,多个系统。
关于event
标准的事件队列timing模型。
全局逻辑时间,用tick计算
与实际时间没有固定关系
在我们的例子中通常以皮秒计量【百亿分之一秒】
每一个object调度它自己的事件。
可以做详细程度和性能的trade-off
现在你知道一个事件驱动的模拟器是如何工作的了,simulator从事件队列取出事件,object会产生事件,object又把它产生的新事件加入到事件队列中。
例如:
一个cpu通常按照固定的时间间隔来调度事件,
每个周期或者n个皮秒
如果stalled或者idle就不会调度
关于端口
端口是把MemObjects链接在一起的方法。
每个MemObjects子类都有它自己的端口子类。
这些端口子类用来给相应MemObjects子类发送packets
每对MemObjects都是通过一对端口连接的。
函数对来负责在端口之间传输packets。
sendTiming() ------recvTiming()