个人对GDT、GDTR、LDT、LDTR的理解

GDT是全局描述附表,主要存放操作系统和各任务公用的描述符,如公用的数据和代码段描述符、各任务的TSS描述符和LDT描述符。(TSS是任务状态段,存放各个任务私有运行状态信息描述符)
LDT是局部描述符表,主要存放各个任务的私有描述符,如本任务的代码段描述符和数据段描述符等。
GDTR是一个长度为48bit的寄存器,内容为一个32位的基地址和一个16位的段限。其中32位的基址是指GDT在内存中的地址。
LDTR是局部描述符寄存器,由一个可见的16位寄存器(段选择子)和一个不可见的描述符寄存器组成(描述符寄存器实际上是一个不可见的高速缓冲区)。
这里加入我的理解:应为GDT中除了有段描述符之外还有LDT描述符,所以微处理器在GDT中寻址LDT时,也需要使用选择子,以保持与段描述符寻址的统一。
在这里还要引入一个段选择子的概念。段选择子是一个寄存器,高13位用来指示描述符在描述符表中的索引号,低两位是表示使用描述符的特权级别;另外一位(T1)是GDT和LDT的信号量,如果T1=0,则使用GDTR,如果T1=1,则使用LDTR。选择子将被装入段寄存器中。系统中的段寄存器共有六个:CS、SS、DS、ES、FS和GS。当选择子被装入段寄存器时,微处理器会自动将其对应的描述符装入描述符寄存器。
系统任务切换时,LDT切换,而GDT不切换(因为真个系统只有一个GDT),这时新任务的LDT描述符的选择子就被装入到LDTR中。

任务切换过程中,各个相关寄存器的变化?
当任务切换时,如果使用的是LDT,首先变化的是LDTR。段选择子被装入LDTR,同时LDT描述符自动被装入描述符寄存器。系统利用LDTR中的段选择子来定位LDT描述符在GDT中的位置。这里我不明白的是LDTR中的LDT描述符和GDT中的描述符是什么关系?为什么要这样做呢?自动装入到LDTR中的描述符到底是什么?从哪来?请高手指点!

为什么要有一个GDTR,并且GDTR的结构和LDTR不一样呢?
这主要是因为系统只有一个GDT,而GDT的描述符有不能存放在GDT中(LDT的描述符都存放在GDT中),所以就需要一个GDTR来指示GDT在内存中的位置。因为GDTR是直接指示内存地址,而LDTR主要指示LDT描述符在GDT中的位置和属性,所以GDTR和LDTR的结构也不同。

为什么在保护模式下的物理寻址空间是4G而虚拟地址是64T?
物理地址是4G是因为地址总线是32位的。
虚拟地址的情况比较复杂。具体分析如下:
保护模式下,一个任务的整个虚拟地址空间可以分为相等的两半,一半空间的描述符在全局描述符表GDT中,一半空的描述符在局部描述符表LDT中。并且由上可知,段选择子的位数是13位,即最多可以有8192个描述符,而每个LDT也最多可以包含8192个描述符。每个描述符描述的段的最大寻址范围都是32位的,即4G。所以所有任务的虚拟地址空间为:8192*4G*2=64T。

段描述符的数据结构:


B31-B24&B23-B16&B15-B0是指段的基地址,L19-L16&L15-L0是指段限地址。
G指示段的长度单位,G=0表示字节,=1表示4k;D表示存取方式,=0表示16位,=1表示32位。
A表示是否能为系统软件使用;没有使用的一位强制为0;P位表示该段是否在内存中,=0时表示不在;
DPL有两位,是访问本段需要的权限;S位表示描述符的类型,=1表示系统,=0表示代码段或者数据段;type表示描述符描述的段的类型,与S位结合起了使用。
本图最下面一行位字节的位数标定。

最后插入一张intel 关于相关概念的一张图:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GDT(全局描述符表)和IDT(中断描述符表)是操作系统中用于管理内存和中断的重要数据结构GDT一个表,用于存储所有内存段的描述符,描述符包含了段的基地址、段的长度、访问权限等信息。在x86体系结构的保护模式下,所有的内存访问都必须通过段寄存器来实现。当CPU执行一条访存指令时,它会把段寄存器的值当做段描述符的索引,在GDT中找到对应的描述符,从而确定要访问的内存地址的范围和访问权限。因此,初始化GDT是操作系统启动时的必要步骤。 IDT是另一个表,用于存储所有中断和异常处理程序的描述符。当CPU收到一个中断请求或异常时,它会从IDT中找到对应的描述符,从而确定要执行的中断或异常处理程序的地址。因此,初始化IDT也是操作系统启动时的必要步骤。 GDT和IDT的初始化大致可以分为以下几个步骤: 1.创建并填充GDT和IDT的表项,每个表项对应一个内存段或中断处理程序。 2.创建并填充GDTRGDT寄存器)和IDTR(IDT寄存器),这两个寄存器分别存储GDT和IDT表的地址和大小信息。 3.使用LGDT和LIDT指令将GDTR和IDTR的值加载到CPU中,从而告诉CPU如何寻找GDT和IDT表。 需要注意的是,为了保证安全性,GDT和IDT表通常被放置在内核态的固定位置,并且只有内核态的代码才能够修改它们。此外,为了简化实现,现代操作系统通常会使用一些预定义的GDT和IDT表项,而不是每次都手动填充表项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值