检测时间戳计数器限制或可用性

问题描述 投票:0回答:1

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

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

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

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

assembly x86 operating-system rdtsc privileged-functions
1个回答
3
投票

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

(编辑)

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

© www.soinside.com 2019 - 2024. All rights reserved.