保护模式初步

1 综述

CPU有两种工作方式,实模式和保护模式。当打开机器时,系统先工作在实模式,然后经过某种机制又转换到了保护模式。

 

  2 实模式下寻址 

    物理地址 = 段值 * 16 + offset 偏移 

    这时系统是16位的数据总线,20位的地址总线,16位的寄存器,可以访问1M的地址空间。

    80386 以后 地址总线达到了32位,总共达到4g的访址能力。

3 保护模式

 

  保护模式的段值仍由16位的cs ,ds 等表示,但是此时它仅仅表示一个索引,这个索引指向一个数据结构的表项,该表项详细定义了段的起始地址和界限、属性等内容。这个数据结构就是GDT  ,GDT中的表项也叫做描述符。这样说来GDT就是提供了段式存储机制,段式存储机制就是通过GDT

以及描述符来完成工作的。

 

 4 实模式进入保护模式代码

%include "pm.inc" ;   常量,   宏,   以及一些说明 
  
  org 0100h 
  jmp LABEL_BEGIN 
  
  [SECTION   .gdt] 
  ;   GDT 
  ;                                                                                   段基址,             段界限           ,   属性 
  LABEL_GDT: Descriptor               0,                                 0,   0           ;   空描述符 
  LABEL_DESC_CODE32: Descriptor               0,   SegCode32Len   -   1,   DA_C   +   DA_32 ;   非一致代码段,   32 
  LABEL_DESC_VIDEO: Descriptor   0B8000h,                       0ffffh,   DA_DRW ;   显存首地址 
  ;   GDT   结束 
  
  GdtLen equ $   -   LABEL_GDT ;   GDT长度 
  GdtPtr dw GdtLen   -   1 ;   GDT界限 
  dd 0 ;   GDT基地址 
  
  ;   GDT   选择子 
  SelectorCode32 equ LABEL_DESC_CODE32 -   LABEL_GDT 
  SelectorVideo equ LABEL_DESC_VIDEO -   LABEL_GDT 
  ;   END   of   [SECTION   .gdt] 
  
  [SECTION   .s16] 
  [BITS 16] 
  LABEL_BEGIN: 
  mov ax,   cs 
  mov ds,   ax 
  mov es,   ax 
  mov ss,   ax 
  mov sp,   0100h 
  
  ;   初始化   32   位代码段描述符 
  xor eax,   eax 
  mov ax,   cs 
  shl eax,   4 
  add eax,   LABEL_SEG_CODE32 
  mov word   [LABEL_DESC_CODE32   +   2],   ax 
  shr eax,   16 
  mov byte   [LABEL_DESC_CODE32   +   4],   al 
  mov byte   [LABEL_DESC_CODE32   +   7],   ah 
  
  ;   为加载   GDTR   作准备 
  xor eax,   eax 
  mov ax,   ds 
  shl eax,   4 
  add eax,   LABEL_GDT ;   eax   <-   gdt   基地址 
  mov dword   [GdtPtr   +   2],   eax ;   [GdtPtr   +   2]   <-   gdt   基地址 
  
  ;   加载   GDTR 
  lgdt [GdtPtr] 
  
  ;   关中断 
  cli 
  
  ;   打开地址线A20 
  in al,   92h 
  or al,   00000010b 
  out 92h,   al 
  
  ;   准备切换到保护模式 
  mov eax,   cr0 
  or eax,   1 
  mov cr0,   eax 
  
  ;   真正进入保护模式 
  jmp dword   SelectorCode32:0 ;   执行这一句会把   SelectorCode32   装入   cs,   并跳转到   Code32Selector:0     处 
  ;   END   of   [SECTION   .s16] 
  
  
  [SECTION   .s32];   32   位代码段.   由实模式跳入. 
  [BITS 32] 
  
  LABEL_SEG_CODE32: 
  mov ax,   SelectorVideo 
  mov gs,   ax ;   视频段选择子(目的) 
  
  mov edi,   (80   *   10   +   0)   *   2 ;   屏幕第   10   行,   第   0   列。 
  mov ah,   0Ch ;   0000:   黑底         1100:   红字 
  mov al,   'P' 
  mov [gs:edi],   ax 
  
  ;   到此停止 
  jmp $ 
  
  SegCode32Len equ $   -   LABEL_SEG_CODE32 
  ;   END   of   [SECTION   .s32] 

 

 

 

  5 LDT

    它和GDT差不多都是描述符,差别仅仅在于全局和局部的区别。

 

 

6 特权级

 

   处理器通过以下三种特权级,进行特权级检验。

 

   (1)CPL

      是当前执行的程序或者任务的特权级。被存储在cs 和 ss的第0位和第一位,通常情况下,CPL等于代码所

在段的特权级,当程序转移到不同特权级的代码段的时候,cpl将会改变。

 

  (2) DPL

       表示段或者门的特权级,它被存储在段或者门描述符的DPL中。

 

        数据段:DPL规定可以访问此段的最低特权级,比如一个dpl是1 ,那么只有在CPL为0或者为1的情况下,才能访问。

       非一致代码段:DPL访问此段的特权级。

 (3) RPL :

 

     通过选择子的第0位和第1位来表示出来。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值