本系列文章由jadeshu编写,转载请注明出处。http://blog.csdn.net/jadeshu/article/details/22446971

作者:jadeshu   邮箱: jadeshu@qq.com    欢迎邮件交流

分段机制

•分段提供了隔绝各个代码、数据和堆栈区域的机制,因此多个程序(或任务)可以运行在同一个处理器上而不会互相干扰。
•在内存分段系统中,一个程序的逻辑地址通过分段机制自动地映射到中间层的4GB(232B)线性地址空间中。程序每次对内存的引用都是对内存段中内存的引用。当程序引用一个内存地址时,通过把相应的段基址加到程序员看得见的逻辑地址上就形成了一个对应的线性地址。此时若没有启用分页机制,则该线性地址就被送到CPU的外部地址总线上,用于直接寻址对应的物理内存

段描述符
•段描述符,是由操作系统定义的、位于存储器内的一种数据结构,段描述符内保存着供处理机使用的有关段的属性、大小规模、段在存储器中的位置及控制和状态信息,段描述符在存储器中的一个段和一个任务之间形成了一个链。它是一种特殊的段,不管是全局地址空间还是局部地址空间中的一个段,如果没有描述符,则对该段任务来说便无效,且没有访问它的机制。一般说来,各段描述符是由各种编译程序、各种连接程序、各种装入程序或者操作系统产生的,而不是由各种应用程序生成的
•描述符分为段描述符和门描述符两大类。段描述符又分成两类:一般的段描述符(也称存储段描述符,包括代码段描述符和数据段描述符)和特殊的段描述符(又称系统段描述符,包括局部描述符表LDT 描述符和任务状态段TSS描述符等)。门描述符包括调用门描述符、任务门描述符、中断门描述符和陷阱门描述符4 种,当特权级之间和任务之间进行转移控制时,使用这些门描述符。各种类型段使用的段描述符只能是其中一种。
•段描述符由8个字节即64位表示

段描述符格式

段描述符位解释
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粒度为字节,14K字节.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

段描述符表
•段描述符形成段描述符表(可以理解为数组)
•段描述符表简称描述符表,用来存储保护方式下段描述符的一个阵列。80386/80486 CPU 共有3 种描述符表:全局描述符表GDT、局部描述符表LDT 和中断描述符表IDT。描述符表由描述符顺序排列组成,占一定的内存,由系统地址寄存器(GDTR 、LDTR、IDTR) 指示其在物理存储器中的位置和大小。
•全局描述符表GDT 是供所有任务使用的描述符表,在物理存储器地址空间中定义全局描述符表GDT。通常操作系统使用的有代码段描述符、数据段描述符、调用门描述符、各个任务的LDT 描述符、任务状态段TSS 描述符、任务门描述符等。
•局部描述符表LDT 是每一项任务运行时都要使用的描述符表。在多任务操作系统管理下,每个任务通常包含两部分:与其他任务共用的部分及本任务独有的部分。与其他任务共用部分的段描述符存储在全局描述符表GDT内;本任务独有部分的段描述符存储在本任务的局部描述符表LDT 内。这样,每个任务都有一个局部描述符表LDT,而每个LDT 表又是一个段,它也就必须有一个对应的LDT 描述符。该LDT 描述符存储在全局描述符表中。局部描述符表LDT 中所存储的属于本任务的段描述符通常有代码段描述符、数据段描述符、调用门描述符及任务门描述符等。

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

段描述符: 存储段描述符

选择器:存储段描述符的索引


内存管理寄存器
处理器提供了4个内存管理寄存器(GDTR、LDTR、IDTR和TR),用于指定内存分段管理所用系统表的基地址



描述符表寄存器
微处理机用全局描述符表寄存器GDTR 、局部描述符表寄存器LDTR 和中断描述符表寄存器IDTR,来查找全局描述符表GDT、局部描述符表LDT 和中断描述符表IDT, 如图 所示。



全局描述符表
•在全局描述符表寄存器GDTR 内,保存着全局描述符表在物理地址空间内的32 位的基地址,同时全局描述符表寄存器GDTR 中,还保存表明这个表的规模大小为16 位的界限值,16 位段界限表明GDT 表最长为216KB(64KB) 。
•【例】 (GDTR)=0010 0000 0FFFH ,求GDT 在物理存储器中的起始地址,结束地址,表的大小,表中可以存放多少个描述符?
•解:
GDT 的起始地址为0010 0000H
结束地址为:0010 0000H+0FFFH=0010 0FFFH
表的大小为:0FFFH+1=4096 字节
表中可以存放:4096/8=512 个描述符

