GDT全局描述符表

什么是GDT全局描述符表

GDT全称为Global Descriptor Table,全局描述符表。

保护模式的寻址方式不在使用寄存器分段的方式直接寻址方式了。而采用的是使用GDT(全局分段描述表)来寻址。从而使用更多的内存地址。

创建GDT全局描述符表使用到一个48位的寄存器:GDTR寄存器。

1)首先,在内存中划分一些内存段,并且每个内存段赋予一个索引。

2)然后,使用lgdt指令,设置GDT的索引和表信息的内存地址到GDTR寄存器。

3)进入保护模式,指令跳转,从实模式分段方式寻址切换到使用GDT分段方式寻址。

4) GDT可以被放在内存的任何地方,只要提供内存地址给GDTR寄存器就可以了。

GDT格式

GDT全局描述符表

  • 表基地址,表基地址位GDT段表在内存的地址,GDT段表是一个列表,存储了多个 GDT段描述符。
  • 表界限:GDT段表的空间信息,以字节为单位。

GDT全局描述符表 = GDT段表基地址 | 16位表界限

GDT段表 =  GDT段描述符 |  GDT段描述符 | GDT段描述符 ...

表界限 = GDT字节数 - 1 (表示 0 - 0x...)

GDT段描述符

GDT段描述符,用来描述在GDT方式在内存中分配的一个段信息,总共8字节64位。

GDT段描述符结构

为了兼容以前的CPU,GDT段描述符的信息被分割成几个部分,格式如下:

GDT段描述符 = 

段基址 (8位)| 段描述符(4位) | 段界限(4位) | 段描述符(8位) 段基址 (8位)

段基址 (16位) | 段界限(16位)

段描述符定义

  • 段基址:规定段的起始地址,长度32位.
  • 段界限:规定段的大小,长度20位。段界限可以是以4KB或者1B为单元大小
  • 段属性:确定段的各种性质.长度(12位)

段属性:

  • G 粒度位: 段界限的单位大小,G=1表示段界限以4KB为单元单位,G=0表示段界限以1B为单元单位
  • D/B 表示操作数为多少位, 0表示16位操作数,1表示32位操作数
  • L : 0 表示非64位代码段,1表示64位代码段
  • AVL :可用字段,暂时没什么用
  • P 段存在位:通常为1,表示段存在于内存中,0则此段为非法的,不能被用来实现地址转换
  • DPL 特权级(2位): 用来实现保护机制
  • S 为0表示系统段,为1表示非系统段
  • type 类型(4位): 用于区别不同类型的描述符。内存段或者门的子类型

type值

Type位 说明 取值
代码段时
X:3位 代码段值为1 0:为数据段
1:为代码段
C:2位 访问位 0:为普通段
1:为一致码段
R:1位 是否可读 0:只执行
1:可读
A:0位 访问位. 该段是否被访问过 0 :未访问
1:已访问
数据段时
X:3位 数据段值为1 0:为数据段
1:为代码段
E:2位 扩展方向 0:向高位扩展
1:向低位扩展
W:1位 是否可写 0:只读
1:可写
A:0位 访问位 0: 未访问
1:已访问

段界限:

段界限边界值 = (描述符的段界限值 + 1) × (段界限颗粒读:4Kb 或者 1b) -1

反之:
描述符的段界限值 = (段界限边界值 + 1) /(段界限颗粒读:4Kb 或者 1b)

例如:

16MB的段界限值 = 0x1000000 /(段界限颗粒读:4Kb 或者 1b - 1)= 0x0fff

段选择子

段选择子包括三部分:描述符索引(index)、TI、请求特权级(RPL)

GDTR寄存器

在内存中建立完成GDT信息后,CPU会将GDT的内存地址 和 段界限 数据加载入GDTR寄存器

GDTR寄存器数据(48位):

GDTR定义数据(48位) = GDT全局描述符表的大小(16位) + GDT全局描述符表的地址(32位)

lgdt指令

lgdt GDTR定义数据

其中GDT全局描述符表数据格式如下

GDT全局描述符表 = GDT段描述符(64位) | GDT段描述符(64位) | GDT段描述符(64位) ...

GDT段描述符 = 段基址 (8位)| 段描述符(4位) | 段界限(4位) | 段描述符(8位) | 段基址 (8位) | 段基址 (16位) | 段界限(16位)

其中,第一个GDT段的数据为空。

