GDT详解(全局描述符表)

作者:admin 日期:2009-10-21

字体大小: 小 中 大

在Protected Mode下,一个重要的必不可少的数据结构就是GDT(Global Descriptor Table)。

为什么要有GDT?我们首先考虑一下在Real Mode下的编程模型:

在Real Mode下,我们对一个内存地址的访问是通过Segment:Offset的方式来进行的,其中Segment是一个段的Base Address,一个Segment的最大长度是64 KB,这是16-bit系统所能表示的最大长度。而Offset则是相对于此Segment Base Address的偏移量。Base Address+Offset就是一个内存绝对地址。由此,我们可以看出,一个段具备两个因素:Base Address和Limit(段的最大长度),而对一个内存地址的访问,则是需要指出:使用哪个段?以及相对于这个段Base Address的Offset,这个Offset应该小于此段的Limit。当然对于16-bit系统,Limit不要指定,默认为最大长度64KB,而 16-bit的Offset也永远不可能大于此Limit。我们在实际编程的时候,使用16-bit段寄存器CS(Code Segment),DS(Data Segment),SS(Stack Segment)来指定Segment,CPU将段积存器中的数值向左偏移4-bit,放到20-bit的地址线上就成为20-bit的Base Address。

到了Protected Mode,内存的管理模式分为两种,段模式和页模式,其中页模式也是基于段模式的。也就是说,Protected Mode的内存管理模式事实上是:纯段模式和段页式。进一步说,段模式是必不可少的,而页模式则是可选的——如果使用页模式,则是段页式;否则这是纯段模式。

既然是这样,我们就先不去考虑页模式。对于段模式来讲,访问一个内存地址仍然使用Segment:Offset的方式,这是很自然的。由于 Protected Mode运行在32-bit系统上,那么Segment的两个因素:Base Address和Limit也都是32位的。IA-32允许将一个段的Base Address设为32-bit所能表示的任何值(Limit则可以被设为32-bit所能表示的,以2^12为倍数的任何指),而不象Real Mode下,一个段的Base Address只能是16的倍数(因为其低4-bit是通过左移运算得来的,只能为0,从而达到使用16-bit段寄存器表示20-bit Base Address的目的),而一个段的Limit只能为固定值64 KB。另外,Protected Mode,顾名思义,又为段模式提供了保护机制,也就说一个段的描述符需要规定对自身的访问权限(Access)。所以,在Protected Mode下,对一个段的描述则包括3方面因素:[Base Address, Limit, Access],它们加在一起被放在一个64-bit长的数据结构中,被称为段描述符。这种情况下,如果我们直接通过一个64-bit段描述符来引用一个段的时候,就必须使用一个64-bit长的段积存器装入这个段描述符。但Intel为了保持向后兼容,将段积存器仍然规定为16-bit(尽管每个段积存器事实上有一个64-bit长的不可见部分,但对于程序员来说,段积存器就是16-bit的),那么很明显,我们无法通过16-bit长度的段积存器来直接引用64-bit的段描述符。

怎么办?解决的方法就是把这些长度为64-bit的段描述符放入一个数组中,而将段寄存器中的值作为下标索引来间接引用(事实上,是将段寄存器中的高13 -bit的内容作为索引)。这个全局的数组就是GDT。事实上,在GDT中存放的不仅仅是段描述符,还有其它描述符,它们都是64-bit长,我们随后再讨论。

GDT可以被放在内存的任何位置,那么当程序员通过段寄存器来引用一个段描述符时,CPU必须知道GDT的入口,也就是基地址放在哪里,所以 Intel的设计者门提供了一个寄存器GDTR用来存放GDT的入口地址,程序员将GDT设定在内存中某个位置之后,可以通过LGDT指令将GDT的入口地址装入此积存器,从此以后,CPU就根据此积存器中的内容作为GDT的入口来访问GDT了。

GDT是Protected Mode所必须的数据结构,也是唯一的——不应该,也不可能有多个。另外,正象它的名字(Global Descriptor Table)所揭示的,它是全局可见的,对任何一个任务而言都是这样。

除了GDT之外,IA-32还允许程序员构建与GDT类似的数据结构,它们被称作LDT(Local Descriptor Table),但与GDT不同的是,LDT在系统中可以存在多个,并且从LDT的名字可以得知,LDT不是全局可见的,它们只对引用它们的任务可见,每个任务最多可以拥有一个LDT。另外,每一个LDT自身作为一个段存在,它们的段描述符被放在GDT中。

IA-32为LDT的入口地址也提供了一个寄存器LDTR,因为在任何时刻只能有一个任务在运行,所以LDT寄存器全局也只需要有一个。如果一个任务拥有自身的LDT,那么当它需要引用自身的LDT时,它需要通过LLDT将其LDT的段描述符装入此寄存器。LLDT指令与LGDT指令不同的时,LGDT指令的操作数是一个32-bit的内存地址,这个内存地址处存放的是一个32-bit GDT的入口地址,以及16-bit的GDT Limit。而LLDT指令的操作数是一个16-bit的选择子,这个选择子主要内容是:被装入的LDT的段描述符在GDT中的索引值——这一点和刚才所讨论的通过段积存器引用段的模式是一样的

