段描述符

; 图示二

; 高地址………………………………………………………………………低地址

; |   7   |   6   |   5   |   4   |   3   |   2   |   1   |   0    |
; |7654321076543210765432107654321076543210765432107654321076543210|    <- 共 8 字节
; |--------========--------========--------========--------========|
; ┏━━━┳━━━━━━━┳━━━━━━━━━━━┳━━━━━━━┓
; ┃31..24┃   (见下图)   ┃     段基址(23..0)    ┃ 段界限(15..0)┃
; ┃      ┃              ┃                      ┃              ┃
; ┃ 基址2┃③ │ ②│  ①  ┃基址1b│   基址1a      ┃    段界限1   ┃
; ┣━━━╋━━━┳━━━╋━━━━━━━━━━━╋━━━━━━━┫
; ┃   %6 ┃  %5  ┃  %4  ┃  %3  ┃     %2       ┃       %1     ┃
; ┗━━━┻━━━┻━━━┻━━━┻━━━━━━━┻━━━━━━━┛
;         │                \_________
;         │                          \__________________
;         │                                             \________________________________________________
;         │                                                                                              \
;         ┏━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┓
;         ┃ 7  ┃ 6  ┃ 5  ┃ 4  ┃ 3  ┃ 2  ┃ 1  ┃ 0  ┃ 7  ┃ 6  ┃ 5  ┃ 4  ┃ 3  ┃ 2  ┃ 1  ┃ 0  ┃
;         ┣━━╋━━╋━━╋━━╋━━┻━━┻━━┻━━╋━━╋━━┻━━╋━━╋━━┻━━┻━━┻━━┫
;         ┃ G  ┃ D  ┃ 0  ┃ AVL┃   段界限 2 (19..16)  ┃  P ┃   DPL    ┃ S  ┃       TYPE           ┃
;         ┣━━┻━━┻━━┻━━╋━━━━━━━━━━━╋━━┻━━━━━┻━━┻━━━━━━━━━━━┫
;         ┃      ③: 属性 2      ┃    ②: 段界限 2      ┃                   ①: 属性1                  ┃
;         ┗━━━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━┛
;       高地址                                                                                          低地址
    ; 初始化 32 位代码段描述符 =====================================================================================
    ; xor    eax, eax
    ; mov    ax, cs
    ; shl    eax, 4                        ; EAX = CS*16
    ; add    eax, LABEL_SEG_CODE32        ; EAX = CS*16+偏移
    ; mov    word [LABEL_DESC_CODE32 + 2], ax    ; 段基址1a = 0-15位
    ; shr    eax, 16
    ; mov    byte [LABEL_DESC_CODE32 + 4], al    ; 段基址1b = 16-23位
    ; mov    byte [LABEL_DESC_CODE32 + 7], ah    ; 段基址2  = 24-31位
; %macro Descriptor 3  ===================================================================
    ;    +00 dw    %2 & 0FFFFh                            ; 段界限1
    ;    +02 dw    %1 & 0FFFFh                            ; 段基址1
    ;    +04 db    (%1 >> 16) & 0FFh                    ; 段基址2
    ;    +05 dw    ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh)    ; 属性1 + 段界限2 + 属性2
    ;    +07 db    (%1 >> 24) & 0FFh                    ; 段基址3
; %endmacro ; 共 8 字节
; 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 结束

