Intel CPU 如何确定 x86 或 x64 模式?

How does the Intel CPU determine x86 or x64 mode?

Intel x64 CPUs 也可以 运行 x86 asm。 CPU 中是否有标志或模式来确定指令应解码为 x86 还是 x64? CPU 如何知道指令是 x86 还是 x64?

在CPU级别(不是OS级别!),是否可以混合使用x86和x64指令?

注意:在 OS 级别 有很多关于此问题的 SO 问答;我对CPU级别感兴趣。说库、文件等,都不是CPU级别的。

对于 80x86; CPU 模式与代码大小或指令解码几乎没有关系(并且主要决定在诸如段寄存器加载和中断处理程序等昂贵的东西期间发生什么,这些东西被降级为微代码)。

对于指令解码,重要的是代码大小(不是 CPU 模式);并且有 3 种可能性 - 16 位代码、32 位代码和 64 位代码。

在长模式下,代码大小由代码段描述符中的 2 位决定。

在保护模式下,代码大小由代码段描述符中的 1 位决定(64 位代码不是一个选项)。

在实模式(以及其他一些情况 - virtual8086 模式、系统管理模式)中,代码大小“名义上固定”为 16 位(其中“名义上固定”意味着有办法临时切换到另一种模式捏造事情)。

IA32_EFER MSR 中的位 LMA(Long Mode Active)表示处理器处于长模式(64 位模式)。

在长模式下,活动代码段描述符中的 L 位指示处理器正在解码 32 位还是 64 位指令。

要更改 LMA,软件清除 CR0 中的 PG 位,更改 EFER 中的 LME 位,然后设置 PG。

为了更改 CS 中的 L 位,软件执行远跳转或远调用以使用具有所需值的代码段描述符的选择器加载 CS。