最近我对从零开始构建一个小玩具操作系统感兴趣,现在我真的很困惑。愿你帮帮我..
我很难理解为什么我们甚至懒得进入32位保护模式?
我的意思是为什么不将旧的指令从16位覆盖到32位(或64位),这样我们就可以直接编码(例如直接访问更多的内存地址)......这是什么意思这个转换过程...为什么为什么......
我之所以感到困惑的原因是我首先阅读的教程教我如何用16位(一些基本的BIOS指令)启动它声称" 32位更好"我完全同意,所以我们必须进入32位保护模式。在我看来,这只是位长度的简单扩展?为什么如此不同(难以使用BIOS,GDT,电子注册......)?
答案 0 :(得分:2)
英特尔一直试图让他们的CPU向后兼容(现在仍然如此) 一个不能运行任何现有软件的新型CPU就像这个行业的摇滚一样好。
操作码b8
为mov ax, imm16
,没有其他可能的方法来解释它,包括mov eax, imm32
,而不会破坏兼容性。
除非你在某个地方设置一个标志,让CPU知道这样做是可以的
该切换,现在b8
为mov 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分页 你可能会把它们推到地毯下一段时间,但如果你打算继续编写操作系统,那么掌握基础知识将会有所回报。