【问题标题】:How can an x86 application detect that it's running in AMD64 compatibility mode?x86 应用程序如何检测到它在 AMD64 兼容模式下运行?
【发布时间】:2015-12-16 13:54:14
【问题描述】:

一般来说,如果不使用特定于操作系统的方法,x86 应用程序如何检测到它是在 AMD64 兼容模式而不是传统模式下运行的?

我知道我可以通过执行smsw eax 或类似的非特权指令(用于检查是否启用例如分页/缓存/...)在用户空间中获得cr0,但在阅读了英特尔的系统编程指南之后第 9.8.5 节 初始化 IA-32e 模式,我了解到这几乎没有用,因为 IA-32e 模式是通过 IA32_EFER MSR 启用的,而响铃 3 代码无法访问。那么还有什么方法可以可靠地区分传统模式和兼容模式吗?

【问题讨论】:

标签: x86 x86-64 detection


【解决方案1】:

Superuser post 指出,在 Intel 实现中,旧模式支持 SYSCALL,但不支持兼容模式。这在技术上是特定于操作系统的,但您并不是向操作系统询问答案,就像只是调用uname(2) 并查看buf->machine。如果你知道一个“正常”的系统调用,比如 gettimeofday 或 getpid,你可以试试这个。

英特尔的手册说 SYSCALL 将:#UD If IA32_EFER.SCE = 0.

虽然这仅在您的操作系统首先支持使用 32 位代码中的 SYSCALL 时才有效。 32 位代码通常必须使用int 80h。不过,64 位代码通常确实使用 SYSCALL。

根据维基百科(该超级用户帖子的来源),显然 AMD64 CPU 不能以这种方式工作,只有 Intel EMT64

https://en.wikipedia.org/wiki/X86-64#Recent_implementations 没有提到任何其他有用的东西。

【讨论】:

  • 是的,这是特定于 Intel 64 的。 AMD64 CPU 在所有三种模式下都支持syscall:legacy、compatibility 和 long,这可以在他们的文档中阅读。
猜你喜欢
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 2011-03-15
  • 2014-09-17
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
相关资源
最近更新 更多