Skip to content

07 六行代码进入保护模式

你好,我是闪客。

这一讲我们要探讨的问题是,操作系统如何使 CPU 进入保护模式。保护模式虽然较为复杂,但仅仅是把模式切换过来只需要六行代码。

上一讲的最后,我们的内存布局变成了后面这样:

图片

这仅仅是进入保护模式前准备工作的其中一个,我们接着往下看。

打开 A20 地址线

下面的代码仍然是 setup.s 中的。

mov al,#0xD1        ; command write
out #0x64,al
mov al,#0xDF        ; A20 on
out #0x60,al

这段代码的意思是打开 A20 地址线。到底什么是 A20 地址线呢?

简单来说,这一步就是为了突破地址信号线 20 位的宽度,变成 32 位可用。这是由于 8086 CPU 只有 20 位的地址线,所以如果程序给出 21 位的内存地址数据,那多出的一位就被忽略了。

我举个例子,你更容易理解。比如如果经过计算得出一个内存地址为:

1 0000 00000000 00000000

那实际上内存地址相当于 0,因为高位的那个 1 被忽略了,溢出了地址线。

当 CPU 到了 32 位时代之后,由于要考虑兼容性,还必须保持一个只能用 20 位地址线的模式,所以如果你不手动开启的话,即使地址线已经有 32 位了,仍然会限制只能使用其中的 20 位。

简单么?我们继续往下看。接下来这段代码,我建议你完全不用看,毕竟 Linus自己都注释说过“这是一段不得不做,又一点意思也没有的代码”。