GDT(Global Descriptor Table)

news/2024/7/20 14:17:39 标签: 数据结构与算法, 内存管理

为什么80%的码农都做不了架构师?>>>   hot3.png

在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中的索引值——这一点和刚才所 讨论的通过段积存器引用段的模式是一样的。

转载于:https://my.oschina.net/cfeng/blog/80892


http://www.niftyadmin.cn/n/1484837.html

相关文章

python tcp 粘包问题解决、文件下载等

from socket import * #以下是关于tcp:服务端 和 客户端的小例子#服务端socket_server socket(AF_INET, SOCK_STREAM)socket_server.bind((127.0.0.1, 8080))print(进行监听)socket_server.listen(5)while True: print(进行连接) conn, address socket_serv…

Nginx+PHP+MySQL双机互备、全自动切换方案[转载]

2019独角兽企业重金招聘Python工程师标准>>> 在生产应用中,某台“NginxPHPMySQL”接口数据服务器,扮演的角色十分重要,如果服务器硬件或Nginx、MySQL发生故障,而短时间内无法恢复,后果将非常严重。为了避免…

react 组件封装原则_深入理解React高阶组件

1 引言高阶组件( higher-order component ,HOC )是 React 中复用组件逻辑的一种进阶技巧。它本身并不是 React 的 API,而是一种 React 组件的设计理念,众多的 React 库已经证明了它的价值,例如耳熟能详的 react-redux。高阶组件的…

Keycloak忘记密码设置

Keycloak提供密码找回功能,用户需要输入用户名或者邮箱,Keycloak会给用户指定的邮箱发送密码重置邮件,本文就Keycloak中realm的发送方邮箱的配置做以下记录。 1.relam中邮箱配置如下图所示。 2.开启忘记密码功能,如下图所示。 转载…

quartz job运行中修改cron表达式_SpringBoot大神教程3:集成Quartz

要点pom.xml引入Quartz依赖配置Quartz Configurationapplication.properties配置Quartz下载SQL脚步,导入到数据库Job中实现业务1. pom.xml引入Quartz依赖org.springframework.boot spring-boot-starter-quartz2. 配置Quartz Configurationpackage com.ly.job;Config…

[原译]YAXLib---- XML序列化神器

今天早上翻译了Yet-Another-XML-Serialization-Library-for-the-NET,将近4个小时把30页的文档翻译完了。因为文章很长。重新排版压力太大。。我把翻译好的做成了pdf,所以本文只列出前两部分。如果不符合规则。请管理员撤下。 文档下载:XML序列…

actived生命周期_vue生命周期钩子函数actived没有执行

调用actived钩子函数,发现代码没有执行.......为什么背景技术选型:vuevue-routervuex第一步:路由配置文件设置keepAlivetrue//index.jsimport Vue from vueimport Router from vue-routerVue.use(Router)export default new Router({routes: …

关于stm32进行卡尔曼滤波制作平衡车的一些心得和理解

关于卡尔曼滤波也是刚刚开始研究,很荣幸能和大家一起讨论学习,新浪微博:颠覆的饕餮 希望能和大家一起学习~~ 转载请声明出处并且保持文章完整性谢谢 这次的平衡车,使用到了卡尔曼滤波,下面谈谈使用心得 我们是利用角速…