由实模式进入保护模式
保护模式的两个特点:
1.寻址空间从实模式的1M增强到4G
2.不同的代码拥有不同的优先级,优先级高的能够执行特殊指令,优先级低的,某些重要指令就无法执行。
在实模式下,cpu是16位的,寄存器16位,数据总线16位,地址总线20位,于是寻找的范围必然受限于20位的地址总线,所以寻找范围无法超过1M(2^20).要想实现4GB的寻址,我们必须使用32位来表示地址,intel是这么解决这个问题的,他们用连续的8个字节组成的结构体来解决一系列问题。4G = (2^32)
BYTE7 | BYTE6 | BYTE5 | BYTE4 | BYTE3 | BYTE2 | BYTE1 | BYTE0 |
---|
字节2,3,4以及字节7,这四个字节合在一起总共有32位,这就形成了一个32位的地址。同时把字节0,字节1,以及将字节6的拆成两部分,各4个bits,前4个bits跟字节0,字节1合在一起,形成一个20个bit的数据,用来表示要访问的内存长度。
由实模式到保护模式步骤:
- 初始化32位代码段的段基址,并存储到GDT中对应的描述符中
- 准备GDT的基地址,并通过LGDT指令加载到GDTR寄存器中
- cli关中断
- 打开地址线A20
- 将CR0寄存器的PE位置1,进入保护模式
(对于CR0控制寄存器的解释https://blog.csdn.net/whatday/article/details/24851197)
- 已经进入保护模式,跳转到32位代码段继续执行
- 写显存
由实模式进入保护模式汇编代码:
%include "pm.inc" ;常量,宏,以及一些说明 32位的二进制数,8个字节
org 0x9000
jmp LABEL_BEGIN
[SECTION .gdt] ;定义一个段,名字:gdt
; 段基址 段界限 属性
LABEL_GDT: Descriptor 0, 0, 0 ;空描述符
LABEL_DESC_CODE32: Descriptor 0, SegCode32Len - 1, DA_C