摘要
如何进入保护模式
进入保护模式大约需要三个步骤:
这三个步骤可以不连续,不固定顺序。
点击此处全局描述符表深入学习全局描述符表。
A20地址线
实模式下的内存访问形式是段基址左移16位+段内偏移地址,实模式下的寄存器是16位,也就是说CPU最大可以放到的地址是0xFFFF0+0xFFFF,即0x10FFEF。
8086/8088CPU地址总线只有20位,实模式下的地址总线是20位,也就是说最大寻址空间是1MB,即0x00000~0xFFFFF,超出1M的内存空间在逻辑上是正常的,但在物理内存中却无法访问,超过1MB的内存区域被称为高端内存区HMA。
所以当程序员给出超过1M的地址时,系统并不认为其访问越界而产生异常,而是自动从重新0开始计算,也就是说系统计算实际地址的时候是按照对1M求模的方式进行的,这种技术被称为wrap-around。
在Intel 80286处理器中,系统的地址总线发展为24根,这样能够访问的内存可以达到16M。
在实模式下,80286以及后续系列都应该和8086/8088完全兼容。
但是实模式下80286芯片却存在一个BUG:如果程序员访问0x100000~Ox10FFEF之间的内存,系统将实际访问这块内存,而不是像过去一样重新从0开始。
为了解决上述问题,IBM使用8042键盘控制器上剩余的一些输出线来管理第21根地址线(从0开始数是第20根),所以被称为A20Gate。
FAST A20在许多新型PC上存在着一种通过芯片来直接控制A20Gate的BIOS功能。从性能上,这种方法比通过键盘控制器来控制A20Gate要稍微高一点。
由于保护模式下我们的寻址空间将不再受到实模式下1M的限制,因此我们在进入保护模式时也需要通过打开A20,让CPU可以访问到真实的物理内存。
打开A20地址总线的方式是将端口0x92的第一位置1,如下:
in al, 0x92
or al, 0000_0010b
out 0x92, al
CR0寄存器
控制寄存器CRO是CPU的窗口,既可以用来展示CPU的内部状态,也可以用于控制CPU的运行机制。在CRO寄存器的第0位(PE位),此位用来启用保护模式,只需要将该位置1,CPU就会真正进入保护模式。
mov eax, cr0
or eax, 0x00000001
mov cr0, eax