局部描述符表
局部描述符表寄存器LDTR 包含一个16 位的选择器(63 位~48 位)和不可见的高速缓存器(47 位~0 位)。不可见的高速缓存器内保存着局部描述符表LDT 的基地址、它的界限以及访问控制权。对正在运行的任务而言,每一项任务运行时都要使用局部描述符表LDT, 它们存储在存储器的一个独立的段里。但每个LDT 处于存储器中的地址如图8.9 所示,用局部描述符表指令LLDT 对局部描述符表寄存器LDTR 内的选择符进行读操作,用保存在局部描述符寄存器内的16 位的选择符识别GDT,从GDT 中检索出相应的LDT 描述符,处理器便将局部描述符自动置入LDTR 的高速缓存器中,将该描述符装入高速缓冲寄存器就为当前任务创建了一个LDT。这样80386/486 微处理器便可以根据LDTR 高速缓存器的值来确定局部描述符表的起始地址和段界限,而不必再访问存储器从GDT 中查出LDT 描述符,直接从LDTR 高速缓存器来确定局部描述符表的起始地址和段界限,节省了程序运行时间。

当T1为0时来计算线性地址


地址之间转换参考图



地址之间转换参考图2


windows游戏编程X86 (内存)寄存器相关的基本概念的更多相关文章

  1. windows游戏编程X86 32位保护模式下的内存管理概述(二)

    本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/22448323 作者:jadeshu   邮箱: jades ...

  2. windows游戏编程X86 32位保护模式下的内存管理概述(一)

    本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/22445945 作者:jadeshu   邮箱: jades ...

  3. windows游戏编程X86实模式和保护模式

    本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/22309359 作者:jadeshu   邮箱: jades ...

  4. Windows游戏编程之从零开始d

    Windows游戏编程之从零开始d I'm back~~恩,几个月不见,大家还好吗? 这段时间真的好多童鞋在博客里留言说或者发邮件说浅墨你回来继续更新博客吧. woxiangnifrr童鞋说每天都在来 ...

  5. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记5——Direct3D中的顶点缓存和索引缓存

    第12章 Direct3D绘制基础 1. 顶点缓存 计算机所描绘的3D图形是通过多边形网格来构成的,网网格勾勒出轮廓,然后在网格轮廓的表面上贴上相应的图片,这样就构成了一个3D模型.三角形网格是构建物 ...

  6. windows游戏编程 创建WIN32一个HelloWOrld程序

    本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/22449085 作者:jadeshu   邮箱: jades ...

  7. windows游戏编程 绘图基础

    本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/22451353 作者:jadeshu   邮箱: jades ...

  8. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记3——输入消息处理,物理建模与粒子系统初步

    第7章 Windows游戏输入消息处理 1. 键盘消息处理 之前提到的窗口过程函数有两参数与消息输出有关——wParam和llParam LRESULT CALLBACK WindowProc( _I ...

  9. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记2——透明贴图,动画技术

    第5章 透明贴图 像这样直接贴图会产生这种情况,所以我们需要透明贴图. 透明遮罩法:主要利用BitBlt函数中Raser(光栅)值的运算,需要准备素材图和遮罩图: 这个方法的原理解释见书131页. 示 ...

随机推荐

  1. C#对象转换工具类

    using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy ...

  2. android 项目集成 微信支付

    0.环境 下载 libammsdk.jar 1.需要的常量值 public class Constant { /** 微信中用到的常量值 */ public static final class WX ...

  3. jQuery_jQuery的两把利器

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. restTemplate源码解析(一)构造restTemplate的Bean实例

    所有文章 https://www.cnblogs.com/lay2017/p/11740855.html 正文 构造一个restTemplate的Bean实例很容易,只需这样配置 @Bean publ ...

  5. [Vuex系列] - 细说state的几种用法

    state 存放的是一个对象,存放了全部的应用层级的状态,主要是存放我们日常使用的组件之间传递的变量. 我们今天重点讲解下state的几种用法,至于如何从头开始创建Vuex项目,请看我写的第一个文章. ...

  6. JFrame windowbuiler的使用基础

    一.通过windowbuilder创建java项目: New --Other--windowbuilder--SWT Designer --SWT/JFace Java Project 二.创建文件 ...

  7. FPGA学习笔记——点亮LED

    软件平台:win7(64bit) + Quartus II 9.1 (64-Bit) 硬件平台:东理电子Easy-FPGA Cyclone II EP2C5T114C8N 这个开发板买了很长时间了,买 ...

  8. 初级文件IO——IO过程、open、close、write、read、lseek、dup、dup2、errno、perror

    先要回答的问题 文件IO指的是什么? 本文主要讲述如何调用Linux OS所提供的相关的OS API,实现文件的读写. 如何理解文件IO? IO就是input output的意思,文件io就是文件输入 ...

  9. 关于Linux、python的PDF书籍整理(附带亲测的 IT 电子书网站)

    [18.1.3][在博客园发的文章不是很多呢,接下来的博客会转移到独立的个人博客网站上去了,具体的学习笔记和内容都会在独立网站上发布,后期还会有博主的个人资源库和教程还有独立网盘存储(可以关注一波哈) ...

  10. XPath 爬虫解析库

    XPath     XPath,全称 XML Path Language,即 XML 路径语言,它是一门在 XML 文档中查找信息的语言.最初是用来搜寻 XML 文档的,但同样适用于 HTML 文档的 ...