为什么我们仍然需要 "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 不能 运行 任何现有的软件,对这个行业来说是坚如磐石。
操作码 b8
是 mov ax, imm16
,在不破坏兼容性的情况下,没有其他可能的方式来解释它,包括 mov eax, imm32
。
除非你在某处设置一个标志,让 CPU 知道这样做是可以的。
那是切换,现在b8
是mov 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,掌握基础知识将会有所收获。
最近我对从头开始构建一个小玩具-OS很感兴趣,现在我真的很困惑。请你帮帮我..
问题
我不明白为什么我们还要费心进入 32 位保护模式?
我的意思是为什么不直接将旧指令从 16 位覆盖为 32 位(或 64 位),这样我们就可以直接编码(例如直接访问更多内存地址)...这种切换的意义何在-进程……为什么为什么为什么……
我之所以感到困惑,是因为我首先阅读的教程教我如何使用 16 位(一些基本的 BIOS 指令)启动,而它声称“32 位更好”我完全同意,所以我们必须进入 32 位保护模式。在我看来,这只是位长度的简单扩展?为什么如此不同(很难使用 BIOS、GDT、电子寄存器...)?
英特尔一直试图保持其 CPU 向后兼容(现在仍然如此)。
一个新奇的 CPU 不能 运行 任何现有的软件,对这个行业来说是坚如磐石。
操作码 b8
是 mov ax, imm16
,在不破坏兼容性的情况下,没有其他可能的方式来解释它,包括 mov eax, imm32
。
除非你在某处设置一个标志,让 CPU 知道这样做是可以的。
那是切换,现在b8
是mov eax, imm32
。
因此,从某种意义上说,旧指令已经 "overwritten" 了。
英特尔本可以使用全新的操作码,但那将是对操作码的巨大浪费(操作码 space 当时已经 非常 拥挤),再加上走这条路并避免显式切换,CPU 必须同时处于实模式和保护模式(因为它不能放弃对 16 位代码的支持)。
这是对非常混乱的设计的要求,或者充其量是一场噩梦。
保护模式伴随着一种新的保护方案而来,诚然它是过度设计的,但无论如何,我们需要处理它,它的GDT、IDT、TSS等等。
这种机制是 在 x86 架构上出现 32 位计算之前 设置的,即当没有 32 位 registers/addresses 时,它出现在 286 中。
当 Intel 认识到需要 32 位计算时,它抓住机会将它与保护方案的改进版本一起发布。
每当 CPU 和软件之间的新合约被开发时,通常总是要求软件有 明确的意图 ,这可以防止任何虚假激活。
所以切换提供:
- 更简单的设计。
- 重用操作码(避免需要前缀)。
- 证明该软件是为理解新合约而编写的。
- 不理解新合同的软件的相同环境。
随着 UEFI 的出现,一些限制已经放宽,UEFI 引导加载程序(或任何应用程序或驱动程序)以 64 位模式(或 32 位,如果 CPU 对于 64 位来说太旧)启动-bit).
如果您对旧版 BIOS 引导感到不满意,可以尝试使用 UEFI。
请注意,64 位模式依赖于它之前的所有内容,包括保护模式和 PAE 分页。
您可能会暂时将它们隐藏起来,但如果您打算继续编写 OS,掌握基础知识将会有所收获。