浙林龙哥

   :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
存储段
描述符
m+7 m+6 m+5 m+4 m+3 m+2 m+1 m+0
Base(31...24) Attributes Segment Base(23...0) Segment Limite(15...0)

存储段
描述符
属  性
Byte m+6 Byte m+5
BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0
G D 0 AVL Limit(19...16) P DPL DT1 TYPE

数据段
类  型
类型值 说      明
0 只读
1 只读、已访问
2 读/写
3 读/写、已访问
4 只读、向下扩展
5 只读、向下扩展、已访问
6 读/写、向下扩展
7 读/写、向下扩展、已访问
代码段
类  型
类型值 说      明
8 只执行
9 只执行、已访问
A 执行/读
B 执行/读、已访问
C 只执行、一致码段
D 只执行、一致码段、已访问
E 执行/读、一致码段
F 执行/读、一致码段、已访问

根据存储段描述符的结构,可定义如下的汇编语言描述符结构类型: 
    DESC       STRUC LIMITL DW      0 ;段界限低16位
    BASEL      DW      0 ;基地址低16位
    BASEM      DB      0 ;基地址中间8位
    ATTRIB     DB      0 ;段属性
    LIMITH     DB      0 ;段界限的高4位(包括段属性的高4位)
    BASEH      DB      0 ;基地址的高8位
    DESC       ENDS

示例:
gdt:
    gdt_null:           ; 这是CPU要求保留的,CPU要求第一个段必须是空段,空描述符的64位全是0
        dd  0
        dd  0           ; 每个段的描述符是64位(8字节),dd表示4个字节,两个dd刚好8个字节,

    gdt_code_addr equ $ - gdt   ; 求得代码段在GDT表中的位置
    gdt_code:
        dw  0xFFFF      ; 段低16位
        dw  0                ; 基地址(24位)
        db  0       
        db  10011010b   ; 0x9A 属性描述位,P=1,DPL=0,DT1=1,TYPE=A,指明此是代码段、可读可执行
        db  11001111b   ; 0xCF 0xC为属性描述表示G=1,D=1,AVL=0,表示段界以4K为单位,32位代码段,0xF为段界高8位
                                ; 得出:段界为0xFFFFF,因G=1所以表示4G空间
        db  0          

    gdt_data_addr equ $ - gdt   ; 求得数据段在GDT表中的位置,段界、其它属性分析与上同
    gdt_data:                    
        dw  0xFFFF       
        dw  0                
        db  0
        db  10010010b   ;  0x92 属性描述位,P=1,DPL=0,DT1=1,TYPE=2,指明此是数据段,可读可写
        db  11001111b
        db  0
    gdt_end:
    gdt_addr:
        dw  gdt_end - gdt - 1   ; GDT 表的大小
        dd  gdt                 ; GDT 表的位置
posted on 2005-03-01 14:01  浙林龙哥  阅读(1311)  评论(0编辑  收藏  举报