Skip to content

06 解决段寄存器的历史包袱问题

你好,我是闪客。

这一讲我们要探索的是,在实模式和保护模式下,物理地址的计算方式有怎样的不同?这又和段寄存器的历史包袱有什么关系?

上一讲咱们说到,操作系统又折腾了一下内存,之后的很长一段时间内存布局就不会变了,终于稳定下来了,目前它长这个样子:

图片

0 地址开始处存放着操作系统的全部代码,也就是 system 模块,0x90000 位置处往后的几十个字节存放着一些设备的信息,方便以后使用。

图片

是不是十分清晰?不过别高兴得太早,清爽的内存布局,是为了方便后续操作系统的大显身手!

模式的转换

接下来就要进行真正的第一项大工程了,那就是模式的转换,需要从现在的 16 位的实模式转变为之后 32 位的保护模式

当然,虽说是一项非常难啃的大工程,但从代码量看,却是少得可怜,所以你不必太过担心。

每次讲这里都十分的麻烦,因为这是 x86 的历史包袱问题,现在的 CPU 几乎都是支持 32 位模式甚至 64 位模式了,很少有还仅仅停留在 16 位的实模式下的 CPU。

所以,我们要为了这个历史包袱,写一段模式转换的代码,如果 Intel CPU 被重新设计而不用考虑兼容性,那么今天的代码将会减少很多,甚至不复存在。

这里我不打算直接和你说实模式和保护模式的区别,我们还是跟着代码慢慢品味。