- 设置全局描述符表
- 打开A20地址线
在实模式采用段基址:段内偏移地址
的形式, 有20根地址线,最大寻址空间1MB, 但这种寻址方式可以寻址范围0x0000: 0x0000 ~ 0xffff: 0xffff
, 即0 ~ 0x10ffef
, 而20位地址线的访问空间是0 ~ 0xfffff
, 即1MB范围, 所以当寄存器的表示范围超过地址线所能表示的范围后, 会发生地址会绕, 即或舍弃高位的溢出, 比如, 0x10000寻址到0x0000所表示的内存地址.
CPU发展到了80286后, 虽然地址总线从原来的20位发展到了24位, 从而能够访问的内存范围可以到达2的24次方, 等于16MB. 但任何时候, Intel都会把兼容放在第一位. 80286是第一款具有保护模式的CPU, 他在实模式下时, 其表现也应该和8086/8088完全一样, 即仍然只使用20条地址线. 但80286有24条地址线, 要访问它所有的内存地址空间, 为了解决它, IBM在键盘控制器上的一些输出线来控制第21位(A20)的有效性, 故被称为A20Gate
in al, 0x92
or al, 0000_0010B
out 0x92, al
对于80286后续的CPU, 通过A20GATE来控制A20地址线 - 保护模式的开关, CR0寄存器的PE位
这是进入保护模式的最后一步, 这一步过后, 我们将突破1MB内存的束缚.
在前面说寄存器的时候, 有讲到过控制寄存器CRx. 控制寄存器是CPU的窗口,既可以用来展示CPU的内部状态, 也可用于控制CPU的运行机制. 这次我们要用到的是CR0寄存器. 更准确的说, 我们要用到寄存器的第0位, 即PE(Protection Enable)位, 此位用于启用保护模式, 是保护模式的开关. 当打开此位后, CPU才真正进入保护模式.
mov eax, cr0
or eax, 0x00000001
mov cr0, eax