X86保护模式编程总结(1)

来源:互联网 发布:计算机编程网站 编辑:程序博客网 时间:2024/05/19 07:42

 

 

 

系统设计的步骤:

1, 初始化相关硬件.并装入系统.

2, 取得并测试相应硬件的参数.并初始化如X387等硬件.

3, 加载GDT到GDTR(第一个描述符必须为0,至少需要一个代码段和一个数据段)

4, 加载IDT到IDTR(必须先关中断,加载完后可打开)

5, 设置CR0中PE=1(也可和PG位一起设,并用JMP大跳)并重新装载段寄存器.

6, 建立页目录和页表,并将页目录基地址放入CR3

7, 将CR0中PE=1&&PG=1 (设置之后需用JMP指令刷新预取指令队列,pentium不用)

8, 建立LDT并将它在GDT中的索引装入LDTR(可选)

9, 建立第一个任务的TSS,并将它在GDT中的索引装入TR(可选).

 

从保护模式转回实模式步骤:

1, 如果分页被开启,执行以下步骤:

       A,将控制转移给具有等同映射的线性地址.确保GDT和IDT是等同映射的.

       B,将CR0寄存器的PG位清0.

       C,设置CR3=0,以便清洗TLB.

2,将控制转移给具有64k限制(0x0FFFF)的段.这将向CS寄存器装入在实方式中所需的段限.确保GDT和IDT处于实地址存储器(0-1M).

3,向段寄存器SS,DS,ES,FS和GS装入包含以下值的描述符用的选择符.这些值适用于实地址方式下: {段限=64K(0FFFF); 字节粒度(G=0); 向上扩充(E=0); 可写(W=1); 存在(P=1);基地址=任意值}

4, 禁止中断.包括NMI中断(可用外部电路来禁止)

5, 将CR0寄存器的PE=0

6, 用远程JMP指令跳转到实方式的程序.这将清洗指令对列.并对CS的访问权置以适当的值,在PentiumCPU中不需要此步.

7, 使用LIDT指令来装入实地址中断向量表的基地址和段限.

8, 开启中断

9, 按实地址方式的需要装入段寄存器.

 

 

原创粉丝点击