; 说明:
;
; (1) P:    存在(Present)位。
;        P=1 表示描述符对地址转换是有效的,或者说该描述符所描述的段存在,即在内存中;
;        P=0 表示描述符对地址转换无效,即该段不存在。使用该描述符进行内存访问时会引起异常。
;
; (2) DPL:  表示描述符特权级(Descriptor Privilege level),共2位。它规定了所描述段的特权级,用于特权检查,以决定对该段能否访问。
;
; (3) S:   说明描述符的类型。
;        对于存储段描述符而言,S=1,以区别与系统段描述符和门描述符(S=0)。
;
; (4) TYPE: 说明存储段描述符所描述的存储段的具体属性。
;
;
;    数据段类型    类型值        说明
;            ----------------------------------
;            0        只读
;            1        只读、已访问
;            2        读/写
;            3        读/写、已访问
;            4        只读、向下扩展
;            5        只读、向下扩展、已访问
;            6        读/写、向下扩展
;            7        读/写、向下扩展、已访问
;
;
;            类型值        说明
;    代码段类型    ----------------------------------
;            8        只执行
;            9        只执行、已访问
;            A        执行/读
;            B        执行/读、已访问
;            C        只执行、一致码段
;            D        只执行、一致码段、已访问
;            E        执行/读、一致码段
;            F        执行/读、一致码段、已访问
;
;
;    系统段类型    类型编码    说明
;            ----------------------------------
;            0        <未定义>
;            1        可用286TSS
;            2        LDT
;            3        忙的286TSS
;            4        286调用门
;            5        任务门
;            6        286中断门
;            7        286陷阱门
;            8        未定义
;            9        可用386TSS
;            A        <未定义>
;            B        忙的386TSS
;            C        386调用门
;            D        <未定义>
;            E        386中断门
;            F        386陷阱门
;
; (5) G:    段界限粒度(Granularity)位。
;        G=0 表示界限粒度为字节;
;        G=1 表示界限粒度为4K 字节。
;           注意,界限粒度只对段界限有效,对段基地址无效,段基地址总是以字节为单位。
;
; (6) D:    D位是一个很特殊的位,在描述可执行段、向下扩展数据段或由SS寄存器寻址的段(通常是堆栈段)的三种描述符中的意义各不相同。
;           ⑴ 在描述[可执行段]的描述符中,D位决定了指令使用的地址及操作数所默认的大小。
;        ① D=1表示默认情况下指令使用32位地址及32位或8位操作数,这样的代码段也称为32位代码段;
;        ② D=0 表示默认情况下,使用16位地址及16位或8位操作数,这样的代码段也称为16位代码段,它与80286兼容。可以使用地址大小前缀和操作数大小前缀分别改变默认的地址或操作数的大小。
;           ⑵ 在向下扩展[数据段]的描述符中,D位决定段的上部边界。
;        ① D=1表示段的上部界限为4G;
;        ② D=0表示段的上部界限为64K,这是为了与80286兼容。
;           ⑶ 在描述由SS寄存器[寻址的段]描述符中,D位决定隐式的堆栈访问指令(如PUSH和POP指令)使用何种堆栈指针寄存器。
;        ① D=1表示使用32位堆栈指针寄存器ESP;
;        ② D=0表示使用16位堆栈指针寄存器SP,这与80286兼容。
;
; (7) AVL:  软件可利用位。80386对该位的使用未左规定,Intel公司也保证今后开发生产的处理器只要与80386兼容,就不会对该位的使用做任何定义或规定。
;

;----------------------------------------------------------------------------
; 在下列类型值命名中:
;       DA_  : Descriptor Attribute
;       D    : 数据段
;       C    : 代码段
;       S    : 系统段
;       R    : 只读
;       RW   : 读写
;       A    : 已访问
;       其它 : 可按照字面意思理解
;----------------------------------------------------------------------------
时间: 2024-11-07 14:14:33

段描述符的相关文章

段描述符(转)

段描述符是GDT和LDT表中的一个数据结构项,用于向处理器提供有关一个段的位置和大小信息以及访问控制的状态信息.每个段描述符的长度是8字节,含有3个主要字段:段基地址.段限长和段属性.段描述符通常由编译器.链接器.加载器或者操作系统来创建,但绝不是应用程序.图4-13给出了所有类型段描述符的一般格式.   (点击查看大图)图4-13  段描述符通用格式 一个段描述符中各字段和标志的含义如下: (1)段限长字段Limit(Segment limit field):用于指定段的长度.处理器会把段描述

操作系统学习(五) 、代码段和数据段描述符

