GDT(全局描述符表)和LDT(局部描述符表)

article/2025/9/19 3:55:31
Home  >  GDT(全局描述符表)和LDT(局部描述符表)


每个程序都有自己的LDT,但是同一台计算机上的所有程序共享一个GDT。LDT描述局部于每个程序的段,包括其代码、数据、堆栈等。GDT描述系统段,包括操作系统本身。

全局描述符表GDT(Global Descriptor Table)在整个系统中,全局描述符表GDT只有一张(一个处理器对应一个GDT),GDT可以被放在内存的任何位置,但CPU必须知道GDT的入口,也就是基地址放在哪里,Intel的设计者门提供了一个寄存器GDTR用来存放GDT的入口地址,程序员将GDT设定在内存中某个位置之后,可以通过LGDT指令将GDT的入口地址装入此积存器,从此以后,CPU就根据此寄存器中的内容作为GDT的入口来访问GDT了。GDTR中存放的是GDT在内存中的基地址和其表长界限。

GDTR结构段选择子(Selector)由GDTR访问全局描述符表是通过“段选择子”(实模式下的段寄存器)来完成的。为了访问一个段,一个Pentium程序必须把这个段的选择子装入机器的6个段寄存器的某一个中。在运行过程中,CS寄存器保存代码段的选择子,DS寄存器保存数据段的选择子。每个选择子是一个16位数。

selector选择子中的一位指出这个段是局部的还是全局的(它是在LDT中还是在GDT中),其他的13位索引是LDT或GDT的表项编号,表示所需要的段的描述符在描述符表的位置,由这个位置再根据在GDTR中存储的描述符表基址就可以找到相应的描述符,然后用描述符表中的段基址加上逻辑地址(SEL:OFFSET)的OFFSET就可以转换成线性地址。因此,这些表的长度被限制在最多容纳8K个段描述符。

段选择子中的TI值只有一位0或1,0代表选择子是在GDT选择,1代表选择子是在LDT选择。请求特权级(RPL)则代表选择子的特权级,共有4个特权级(0级、1级、2级、3级)。任务中的每一个段都有一个特定的级别。每当一个程序试图访问某一个段时,就将该程序所拥有的特权级与要访问的特权级进行比较,以决定能否访问该段。系统约定,CPU只能访问同一特权级或级别较低特权级的段。

例如给出逻辑地址:21h:12345678h转换为线性地址
a. 选择子SEL=21h=0000000000100 0 01b 他代表的意思是:选择子的index=4即100b选择GDT中的第4个描述符;TI=0代表选择子是在GDT选择;左后的01b代表特权级RPL=1
b. OFFSET=12345678h若此时GDT第四个描述符中描述的段基址(Base)为11111111h,则线性地址=11111111h+12345678h=23456789h

③局部描述符表LDT(Local Descriptor Table)局部描述符表可以有若干张,每个任务可以有一张。我们可以这样理解GDT和LDT:GDT为一级描述符表,LDT为二级描述符表。如图

