这三个表是在内存中由操作系统或系统程序员所建,并不是固化在哪里,所以从理论上是可以被读写的。这三个表都是描述符表。描述符表是由若干个描述符组成,每个描述符占用8个字节的内存空间,每个描述符表内最多可以有8129个描述符。描述符是描述一个段的大小,地址及各种状态的。

一,保护模式存储器管理功能

386 CPU共有32位地址线,其物理存储器最大可达232字节,实模式下,远指针由segment

:offset组成,对应的物理存储器地址为segment*16+offset,即segment左移四位再加上off

set,因segment和offset限制在16位之内,实际的寻址范围最大可达220(即1M字节)。所以要

对VGA图形模式下的显示缓冲区进行读写只需用a000:offset这样的远指针即可。

保护模式下,远指针由selector:offset组成,selector称作选择器,不同的选择器指示

了不同的内存段,该内存段的实际物理地址,长度和权限,还需从一个特定的内存区域即描述

符表中查到。386 CPU能够设置一个全局描述符表和若干个局部描述符表,每个任务能够拥

有一个局部描述符表,但同一时刻只有活动任务的局部描述符表有效。386的段址寄存器已

经过扩展,由一个16位的寄存器和一个附加的64位寄存器组成,附加的64位寄存器称为描述

符寄存器,程序员无法直接访问。当执行MOV AX,selector/MOV DS,AX这样的指令时,CPU将

16位的selector的值存入DS寄存器的前一部分,然后依据selector的值在全局描述符表或局

部描述符表中找到对应描述符,装入DS附加的描述符寄存器。描述符表中包含若干个描述符

,每个描述符由8个字节组成,其中包含该内存段的物理起始地址、长度、访问权限等内容。

selector的位0~1为申请访问权限,位2为GDT(全局描述符表)和LDT(局部描述符表)的区分

位,位2为0时,描述符位于GDT中。位2为1时,描述符位于LDT中,位3~15共13位为描述符的索

引,将该13位乘以8,即为描述符离描述符表起始位置的偏移,所以描述符表中描述符的个数

最多为8129个。以后执行MOV DS:[offset],AX等访问内存的指令时,根据DS的描述符寄存器

中的长度部分即可判断所访问的内存是否超出该段长度,申请权限是否符合条件等等,如果

超出长度或权限级别不够则会产生保护错误(UAE),实际的物理存储器地址为DS描述寄存器

中的物理起始地址加上偏移offset,可见增加描述符寄存器是为了减少访问描述符表的次数

,以提高CPU的速度。系统初始化时会设置全局描述符表(GDT)和局部描述符表(LDT),全局描

述符表的位置存在全局描述符表寄存器(GDTR)中,该寄存器长度为48位,高32位是描述符表

的起始物理地址,低16位是描述符表长度。局部描述符表的位置存在局部描述符表寄存器(

LDTR)中,该寄存器和段址寄存器类似,也包括一个16位寄存器和一个64位的描述符寄存器,

各个任务的LDT也以描述符的形式登记在GDT中,任务切换时,将该描述符调入LDTR中,同样的

是选择器装入16位寄存器,选择器所指描述符装入LDTR的描述符寄存器中,以后可在LDT中登

记该任务的局部内存段。

可见,保护模式下,访问内存需要将该内存段登记在GDT或LDT中,然后使用selector:of

fset这样的指针就可以访问了。

描述符表有三种,分别为全局描述符表GDT、局部描述符表LDT和中断描述符表IDT。

1. 全局描述符表GDT:

全局描述符表在系统中只能有一个,且可以被每一个任务所共享.任何描述符都可以放在GDT中,但中断门和陷阱门放在GDT中是不会起作用的.能被多个任务共享的内存区就是通过GDT完成的,

2. 局部描述符表LDT:

局部描述符表在系统中可以有多个,通常情况下是与任务的数量保持对等,但任务可以没有局部描述符表.任务间不相干的部分也是通过LDT实现的.这里涉及到地址映射的问题.和GDT一样,中断门和陷阱门放在LDT中是不会起作用的.

3. 中断描述符表IDT:

和GDT一样,中断描述符表在系统最多只能有一个,中断描述符表内可以存放256个描述符,分别对应256个中断.因为每个描述符占用8个字节,所以IDT的长度可达2K.中断描述符表中可以有任务门、中断门、陷阱门三个门描述符,其它的描述符在中断描述符表中无意义。

4. 段选择子

在保护模式下,段寄存器的内容已不是段值,而称其为选择子.该选择子指示描述符在上面这三个表中的位置,所以说选择子即是索引值。

当我们把段选择子装入寄存器时不仅使该寄存器值,同时CPU将该选择子所对应的GDT或LDT中的描述符装入了不可见部分。这样只要我们不进行代码切换(不重新装入新的选择子)CPU就会不会对不可见部分存储的描述符进行更新,可以直接进行访问,加快了访问速度。一旦寄存器被重新赋值,不可见部分也将被重新赋值。

