通常,如果不使用特定于操作系统的方法,x86应用程序如何检测它是否在AMD64兼容模式而不是传统模式下运行?
我知道只需执行function ExpMenu($item_array ) {
$tmp='';
foreach ($item_array as $item) {
if ($item['is_parent']=='yes') {
$tmp .= '<li class="hasChild">' . $item["text"] . '<ul>';
$tmp .= ExpMenu($item['child']);
$tmp .= '</ul></li>';
} else {
$tmp .= '<li>';
$tmp .= '<a href="' . $item['url'] . '">'. $item['text'] . '</a>' ;
$tmp .= '</li>';
}
}
return $tmp;
}
或类似的非特权指令(用于检查是否启用了分页/缓存/ ...),我可以在用户空间中获得cr0
,但是在阅读之后英特尔系统编程指南第9.8.5节初始化IA-32e模式,我了解到这几乎没用,因为IA-32e模式是通过smsw eax
MSR启用的,这是环3代码无法访问。那么有没有办法可靠地区分传统模式和兼容模式?
答案 0 :(得分:0)
这个Superuser post指出,在英特尔实现中,传统模式支持SYSCALL,但不支持兼容模式。这在技术上是特定于操作系统的,但您并非向操作系统询问答案,例如只需致电uname(2)
并查看buf->machine
。如果你知道&#34;正常&#34;系统调用,比如gettimeofday或getpid,你可以用它来试试。
英特尔手册称SYSCALL将:#UD If IA32_EFER.SCE = 0.
虽然这只适用于操作系统支持首先使用32位代码的SYSCALL。 32位代码通常必须使用int 80h
。但是,64位代码通常使用SYSCALL。
根据维基百科(超级用户帖子的来源),显然AMD64 CPU不会以这种方式工作,只有英特尔EMT64 。
https://en.wikipedia.org/wiki/X86-64#Recent_implementations没有提及任何有用的内容。