码迷,mamicode.com
首页 > 其他好文 > 详细

Orange's笔记(2)保护模式(暂存)

时间:2014-07-16 21:34:51      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   color   os   

1:GDT的第一项总为空,称为空段描述符,其结构如下:

bubuko.com,布布扣

G:=0的时候段长度单位为字节 ,=1的时候单位为4096字节,所以段长度可以达到2的20(段接线2+段界限1)次方*4096=4GB

DPL:描述符特权级,定义了被引用段的特权级,其值为0-3

S和TYPE:确定该段类型,S=1代码段和数据段描述符.s=0系统段描述符。

 

2:就WINDOWS而言,LDT是依个孤立的数据结构

3:GTDR是一个特殊的寄存器,它用来保存GDT的基地址,该寄存器的大小为48位,低16位存储GDT的大小,高32位描述GDT的起线性地址。

4:LGDT指令加载一个值到GTDR,SGDT读GTDR中的值。

5:段选择子(段选择器,段选择符)是一个16为的值结构如下:

bubuko.com,布布扣

书上采用

SelectorCode32        equ    LABEL_DESC_CODE32    - LABEL_GDT
SelectorVideo        equ    LABEL_DESC_VIDEO    - LABEL_GDT

这样的方式来描述是因为高后面低3位为0.

段选择器如上图,分为三部分,RPL位用来定义段选择子的请求特权级(0-3),TI用来描述是GDT/LDT

6.关于权限。

CPL,DPL为0的段只有当CPL=0时候才可访问,DPL为3的段则可以由任何CPL的代码访问.

; ==========================================
; pmtest1.asm
; 编译方法:nasm pmtest1.asm -o pmtest1.bin
; ==========================================

%include    "pm.inc"    ; 常量, 宏, 以及一些说明

org    07c00h
    jmp    LABEL_BEGIN

[SECTION .gdt]
; GDT
;                              段基址,       段界限     , 属性
LABEL_GDT:       Descriptor       0,                0, 0           ; 空描述符
LABEL_DESC_CODE32: Descriptor       0, SegCode32Len - 1, DA_C + DA_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 * 11 + 79) * 2    ; 屏幕第 11 行, 第 79 列。
    mov    ah, 0Ch            ; 0000: 黑底    1100: 红字
    mov    al, P
    mov    [gs:edi], ax

    ; 到此停止
    jmp    $

SegCode32Len    equ    $ - LABEL_SEG_CODE32
; END of [SECTION .s32]

 

Orange's笔记(2)保护模式(暂存),布布扣,bubuko.com

Orange's笔记(2)保护模式(暂存)

标签:des   style   blog   http   color   os   

原文地址:http://www.cnblogs.com/Cnforce/p/3835935.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!