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

rks48beu  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(110)

我想检查RDTSC指令是否可用。必须有Intel Pentium或更新的处理器,并且寄存器CR4中的TSD标志已清除或已设置且CPL等于0。
因此,获取当前权限级别(CS段寄存器的位0和1)没有问题。检查指令本身是否受支持(CPUID.1:EDX[4] = 1)也没有问题。
但是(这就是问题所在),这也必须在用户模式(PL3)下运行。但是,我不能在用户模式下读取控制寄存器CR4。
是否有其他方法可以检查操作系统是否限制对时间戳计数器的访问?

omtl5h9j

omtl5h9j1#

唯一的方法是“尝试”指令并拦截异常,前提是操作系统能够以安全的方式对事件做出React并恢复状态,以便您可以继续执行程序。不幸的是,不是每个操作系统都允许在它认为“致命”的异常后继续执行。在Windows上,您可以尝试使用结构化异常处理,在linux上有特定的信号(特别是SIGILL)。但是其他操作系统不允许这种异常。
再见
(编辑)
附言:原则上,操作系统也可以拦截异常并模拟指令,这样应用程序就无法判断指令是否真的可用。我不知道是否有操作系统可以做到这一点(也许是虚拟机?)。
再见!

相关问题