为什么我们仍然需要 "enter" 32 位保护模式?

Why do we need to "enter" 32-bit protected mode anyway?

最近我对从头开始构建一个小玩具-OS很感兴趣,现在我真的很困惑。请你帮帮我..

问题

我不明白为什么我们还要费心进入 32 位保护模式?

我的意思是为什么不直接将旧指令从 16 位覆盖为 32 位(或 64 位),这样我们就可以直接编码(例如直接访问更多内存地址)...这种切换的意义何在-进程……为什么为什么为什么……

我之所以感到困惑,是因为我首先阅读的教程教我如何使用 16 位(一些基本的 BIOS 指令)启动,而它声称“32 位更好”我完全同意,所以我们必须进入 32 位保护模式。在我看来,这只是位长度的简单扩展?为什么如此不同(很难使用 BIOS、GDT、电子寄存器...)?

英特尔一直试图保持其 CPU 向后兼容(现在仍然如此)。
一个新奇的 CPU 不能 运行 任何现有的软件,对这个行业来说是坚如磐石。

操作码 b8mov ax, imm16,在不破坏兼容性的情况下,没有其他可能的方式来解释它,包括 mov eax, imm32
除非你在某处设置一个标志,让 CPU 知道这样做是可以的。
那是切换,现在b8mov eax, imm32
因此,从某种意义上说,旧指令已经 "overwritten" 了。

英特尔本可以使用全新的操作码,但那将是对操作码的巨大浪费(操作码 space 当时已经 非常 拥挤),再加上走这条路并避免显式切换,CPU 必须同时处于实模式和保护模式(因为它不能放弃对 16 位代码的支持)。
这是对非常混乱的设计的要求,或者充其量是一场噩梦。

如果不是为了处理中断的麻烦(以及 CPU 执行自动操作的任何机制),可以使用前缀。

保护模式伴随着一种新的保护方案而来,诚然它是过度设计的,但无论如何,我们需要处理它,它的GDT、IDT、TSS等等。
这种机制是 在 x86 架构上出现 32 位计算之前 设置的,即当没有 32 位 registers/addresses 时,它出现在 286 中。
当 Intel 认识到需要 32 位计算时,它抓住机会将它与保护方案的改进版本一起发布。

每当 CPU 和软件之间的新合约被开发时,通常总是要求软件有 明确的意图 ,这可以防止任何虚假激活。

所以切换提供:

  • 更简单的设计。
  • 重用操作码(避免需要前缀)。
  • 证明该软件是为理解新合约而编写的。
  • 不理解新合同的软件的相同环境。

随着 UEFI 的出现,一些限制已经放宽,UEFI 引导加载程序(或任何应用程序或驱动程序)以 64 位模式(或 32 位,如果 CPU 对于 64 位来说太旧)启动-bit).
如果您对旧版 BIOS 引导感到不满意,可以尝试使用 UEFI。
请注意,64 位模式依赖于它之前的所有内容,包括保护模式和 PAE 分页。
您可能会暂时将它们隐藏起来,但如果您打算继续编写 OS,掌握基础知识将会有所收获。