像 PTLsim 这样的 CAS 模拟器如何实现 x86 硬件的周期精确模拟?

Posted

技术标签:

【中文标题】像 PTLsim 这样的 CAS 模拟器如何实现 x86 硬件的周期精确模拟?【英文标题】:How can CAS simulators like PTLsim achieve cycle accurate simulation of x86 hardware? 【发布时间】:2012-12-24 22:27:52 【问题描述】:

有人能告诉我像http://www.ptlsim.org/ 这样的CAS 软件是如何工作的吗?如果既不知道每条指令使用多少个周期也不知道 CPU 分支预测逻辑的信息,它们如何实现周期精度?还是所有内容都可以通过 NDA 获得?

我想它们可能在缓存被命中或丢失时非常准确(也许我错了,但我认为预测内部算法更容易),但不知道如何实现流水线和超标量,我很困惑如何使模拟周期准确。

因此,理论上是否可以在基于 x86 的硬件上实现 hard rtos?或者应该签署某种 NDA 以便能够估计每条指令所需的时间?

【问题讨论】:

查看常见问题解答,关注他们的“协同仿真”技术。这是通过在主机处理器上实际执行模拟代码来实现的。 @HansPassant 我认为您误解了“协同仿真”的概念。周期精确仿真完全基于用户提供的处理器模型。主机处理器仅用于加速和/或验证模拟。 那只是简单的模拟,没有“co”。 @HansPassant 我同意:这个词具有误导性。也许他们想到了协同程序?谁知道... 英特尔员工不会在 2010 年修复此问题:software.intel.com/en-us/forums/… 与 ARM 相关:***.com/questions/17454955/… 【参考方案1】:

第一个问题:如果既不知道每条指令使用多少个周期,也不知道 CPU 分支预测逻辑,它们如何实现周期精度?

该模拟器确实为足够精确的 CPU 模型提供了周期精确的模拟,但没有为英特尔或 AMD 当前产品提供开箱即用的模型。 Intel 或 AMD 的人员可以访问所需信息,可以创建 RTL 级模型并获得当前处理器的周期精确模拟。英特尔和 AMD 以外的人不能。您仍然可以将公开的信息提供给模拟器并获得合理的结果。这些结果与真实硬件不同。

如果您是软件开发人员并且想要对真实硬件进行基准测试,请使用真实硬件! PLTsim 等模拟器专为(学术)硬件开发人员设计,他们希望在不花费数十万美元购买新芯片的情况下测试新硬件功能。

第二个问题:理论上是否可以在基于 x86 的硬件上实现硬 rtos?

当然理论上是可能的。您需要考虑所有情况下所有输入的每个代码段的绝对最坏情况。实际的问题是像Core 2这样的处理器非常复杂,处理器的状态是巨大的。此外,这些处理器并未设计为在时序方面具有确定性。一个非常硬的 RTOS 必须非常保守。最后,正如您正确观察到的那样,英特尔和 AMD 以外的人无法获得做出这些保守假设所需的所有信息。在实践中,传递最新最好的 cpu 并使用具有确定性时序的较旧、更简单的 cpu 是合理的。

另一方面,如果 RTOS 不需要非常严格的实时性,您总是可以只包括一些安全余量并希望最好。 ;-)

【讨论】:

【参考方案2】:

这不是两个问题的答案;我只回答第二个。尽管总体而言 Mackie 的回答似乎更好,但请随意投票。

硬 RTOS 难以在 x86 上实现。一个可以扼杀 RTOS 承诺的特殊事物是 SMM,即系统管理模式。 CPU 在系统管理中断后进入它,它可能因不同的原因而触发 - 硬件故障,在某些特殊的 MMIO 位置写入,out 指令到某些特殊端口。您无法禁用它,您无法真正预测 SMI 何时发生,并且 SMI 处理程序可能需要很长时间才能完成。

基本上,您对 CPU 何时处于 SMM 状态一无所知,直到您的操作系统因长时间 CPU 处理 SMI 而出现故障。在某些特殊情况下,即使是非实时操作系统也可能成为问题,更不用说硬 RTOS。

还有this thread 可以为您提供更多关于 x86 上 RTOSing 的要点。

【讨论】:

【参考方案3】:

在您链接的网站上有如下声明;

PTLsim 是用于 x86 和 x86-64 指令集的最先进的周期精确微处理器模拟器和虚拟机

直接在它所模拟的同一平台上运行(运行 Linux 的 x86-64 或 x86 机器)

我不清楚这与任何其他 x86 虚拟机技术(例如 QEMU、VirtualBox、VMWare 或 Virtual PC)有何不同,这些技术通过实际直接在硬件上运行指令(以及以核心速度运行)。是模拟器还是虚拟机?在我看来,它们不是一回事。例如,bochs 是模拟器而不是 VM,PTLsim 似乎介于两者之间?

【讨论】:

以上是关于像 PTLsim 这样的 CAS 模拟器如何实现 x86 硬件的周期精确模拟?的主要内容,如果未能解决你的问题,请参考以下文章

如何像 CAS 一样“原子地验证和延迟交换”?

单点登录3 手撕代码模拟CAS实现单点登录

单点登录CAS使用记:实现自定义验证用户登录

go语言中像这样的map如何解析成struct?

如何模拟像 new Date() 这样的构造函数

如何模拟像findOne()这样的mongoose查询?