|
|
1
3
我找到了答案,这并不简单,所以我把它发布在这里,也许它可以帮助其他人。 首先,我需要承认 OSDev.org 帮助我理解这一点。 尽管该代码是为i386编译的,但它在x86_64 linux系统上运行。因此,它不是在传统的32位模式下运行,而是在所谓的“兼容模式”下运行。在此模式下,允许在x86_64环境上运行传统的32位软件。 当系统进入intel64(长)模式时,它使用64位地址空间的高端(类似于0xffff88021dd89000)将GDT置于线性地址。每当“compat”32位应用程序使用LGDT检索GDTR线性地址时,它只检索线性地址的低32位(0x1dd89000)。当处理器访问GDT时,它使用GDTR寄存器的全64位线性地址,即使在兼容模式下也是如此。 |