文章来自: 本站原创

Tags:

评论: 0 | 查看次数: 8683

gdt描述_GDT详解(全局描述符表)相关推荐

  1. 简历项目描述过程详解

    简历项目描述过程详解 一.项目分点 1.1 集群规模 1.2 框架结构,画出来 1.3 框架 1.3.1 第一个Flume 1.3.1.1 碰到的问题 1.3.2 kafka 1.3.2.1 框架介绍 ...

  2. zemax操作数_ZEMAX与像差理论:二级光谱的ZEMAX描述与详解

    ZEMAX与像差理论:二级光谱的ZEMAX描述与详解 有人咨询一个问题,我们老师让我看看这个longtitudinal aberration图,让双胶合望远物镜的longtitudinal aberr ...

  3. USB的端点描述符详解-重新排版

    USB的端点描述符详解 端点描述符,是描述USB通信通道或管道的类型和功能的标准USB描述符. 端点描述符和接口描述符还有配置描述符一样,不能单独发送给USB主机,需要以配置描述符集合的形式发送给主机 ...

  4. BRISK特征点描述算法详解

    转自:BRISK特征点描述算法详解_AstoncPou的博客-CSDN博客_brisk特征点 BRISK特征点描述算法详解 简介 BRISK算法是2011年ICCV上<BRISK:Binary ...

  5. gdt描述_GDT,LDT,GDTR,LDTR 详解,包你理解透彻 | 技术部落

    一.引入 保护模式下的段寄存器 由 16位的选择器 与 64位的段描述符寄存器 构成 段描述符寄存器: 存储段描述符 选择器:存储段描述符的索引 段寄存器 PS:原先实模式下的各个段寄存器作为保护模式 ...

  6. gdt描述_GDT全局描述符表

    GDT全局描述符表 什么是GDT全局描述符表 GDT全称为Global Descriptor Table,全局描述符表. 保护模式的寻址方式不在使用寄存器分段的方式直接寻址方式了.而采用的是使用GDT ...

  7. gdt描述_GDT表与段描述符

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html GDT表与段描述符 一.介绍 如果之前学习过"实模式&q ...

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

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

  9. linux系统文件描述符详解

    首先我们需要知道操作系统内维护了三个系统文件表:文件描述符表(file descriptor table),打开文件表(open file table),inode table.这三个表的结构见Tab ...

最新文章

  1. Python3中collections.OrderedDict介绍
  2. UVa10825 Anagram and Multiplication(dfs)
  3. 淘宝网秒杀需求分析与实现 - 公开课笔记
  4. Win10开启Administrator超级管理员账户
  5. 撸过一万行代码,你看过这篇文章吗?
  6. 您需要了解的有关UI测试的所有信息
  7. 如何进行cad地理配准_【教程】自带高度建筑轮廓如何制作分色图
  8. 译:Self-Modifying cod 和cacheflush
  9. 通过更改cmake的源码实现使用代理的下载命令
  10. 程序员修炼之道(二)
  11. Qt 中文和英文分别使用不同的字体
  12. 火狐浏览器设置无图模式
  13. Unity拓展——菜单栏拓展
  14. 1698无法登录mysql服务器,Mysql ERROR 1698 (28000) 解决
  15. ibm服务器usb虚拟网卡,山石虚拟防火墙安装步骤
  16. unityplayerpre存档_Unity3d中的PlayerPrefs游戏存档API的扩展
  17. redux-saga实现与原理
  18. mysql数据库的行级锁有几种_数据库行级锁和表锁区别
  19. Vuforia AR 介绍
  20. 新手小白做短视频自媒体,入门流程分享,让你少走很多弯路

热门文章

  1. Redis 中的 持久化 RDB持久化 SAVE:阻塞服务器并创建RDB文件 BGSAVE:以非阻塞方式创建RDB文件 通过配置选项自动创建RDB文件
  2. Linux中批量压缩文件夹
  3. eclipse无法生成class文件,servlet修改后未更新,总是重启服务器
  4. sourceinsight 双击变量 全部高亮
  5. Andriod Studio如何修改APP软件名和头像
  6. python中ignorecase_【Python进阶】2.6字符串忽略大小写的搜索替换 re.IGNORECASE
  7. Citrix DDC1912LTSRCU2安装
  8. 【券商报告】海外电力与新能源行业跟踪(第二期):减碳“风光”无限好,国内外新能源需求共振——附下载链接
  9. 图片扭扭看,牛逼的图像学算法【安卓软件】
  10. Java实现自签名证书,CA颁发证书