06 解决段寄存器的历史包袱问题
你好,我是闪客。
这一讲我们要探索的是,在实模式和保护模式下,物理地址的计算方式有怎样的不同?这又和段寄存器的历史包袱有什么关系?
上一讲咱们说到,操作系统又折腾了一下内存,之后的很长一段时间内存布局就不会变了,终于稳定下来了,目前它长这个样子:

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

是不是十分清晰?不过别高兴得太早,清爽的内存布局,是为了方便后续操作系统的大显身手!
模式的转换
接下来就要进行真正的第一项大工程了,那就是模式的转换,需要从现在的 16 位的实模式转变为之后 32 位的保护模式。
当然,虽说是一项非常难啃的大工程,但从代码量看,却是少得可怜,所以你不必太过担心。
每次讲这里都十分的麻烦,因为这是 x86 的历史包袱问题,现在的 CPU 几乎都是支持 32 位模式甚至 64 位模式了,很少有还仅仅停留在 16 位的实模式下的 CPU。
所以,我们要为了这个历史包袱,写一段模式转换的代码,如果 Intel CPU 被重新设计而不用考虑兼容性,那么今天的代码将会减少很多,甚至不复存在。
这里我不打算直接和你说实模式和保护模式的区别,我们还是跟着代码慢慢品味。