gdt寻址

    LDT和GDT从本质上说是相同的,只是LDT嵌套在GDT之中。LDTR记录局部描述符表的起始位置,与GDTR不同LDTR的内容是一个段选择子。由于LDT本身同样是一段内存,也是一个段,所以它也有个描述符描述它,这个描述符就存储在GDT中,对应这个表述符也会有一个选择子,LDTR装载的就是这样一个选择子。LDTR可以在程序中随时改变,通过使用lldt指令。如上图,如果装载的是Selector 2则LDTR指向的是表LDT2。举个例子:如果我们想在表LDT2中选择第三个描述符所描述的段的地址12345678h。
    1. 首先需要装载LDTR使它指向LDT2 使用指令lldt将Select2装载到LDTR
    2. 通过逻辑地址(SEL:OFFSET)访问时SEL的index=3代表选择第三个描述符;TI=1代表选择子是在LDT选择,此时LDTR指向的是LDT2,所以是在LDT2中选择,此时的SEL值为1Ch(二进制为11 1 00b)。OFFSET=12345678h。逻辑地址为1C:12345678h
    3. 由SEL选择出描述符,由描述符中的基址(Base)加上OFFSET可得到线性地址,例如基址是11111111h,则线性地址=11111111h+12345678h=23456789h
    4. 此时若再想访问LDT1中的第三个描述符,只要使用lldt指令将选择子Selector 1装入再执行2、3两步就可以了(因为此时LDTR又指向了LDT1)
    由于每个进程都有自己的一套程序段、数据段、堆栈段,有了局部描述符表则可以将每个进程的程序段、数据段、堆栈段封装在一起,只要改变LDTR就可以实现对不同进程的段进行访问。

    段描述符

    P,present位,1表示所描述的段存在(有效),为0表示所描述的段无效,使用该描述符会引起异常 
    DPL,Descriptor privilege,描述符特权级别,说明所描述段的特权级别 

    DT,描述符类型位,1说明当前描述符为存储段描述符,0为系统描述符或门描述符. 
    TYPE: 
    位0:A(accessed)位,表明描述符是否已被访问;把选择子装入段寄存器时,该位被标记为1 
    位3:E(EXECUTABLE?)位,0说明所描述段为数据段;1为可执行段(代码段)
    当为数据段时, 
       位1为W位,说明该数据段是否可写(0只读,1可写) 
       位2为ED位,说明该段的扩展方向(0向高位扩展,1向低位扩展) 
    当为可执行段是, 
       位1为R位,说明该执行段是否可读(0只执行,1可读) 
       位2为C位,0说明该段不是一致码段(普通代码段),1为一致码段 
    G为粒度位,0说明LIMIT粒度为字节,1为4K字节. 
    D位: 
       1.在可执行段中,D为1,表示使用32位地址,32/8位操作数;为0表示使用16位地址,16/8位操作数 
       2.在由SS寻址的段描述符(堆栈段?)中,D为1表示隐含操作(如PUSH/POP)使用ESP为堆栈指针,
         为0使用SP(隐含操作:未明确定义段属性类型USE16/USE32?66H,67H?) 
       3.在向低扩展的存储段中,D为1,表示段的上限为4G;为0上限为64K
    存储段描述符的结构表示:

    分段管理可以把虚拟地址转换成线性地址,而分页管理可以进一步将线性地址转换成物理地址。当CR0中的PG位置1时,启动分页管理功能,为0时,这禁止启动分页管理功能,并且把线性地址作物理地址使用。

    虚拟地址转为线性地址:

    线性地址= 段基指 + 偏移地址

    32位线性地址转为物理地址:
    32位分为:
    页目录索引:占最高10位,指示页目录表中第几个页表描述符
    页表索引:占12位到21位,也是10位。指示这页表中第几个页描述符
    页描述符:线性地址的低12位为页内偏移量。

     

    转自http://blog.csdn.net/billpig/article/details/5833980


    http://chatgpt.dhexx.cn/article/ocT10iWl.shtml

    相关文章

    什么是数据可视化?

    到底什么是数据可视化?带你一窥究竟~ 技术人最不该忽视可视化数据分析! 导读:在这个“人人都是数据分析师”的时代,大企业的同学几乎都在参与数据的采集、加工与消费。数据可视化作为连接“加工——消费”的重要一环…

    当下最火的中台到底是个什么鬼,看完这一篇最通俗易懂的文章后,你就会彻底明白了!...

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你提升技术视野! 背景 自从阿里巴巴现任CEO逍遥子在2015年提出”大中台,小前台”战略以来,关于”什么是中台”,可谓是一石激起千层浪,大量文章在描述…

    STD::是什么?

    【&#xff23;&#xff0b;&#xff0b;】std&#xff1a;&#xff1a;是什么&#xff1f; 引例&#xff1a; #include<iostream> int main() {std::cout<<"我喜欢C";//输出一句话std::cout<<std::endl;//换行return 0; } 1.std是什么&#xff1…

    C语言中 1%3,算术什么意思啊 算数什么意思

    算术什么意思啊 算数什么意思以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 算术是什么意思 数学 什么是算术和 算术和是正数的和,即绝对值的和,例如2+13.5+7,Ge个数值皆为正且相加。  主要区别于代数和,…

    matlab语句temp,maxtemp什么意思 will什么意思

    maxtemp什么意思 will什么意思以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Min Temp 和 Max Temp 是什么意思 最小的Temp和最大Temp Temp: Chang用的办公软件和其他应用程序通常会临时保Cun用户的工作结果,…

    html 玫瑰花

    简易html 代码玫瑰花 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>玫瑰</title><style type"text/css"> #shusheng { position: absolute; width: 100%; height: 100%; text-align: center; } &…

    计算并输出所有的玫瑰花数

    如果一个n位正整数等于它的n个数字的n次方和&#xff0c;则称该数为n位自方幂数。四位自方幂数称为玫瑰花数。编程计算并输出所有的玫瑰花数。 #include <stdio.h> #include <math.h>int main() {for (int i 1000; i < 10000; i){if (i pow(i%10, 4) pow((i/…

    C语言代码:玫瑰花

    前文 在古希腊神话中&#xff0c;玫瑰花集爱与美于一身&#xff0c;既是美神的化身&#xff0c;又溶进了爱神的血液&#xff0c;所以它所代表的含义是爱情。 我们应该用玫瑰花来表达我们的爱意&#xff0c;但是好多的恋人都是因为异地而没有办法去买一束新鲜的玫瑰去送给自己的…

    七夕玫瑰花合集

    图片来源&#xff1a;百度动图 一年一度的七夕又快到了&#xff0c;用Python画一朵玫瑰花送给你的那个TA吧图片。更多表白代码可以到”阿黎逸阳的代码“公众号中翻看表白合集中的文章。 一、绘制结果 1. 玫瑰花1 2. 玫瑰花2 二、画玫瑰花代码 1. 用turtle库画一朵玫瑰花版本1 #…

    C++玫瑰花源码

    #include "stdafx.h" #include <graphics.h> #include <conio.h> #include <math.h> // 定义全局变量 int rosesize 500; int h -250; // 定义结构体 struct DOT { double x; double y; double z; double red; // 红…

    Python玫瑰花

    用Python画一朵玫瑰花&#xff08;附带源码&#xff09; 需要的模块包 turtle(内置包) 源码部分 import turtle# 设置初始位置 turtle.penup() turtle.left(90) turtle.fd(200) turtle.pendown() turtle.right(90)# 花蕊 turtle.fillcolor("red") turtle.begin_fill…

    C语言玫瑰花

    效果图&#xff0c;如果想要更改颜色&#xff0c;可以在代码最后一行system处修改。 #include <stdio.h> #include <math.h>const int max_iterations 128; const float stop_threshold 0.01f; const float grad_step 0.01f; const float clip_far 10.0f;cons…

    如何买玫瑰?

    代码和任务 /*copyright(c)2015 csdn学院 *All right reserved. *文件名称&#xff1a;main.c *作者&#xff1b;张如田 *完成日期&#xff1a; *版本号&#xff1a; *任务描述&#xff1a;小慧过生日&#xff0c;小明&#xff08;小明真忙&#xff09;要买鲜花送她。每枝红玫瑰…

    买玫瑰

    要求&#xff1a;小慧过生日&#xff0c;小明&#xff08;小明真忙&#xff09;要买鲜花送她。每枝红玫瑰5元&#xff0c;满5支送1枝&#xff0c;满20枝送5枝。小明一共有n(n>10)元钱&#xff0c;最多能买到多少&#xff1f; 样例输入&#xff1a;135 样例输出&#xff1a;3…

    中软国际实训全记录——第三天

    中软国际实训第三天——认识ssm与搭建ssm 1、ssm框架基本概念1.1、Spring1.2、SpringMVC1.3、MyBatis 2、建立ssm项目2.1、新建Maven项目2.2、添加项目主要目录2.3、项目内容编码2.4、使用Tomcat运行项目2.5、建立数据库的连接2.6、对数据库中数据进行查询2.7、使用控制器显示查…

    中软国际实训全记录——第六天

    中软国际实训第六天——SpringSecurity的架构与实现 实现SpringSecurity导入依赖包配置过滤器添加配置文件编码实现 在昨天实现了角色管理的增添查改与分页之后&#xff0c;在今天我们需要将不同的用户分类&#xff0c;以保证在用户是不同权限时&#xff0c;可以对所需的信息进…

    中软国际实训全记录——第五天

    中软国际实训第五天——实现分页式管理及 实现对用户列表的分页式管理实现角色管理的数据库以及初步操作个人总结 实现对用户列表的分页式管理 在昨天我们实现了对数据库中的增添查改&#xff0c;因此在此处我们不再赘述如何实现&#xff0c;今天我们就主要来实现分页式的管理…

    中软国际软件测试培训中心,中软国际准员工培养计划C++开发/软件测试方向开班典礼...

    2010年8月31日上午9点半&#xff0c;中软国际准员工培养计划—C开发/软件测试方向开班典礼在无锡ETC隆重举行。 开班典礼在热烈的掌声中拉开了序幕。典礼由教务部经理陈晨老师主持&#xff0c;首先她对近20名学员的到来表示欢迎&#xff0c;并对本次学习班顺利开班表示祝贺。中…

    中软国际实训全记录——第七天

    中软国际实训第七天——实现多条信息的删除 实现对用户信息的多条删除&#xff0c;我们需要使用到aiax&#xff0c;AJAX不是JavaScript的规范&#xff0c;它是Asynchronous JavaScript and XML&#xff0c;意思就是用JavaScript执行异步网络请求。 如果仔细观察一个Form的提交&…

    中软国际实训全记录——第一天

    中软国际实训第一天——软件安装 1、安装jdk2、安装idea3、安装Tomcat配置环境变量配置Tomcat将Tomcat加入服务中Tomcat的启动 4、安装maven配置环境变量配置阿里云镜像源 5、安装MySQL安装MySQL验证MySQL 6、安装编辑器 1、安装jdk 下载武汉理工软件安装包之后将其解压&#…