自制X86操作系统(1)-系统引导篇3(保护模式)

来源:互联网 发布:淘宝客服售后面试问题 编辑:程序博客网 时间:2024/05/17 08:20

最近忙着画X86主板没能及时写操作系统,时隔3月前面代码又复习下,应该到保护模式了。
OSLDR.ASM:

JMPBEGIN_OSLDRLABEL_GDT:DQ0;保留LABEL_CODE:DQ0X00C09A0000000000;C09A根据附表LABEL_VIDE:DQ0X00C0920B8000FFFF;C092根据附表,000B8000H为显存地址,界限FFFFHGdtPtrDW24;3x8字节=24DD0SelectorCODEEQULABEL_CODE-LABEL_GDTSelectorVIDEEQULABEL_VIDE-LABEL_GDTBEGIN_OSLDR:XOREAX,EAXMOVAX,CSMOVDS,AXMOVES,AXSHLEAX,4ADDEAX,CODE32_ADDR;把CODE32_ADDR物理地址存入LABEL_CODE指定位MOVWORD[LABEL_CODE + 2],AX;基地址0-15位SHREAX,16MOVBYTE[LABEL_CODE + 4],AL;基地址16-23位MOVBYTE[LABEL_CODE + 7],AH;基地址24-31位XOREAX,EAXMOVAX,DSSHLEAX,4;段基值x10H+偏移量ADDEAX,LABEL_GDT;EAX=LABEL_GDT物理地址MOVDWORD[GdtPtr+2],EAXLGDT[GdtPtr]CLIINAL,92HORAL,10BOUT92H,AL;开A20MOVEAX,CR0OREAX,1MOVCR0,EAX;打开保护模式标志位PE=1JMPDWORD SelectorCODE:0[BITS 32]CODE32_ADDR:MOVAX,SelectorVIDE;测试代码 跳入保护模式后在屏幕上显示OMOVES,AXXOREDI,EDIMOVEDI,800MOVAH,0CHMOVAL,'O'MOV[ES:EDI],AXJMPSHORT $

附图:

P位:1表示所描述的段存在(有效),为0表示所描述的段无效,使用该描述符会引起异常

DPL位:描述符特权级别,说明所描述段的特权级别

DT位:描述符类型位,1说明当前描述符为存储段描述符,0为系统描述符或门描述符. 

TYPE位: 位0:表明描述符是否已被访问.把选择子装入段寄存器时,该位被标记为1 位3:0说明所描述段为数据段,1为可执行段(代码段)

当为数据段时  

位1为W位,说明该数据段是否可写(0只读,1可写)    位2为ED位,说明该段的扩展方向(0向高位扩展,1向低位扩展)

当为代码段时   

位1为R位,说明该执行段是否可读(0只执行,1可读)    位2为C位,0说明该段不是一致码段(普通代码段),1为一致码段

G位:为粒度位,0说明粒度为字节,1为4K字节.

D位:    在代码段中,D为1,表示使用32位地址,32/8位操作数;为0表示使用16位地址,16/8位操作数   

在堆栈段中,D为1表示隐含操作(如PUSH/POP)使用ESP为堆栈指针,为0使用SP    在向低扩展的存储段中,D为1,表示段的上限为4G,为0上限为64K

 

实模式切换保护模式很简单,只要计算好跳转地址和定义好描述符表即可。 

2013/07/07

原创粉丝点击