计算机原理中的GDT与LDT

保护模式下的段寄存器 由 16位的选择器 与 64位的段描述符寄存器 构成
段描述符寄存器: 存储段描述符
选择器:存储段描述符的索引

PS:原先实模式下的各个段寄存器作为保护模式下的段选择器,80486中有6个(即CS,SS,DS,ES,FS,GS)80位的段寄存器,同时提供6个段左右机器当前运行的地址空间。由选择器CS对应表示的段仍为代码段,选择器SS对应表示的段仍为堆栈段

 

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

(2)段选择子(Selector)由GDTR访问全局描述符表是通过“段选择子”(实模式下的段寄存器)来完成的,如图三①步。段选择子是一个16位的寄存器(同实模式下的段寄存器相同)如图四

 


段选择子包括三部分:描述符索引(index)、TI、请求特权级(RPL)。他的index(描述符索引)部分表示所需要的段的描述符在描述符表的位置,由这个位置再根据在GDTR中存储的描述符表基址就可以找到相应的描述符(如图三①步)。然后用描述符表中的段基址加上逻辑地址(SEL:OFFSET)的OFFSET就可以转换成线性地址(如图三②步),段选择子中的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

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

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位为页内偏移量。

 

 

时间: 2024-10-25 10:46:10

计算机原理中的GDT与LDT的相关文章

计算机组成原理中,关于小数补码的定义问题

问题描述 计算机组成原理中,关于小数补码的定义问题 在唐塑飞老师的<计算机组成原理>第6章讲到补码的定义的时候举了个例子: 当x=-0.0110时,[x]补=2+x=10.0000-0.0110=1.1010: 2是为什么是转换成10.0000的?1.1010又是怎么算出来的? 不按照定义走的话,我知道"补码=反码+1"就可以算出来了,但是定义一出来人就懵了. 我是在自学计算机组成原理,请前辈们赐教! 解决方案 因为2用二进制表示就是10,和10.0000是一样的,写成10

flex-编译原理中的Flex与Bison,都应用在哪些领域,哪些公司在用?

问题描述 编译原理中的Flex与Bison,都应用在哪些领域,哪些公司在用? 大家好, 想问一下, 编译原理中的Flex与Bison,都应用在哪些领域,哪些公司在用? 我 有这方面的 开发经验,想找相关的工作.但是不知道济南哪些公司在用,请 各位大侠帮忙啦!谢谢!不好意思,没分了 ,请帮一下.

累加-请教各位大神什么是“乘积高位和乘积低位”?

问题描述 请教各位大神什么是"乘积高位和乘积低位"? 小白求教请问计算机原理中的Acc累加器中存储乘积高位 和MQ乘商寄存器的乘积低位怎么理解啊?能否请各位大神举个例子.本人有点迟钝,先谢谢各位了! 解决方案 比如说用两个16位的数来相乘,得到的积有可能是32位的,这就需要有两个16位的寄存器来放这个结果,一个放低16位,一个放高16位 解决方案二: 这里的16位全部都是用二进制表示的吧.两个16位二进制数的乘积是与逻辑(意义)还是就是和普通乘积一样的.还有你说的乘积有可能是32位数,

实模式/保护模式,GDT/LDT的含义

1.实模式.保护模式CPU启动时有两种模式,分别是:实模式 和 保护模式 实模式:不能使用多线程.不能实现权限分级.还不能访问20位以上地址线,也就是说只能访问1M内存(!!!)地址转换公式是:物理地址 = 线性地址 = 段地址*16 + 段偏移 保护模式:操作系统(system模块中的head.s程序)接管CPU后,会使CPU进入保护模式. 包括CPU权限分级. 多任务,内存分页等各种功能. 2.地址转换步骤 地址转换:查全GDT--> 查LDT --> 找到段(确定段基址) -->

深入理解计算机系统-之-内存寻址(三)--分段管理机制(段描述符,段选择子,描述符表)

逻辑地址-=>线性地址-=>物理地址 前面我们提到了当使用80x86微处理器时,有三种不同的地址: 逻辑地址(logical address):包含在机器语言指令中用来指定一个操作数或一条指令的地址.这个寻址方式在80x86著名的分段结构中表现得尤为具体,它促使MS-DOS或Windows程序员把程序分成若干段.每一个逻辑地址都由一个段(segment)和偏移量(offset或displacement)组成,偏移量指明了从段开始的地方到实际地址之间的距离. 线性地址(linear addres

深入理解计算机系统-之-内存寻址(二)--存储保护机制(CPU实模式与保护模式)

cpu的保护模式由来 分段机制 8086的诞生,标志着Intel 正式进入了x86时代,这是个多么具有纪念意义的日子:1978-6-8.同时,8086的诞生也是处理器内存寻址技术的第一次飞跃. 对于一根实际的.实实在在的.物理的.可看得见.摸得着的内存条而言,处理器把它当做8位一个字节的序列来管理和存取,每一个内存字节都有一个对应的地址,我们叫它物理地址,用地址可以表示的长度叫做寻址空间.而CPU是如何去访问内存单元里的数据的方式就叫做寻址. 8086得CPU在内存寻址方面第一次引入了一个非常重

理解Linux中断 (1)【转】

转自:http://blog.csdn.net/tommy_wxie/article/details/7425685 版权声明:本文为博主原创文章,未经博主允许不得转载. 一直认为,理解中断是理解内核的开始.中断已经远远超过仅仅为外围设备服务的范畴,它是现代体系结构的重要组成部分. 1.基本输入输出方式 现代体系结构的基本输入输出方式有三种: (1)程序查询: CPU周期性询问外部设备是否准备就绪.该方式的明显的缺点就是浪费CPU资源,效率低下. 但是,不要轻易的就认为该方式是一种不好的方式(漂

与/或表达式化简

一.问题的提出 假如我们有如下所示的与/或表达式: a*[b*[c+d]*e+f]+g化简后要得到如下的表达式: a*b*c*e+a*b*d*e+a*f+g表达式中允许的字母和算符 {A-Z, a-z, [,],*,+} 其中"[,]"表示括号,允许嵌套:"*"表示逻辑运算符"与":"+"表示逻辑运算符"或":并且"*"的优先级高于"+". 二.解决办法 在编译原理中

加速有理 迅雷超速下载13秘技

  迅雷作为一款非常流行的下载工具,赢得了很多用户的青睐.很多人在平时使用时往往只是使用它简单地下载.事实上,很多事物都在发展之中.只要我们平时在下载时多注意一些事项,往往可以让我们在高速下载路上"百尺竿头,更进一步"! 一.购买新硬件 安装 Windows Vista是现在最为安全和稳定的操作系统,而且对于网络有很大的增强.今年应该是Windows Vista的普及年,最主要的原因是1500-2000元现在就可以很好地升级现在的电脑.而且Windows Vista SP1马上也要发布