【发布时间】:2020-05-15 23:01:05
【问题描述】:
我正在 x86 PC 上以 MBR 模式(无 EFI)调试不寻常的引导安排。IPL in MBR --> 奇异的BootManager* --> Partiton Boot Sector --> 实验性的@987654331 @
我在 16 位实模式 x86 程序集中编写了一个原始的 512 字节分区引导扇区 (PBR),它使用 int 10h BIOS 服务来显示传递给它的 16 位寄存器。它非常适合调试。
我想增强我的调试 PBR 以显示有关 CPU 模式的信息,即 BootManager 是否已经将 CPU 切换到 Protected Mode(32 位或 64 位)或其子模式,例如 Virtual 8086 mode。我需要此信息用于调试目的。
在这种情况下如何可靠地检测CPU mode(及其子类型)?
-
BootManger 位于 MBR 和第一个分区之间的扇区中,它拦截/模拟 BIOS 服务/中断 - 我已经看到它在调试器中将
int 13h向量指向自身
编辑:这个问题不是关于检测在软件中模拟的 CPU 的 CPU 模式。 (又名:虚拟 CPU)
此外,Virtual CPU 与真实 CPU 的Virtual 8086 mode 不同。 Virtual 8086 mode 是 CPU 模式,是 Protected Mode 的子模式,它是在硬件中实现的,所以这个子模式的检测是这个问题的主题,以及 32 位和 64 位的检测protected modes 等......在真正的硅片上实现。
【问题讨论】:
-
所以您想编写在 16 位或 32 位模式下执行时能够正常工作的机器代码?或许
mov ax, sp/push imm8/sub ax, sp看看SP变化多少?int 10hBIOS 服务甚至可以在 32 位保护模式下工作吗? 另请参阅此检测 16/32/64 位模式的 x86 多语言机器代码:Determine your language's version(针对代码大小进行了优化但评论很好)。您还可以读取相关控制寄存器以查看是否设置了保护模式位,以检测 16 位保护模式与 16 位实模式我猜。 -
@GeorgeRobinson 当然。 Apparently it's not even difficult。好像我之前错了。
-
没有引导管理器会无缘无故切换到 32 位保护模式。如果确实如此,则没有卷(分区)引导记录起作用。它可能会切换到虚拟 8086 模式,但这不太可能,因为它会阻止受保护模式的操作系统启动。
-
@Ross Ridge:确实,没有一个理智的引导管理器会这样做,但一个有问题的引导管理器可能会。此模式发现用于调试目的。
-
切换到保护模式并非偶然。
标签: assembly x86 x86-64 x86-16 boot