为什么我们需要"进入"无论如何都是32位保护模式?

时间:2018-02-12 09:42:03

标签: operating-system cpu cpu-architecture cpu-registers

最近我对从零开始构建一个小玩具操作系统感兴趣,现在我真的很困惑。愿你帮帮我..

问题

我很难理解为什么我们甚至懒得进入32位保护模式?

我的意思是为什么不将旧的指令从16位覆盖到32位(或64位),这样我们就可以直接编码(例如直接访问更多的内存地址)......这是什么意思这个转换过程...为什么为什么......

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

1 个答案:

答案 0 :(得分:2)

英特尔一直试图让他们的CPU向后兼容(现在仍然如此) 一个不能运行任何现有软件的新型CPU就像这个行业的摇滚一样好。

操作码b8mov ax, imm16,没有其他可能的方法来解释它,包括mov eax, imm32,而不会破坏兼容性。
除非你在某个地方设置一个标志,让CPU知道这样做是可以的 该切换,现在b8mov eax, imm32
所以,旧指令已被覆盖"从某种意义上说。

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

Peter Cordes pointed out如果没有处理中断的麻烦(可能是CPU执行自动操作的任何机制),则可以使用前缀。

保护模式伴随着一种新的保护方案,它被认为是过度设计的,但是,我们需要处理它,它的GDT,IDT,TSS等。
在 x86体系结构上32位计算出现之前,此机制已设置为,即当没有32位寄存器/地址存在时,它存在于286中。 当英特尔认识到需要32位计算时,它借此机会将其与改进版本的保护方案一起发布。

每当开发CPU和软件之间的新合同时,通常都需要软件中的明确意图,这可以防止任何虚假激活。

所以切换提供:

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

随着UEFI的出现,一些约束已经放宽,UEFI引导加载程序(或任何应用程序或驱动程序)以64位模式启动(如果CPU对于64位太旧,则为32位)。 /> 如果您对传统BIOS启动感到不满意,可以尝试使用UEFI 请注意,64位模式依赖于之前的所有内容,包括保护模式和PAE分页 你可能会把它们推到地毯下一段时间,但如果你打算继续编写操作系统,那么掌握基础知识将会有所回报。