2

我想检查 RDTSC 指令是否可用。必须有 Intel Pentium 或更新的处理器,并且寄存器 CR4 中的 TSD 标志清零或已设置且 CPL 等于 0。

因此,获取当前的特权级别(CS 段寄存器的第 0 位和第 1 位)是没有问题的。检查指令本身是否受支持也没有问题(CPUID.1:EDX[4] = 1)。

但是(这就是问题所在),这也必须在用户模式(PL3)下运行。但是,我无法在用户模式下读取控制寄存器 CR4。

有没有其他方法可以检查操作系统是否限制对时间戳计数器的访问?

4

1 回答 1

2

唯一的方法是“尝试”指令并拦截异常,前提是操作系统让您能够以安全的方式对事件做出反应并恢复您的状态,以便您可以继续您的程序。不幸的是,并非所有操作系统都允许在他们认为“致命”的异常之后继续。在 Windows 上,您可以尝试使用结构化异常处理,在 linux 上有特定的信号(特别是 SIGILL)。但其他操作系统不会原谅这种例外。再见

(编辑)

PS:原则上,操作系统也有可能捕获异常并模拟指令,因此应用程序无法确定指令是否真的可用。我不知道是否有操作系统可以做这件事(虚拟机,也许?)。再见!

于 2011-03-30T16:09:56.657 回答