GDT全局描述符表的更多相关文章

  1. linux内核学习之全局描述符表(GDT)(二)

    来源:https://www.cnblogs.com/longintchar/p/5224406.html 在进入保护模式之前,我们先要学习一些基础知识.今天我们看一下全局描述符表(Global De ...

  2. 全局描述符表(GDT)——《x86汇编语言:从实模式到保护模式》读书笔记09

    在进入保护模式之前,我们先要学习一些基础知识.今天我们看一下全局描述符表(Global Descriptor Table, 简称GDT). 同实模式一样,在保护模式下,对内存的访问仍然使用段地址加偏移 ...

  3. 全局描述符表GDT

    写在前面 添油加醋系列第二弹--剖析GDT 头文件:https://github.com/bajdcc/MiniOS/blob/master/include/gdt.h 实现:https://gith ...

  4. Bran的内核开发教程(bkerndev)-06 全局描述符表(GDT)

    全局描述符表(GDT)   在386平台各种保护措施中最重要的就是全局描述符表(GDT).GDT为内存的某些部分定义了基本的访问权限.我们可以使用GDT中的一个索引来生成段冲突异常, 让内核终止执行异 ...

  5. 获取全局描述符表GDT的内容

    /stdfx.h文件 //Ring0环的程序 //测试环境VS2005 #ifndef _WIN32_WINNT // Allow use of features specific to Window ...

  6. 保护模式下GDTR,LDTR,全局描述符表,局部描述符表和选择器的关系

    这张图要注意:右边两个0-15,其中上面的是LDTR,  下面的是选择子. 图下第五个标线,是两个线交叉的,实际上第五个线是指向右边水平的那个线. 没有箭头的两组线分别表示GDT的区间,LDT的区间 ...

  7. GDT临时分段

    GDT临时分段 GDT临时段说明 现在已经进入了保护模式, 目前的改变 可以访问1M以上的内存了 可以使用32位的指令操作 问题: 由于以前的是实式下段寄存器寻址方式无法使用了,我们必须切换到使用GD ...

  8. Linux多线程编程和Linux 2.6下的NPTL

    Linux多线程编程和Linux 2.6下的NPTL 在Linux 上,从内核角度而言,基本没有什么线程和进程的区别--大家都是进程.一个进程的多个线程只是多个特殊的进程他们虽然有各自的进程描述结构, ...

  9. setup.s

    INITSEG = 0x9000 ! we move boot here - out of the way ! 原来 bootsect 所处的段. ! ok, the read went well s ...

随机推荐

  1. Asianux 7.3安装Oracle 11.2.0.4单实例体验

    环境:Asianux 7.3 需求:安装Oracle 11.2.0.4 单实例 背景:系统使用默认的最小安装部署,Oracle安装额外需要的包统一使用yum安装. 查看当前系统相关信息: [root@ ...

  2. RedHat7.之.图形化切换

    RedHat7.之.图形化切换 从黑窗口(纯指令输入界面)切换到图形化界面,使用root用户执行指令:startx 指令:startx 如有问题,欢迎纠正!!! 如有转载,请标明源处:https:// ...

  3. windows程序设计 获取显示器分辨率

    我的显示器分辨率 /*--------------------------------------------------------------------------- scrsize.c -- ...

  4. VCS

    timing check相关的, +notimingcheck命令,可以用在compile时,也可以用在run time的时候, 都是将检查timing的系统函数,都disable掉了, 加在comp ...

  5. 关于EasyUI查询功能的二级联动

    EasyUI 二级联动 data-options="multiple:true" 属性可实现对于车牌号的多选.

  6. sersync 开机自启 (仅供自己参考)

    sersync是一个实时同步的软件,,将其添加到/etc/rc.local中没有效果 ##之所以没效果是因为:####由于/etc/rc.local是/etc/rc.d/rc.local的软连接,所以 ...

  7. Shift键的三个妙用!Word又现神操作!

    1.Shift+Alt+上下方向键 :调整段落顺序 同时按这三个键,能够调整段落的顺序,也可以用来调整表格中的行序. 2.Shift+F3:英文大写/小写/首字母大写,这三种模式切换 PS:如果中间夹 ...

  8. c#高级编程第七版 学习笔记 第二章 核心c#

    第二章 核心C# 本章内容: 声明变量 变量的初始化和作用域 C#的预定义数据类型 在c#程序中使用条件语句.循环和跳转语句执行流 枚举 名称空间 Main()方法 基本的命令行c#编译器选项 使用S ...

  9. esp32-micropython

    本来之前买和另一贴子的esp8266一起买了一块esp32. 现在开发esp的大概有乐鑫的ide以及基于乐鑫定制的.arduino.nodemcu.还有就是现在要讲的micropython. 乐鑫的主 ...

  10. 一道简单树形dp

    题意:给定一棵树,从中选出一些节点,使得不成父子关系的节点对数最多.问这个最大值是多少. 思路:首先既然是给定一颗树,先要选择合适的数据结构,来保存这颗树.由于这颗树只关心根节点在哪里,所以只需要用一 ...