一.代码段和数据段描述符格式 段描述符通用格式如下所示: 代码段和数据段描述符中各个位的含义如下所示: 二.代码段和数据段描述符类型 当段描述符中S标志位(描述符类型)被置位,则该描述符用于代码段或数据段.此时类型字段中最高比特位(第二个双字的位11)用于确定是数据段描述符(复位)还是代码段描述符(置位). 代码段和数据段描述符类型如下所示: 对于数据段描述符,类型字段的低3位(位8,9,10)分别用于表示已访问A,可写W,和扩展方向E,根据可写比特位W的设置,一个数据段可以是只读的,也可以是可

14课 局部段描述符的使用

前面我们使用的都是全局段描述符表,现在我们来分析局部段描述符表的使用. 什么是LDT(Local Descriptor Table)? 局部段描述符表: 本质是一个段描述符表,用于定义段描述符 与GDT类似,可以看做"段描述符的数组" 通过定义选择子访问局部段描述符表中的元素 局部段描述符的选择子和全局描述符的选择子在结构上是完全一样的,3-15位为描述符索引值,LDT选择子的第二位恒为1,1-0位为RPL. 局部段描述符表就是一段内存,里面的每一项是一个局部段描述符(第0项也是有意义

[保护模式]段描述符属性_P位_G位

1.P位 P = 1 段描述符有效 P = 0 段描述符无效 2.段描述符与段寄存器的对应关系 Struct SegMent { WORD Selector; //16位段选择子 WORD Attributes; //16位属性 对应的高4字节,从8位开始到23位结束 刚好16字节 DWORD Base: //32位基址 由三部分组成 最高位为高四字节的24-31位 ,第二部分位高四字节的第0-7位,第三部分为低四字节的16-31位 DWORD Limit: //32位段限长 两部分组成,高位在

保护模式_1_段寄存器_段描述符_段选择子

1 段寄存器 1-1 段寄存器的结构 图示: 结构体表示: struct SegMent { WORD Selector; WORD Attribute; DWORD Base; DWORD Limit; } 1-2 段寄存器的属性探测 可以通过MOV指令进行读写(LDTR和TR除外) 段寄存器成员简介 探测Attribute是否存在 int var=0; int main() { __asm { mov ax, ss //cs不行 cs是可读 可执行 但不可写 mov ds, ax mov d

【从头开始写操作系统系列】页表以及相关的描述符详解

在之前的文章中,我们介绍过 GDT(全局描述符表)以及一致代码段和非一致代码段,这篇文章我们再回到描述符,这次我们来以 ARM 架构为例了解一下页表描述符. 在这篇文章中,我们会看到以下内容: 页表是什么? 一级页表的地址变换过程 由一级描述符来获取二级描述符或者段地址的过程 页表 页表是什么? 页表是一种特殊的数据结构,放在系统空间的页表区,存放逻辑页与物理页帧的对应关系. 每一个进程都拥有一个自己的页表,PCB表中有指针指向页表. (来自百度百科) 通俗的来讲,页表的内容就是一个描述符(关于

My first blog: GDT与基本描述符的结构

参考文章:Intel64 and IA32 Architectures Software Developer's Manual Volume 2 ~ 3 GDT(Global Descriptor Table,全局描述符表)是x86和amd64架构最最基本的数据结构,它存储在内存中,以GDTR记录基地址,是让电脑从实模式跳转到保护模式的台阶.在汇编代码中,我们可以用 lgdt [gdt_base] 来加载GDT到内存中. GDT的结构是这样的: GDTR.base->           ___

【译】x86程序员手册18-6.3.1描述符保存保护参数

6.3 Segment-Level Protection 段级保护 All five aspects of protection apply to segment translation: 段转换时会提供以下5个方面的保护: Type checking 类型检验 Limit checking 限长检验 Restriction of addressable domain 可寻址域的限定 Restriction of procedure entry points 程序入口点的限定 Restricti

进程与进程描述符(task_struct)

一. 进程 进程(Process) 计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在当代面向线程设计的计算机结构中,进程是线程的容器.程序是指令.数据及其组织形式的描述,进程是程序的实体. --------------------------------------------------------------- 释义:一段程序的执行过程 特征:动态.独立.异步.并发 结构特征