我想检查RDTSC指令是否可用。必须有Intel Pentium或更新的处理器,并且寄存器CR4中的TSD标志已清除或已设置且CPL等于0。因此,获取当前权限级别(CS段寄存器的位0和1)没有问题。检查指令本身是否受支持(CPUID.1:EDX[4] = 1)也没有问题。但是(这就是问题所在),这也必须在用户模式(PL3)下运行。但是,我不能在用户模式下读取控制寄存器CR4。是否有其他方法可以检查操作系统是否限制对时间戳计数器的访问?
omtl5h9j1#
唯一的方法是“尝试”指令并拦截异常,前提是操作系统能够以安全的方式对事件做出React并恢复状态,以便您可以继续执行程序。不幸的是,不是每个操作系统都允许在它认为“致命”的异常后继续执行。在Windows上,您可以尝试使用结构化异常处理,在linux上有特定的信号(特别是SIGILL)。但是其他操作系统不允许这种异常。再见(编辑)附言:原则上,操作系统也可以拦截异常并模拟指令,这样应用程序就无法判断指令是否真的可用。我不知道是否有操作系统可以做到这一点(也许是虚拟机?)。再见!
1条答案
按热度按时间omtl5h9j1#
唯一的方法是“尝试”指令并拦截异常,前提是操作系统能够以安全的方式对事件做出React并恢复状态,以便您可以继续执行程序。不幸的是,不是每个操作系统都允许在它认为“致命”的异常后继续执行。在Windows上,您可以尝试使用结构化异常处理,在linux上有特定的信号(特别是SIGILL)。但是其他操作系统不允许这种异常。
再见
(编辑)
附言:原则上,操作系统也可以拦截异常并模拟指令,这样应用程序就无法判断指令是否真的可用。我不知道是否有操作系统可以做到这一点(也许是虚拟机?)。
再见!