关于选择子的值是否连续

关于选择子的值,我认为不一定要连续。但是每个描述符的起始地址相对于第一个描述符(即空描述符)的首地址的偏移必须是8的倍数,即二进制最后三位为0。这样通过全局描述符表寄存器GDTR找到全局描述符表的首地址后,使用段选择子的高13位索引到正确的描述符表项(段选择子的高13位左移3位加上GDTR的值即为段选择子指定的段描述符的逻辑首地址)

也就是说在两个段选择符之间可以填充能被8整除个字节值。当然,如果有选择子指向了这些填充的字节,一般会出错,除非你有意填充一些恰当的数值,呵呵。

关于为什么LDT要放在GDT中

LDT中的描述符和GDT中的描述符除了选择子的bit3一个为0一个为1用于区分该描述符是在GDT中还是在LDT中外,描述符本身的结构完全一样。开始我考虑既然是这样,为什么要将LDT放在GDT中而不是像GDT那样找一个GDTR寄存器呢?

后来终于明白了原因--很简单,GDT表只有一个,是固定的;而LDT表每个任务就可以有一个,因此有多个,并且由于任务的个数在不断变化其数量也在不断变化。如果只有一个LDTR寄存器显然不能满足多个LDT的要求。因此INTEL的做法是把它放在放在GDT中

详细参照

gdt描述_全局描述符表(GDT)局部描述符表(LDT)相关推荐

  1. gdt描述_全局描述符表GDT

    写在前面 添油加醋系列第二弹--剖析GDT 话说C语言的话除了刷刷OJ外,就是用来实现操作系统这个大头了.C语言比C++少了很多很多臃肿的语法特性,写起来非常优美(至少写操作系统是这样的).虽说C++ ...

  2. gdt描述_全局描述符表(GDT)详解

    在Protected Mode下,一个重要的必不可少的数据结构就是GDT(Global Descriptor Table). 为什么要有GDT Real Mode编程模型 我们首先考虑一下在Real ...

  3. gdt描述_获取全局描述符表GDT的内容 | 学步园

    /stdfx.h文件 //Ring0环的程序 //测试环境VS2005 #ifndef _WIN32_WINNT// Allow use of features specific to Windows ...

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

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

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

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

  6. gdt描述_GDT详解(全局描述符表)

    GDT详解(全局描述符表) 作者:admin 日期:2009-10-21 字体大小: 小 中 大 在Protected Mode下,一个重要的必不可少的数据结构就是GDT(Global Descrip ...

  7. CPU实模式和保护模式、全局描述符表GDT、Linux内核中GDT和IDT的结构定义

    一 计算机实模式和保护模式 实模式 在实模式下,内存被限制为仅有1M字节(220 字节).有效的地址从00000到FFFFF (十六进制). 这些地址需要用20位的数来表示.一个20位的数不适合任何一 ...

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

    GDT的由来: 在Protected Mode下,一个重要的必不可少的数据结构就是GDT(Global Descriptor Table). 为什么要有GDT?我们首先考虑一下在Real Mode下的 ...

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

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

最新文章

  1. python获取数据库的存储过程_python远程调用sqlserver存储过程记录
  2. SQLServer2000数据库特有的1433端口号
  3. 使用Myelipse逆向生成类图的步骤
  4. SQL Server 中 JSON_MODIFY 的使用
  5. html制作搜狗主页,自学htmlcss之仿搜狗主页(示例代码)
  6. Spring – IoC 容器
  7. 如何删除“无法读源文件或磁盘”的空头文件
  8. 第三次握手为什么没有序列号_“三次握手,四次挥手”你真的懂吗?
  9. 海量文件或数据 导致高并发,高流量处理方案
  10. 【无标题】2022电工(技师)操作证考试题及在线模拟考试
  11. c语言小球消砖块增加一行砖块,基于Unity的小球撞击砖块小游戏
  12. 三星手机微信下载的文件路径
  13. Qt入门教程【硬件编程】串口基础知识
  14. Google Guava与字符串操作相关的类
  15. 重装系统后mysql不用重新安装
  16. 未来的计算机也无法突破冯诺依曼结构,冯诺依曼计算机的基本原理
  17. blender_mmd_tools_extra 插件介绍
  18. 三、基本CRUD操作
  19. 内存与IO,磁盘IO,网络IO
  20. js对数组的删除操作

热门文章

  1. 【游戏客户端】实现卡牌翻转效果
  2. Linux中批量压缩文件夹
  3. 【通信】一张图浅谈通信网
  4. 基于单片机的智能湖面垃圾打捞装置
  5. java中between的取值_Java中的between()方法的持续时间
  6. 分布式锁解决并发三种方案
  7. vb小钢琴简谱播放程序代码
  8. 民生银行数据中台体系的构建与实践
  9. 科创板落地近尾声 注册制稳步试点减缓市场压力
  10. selenium ide assert