本系列文章由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. PHP迭代生成器---yield

    1.迭代生成器 生成器的核心是一个yield关键字,一个生成器函数看起来像一个普通的函数,不同的是:普通函数返回一个值,而一个生成器可以yield生成许多它所需要的值.生成器函数被调用时,返回的是一个 ...

  2. Docker相关环境全套安装文档兼小技能

    Docker相关环境全套安装文档兼小技能 以下环境皆为ubuntu16.04,主要安装docker,docker-compose,docker仓库等. Docker安装 参考官方 A: 有源安装 Ub ...

  3. 微软发布云端基因服务:推动AI驱动的精准医疗

    微软发布云端基因服务:推动AI驱动的精准医疗 2018年03月07日 00:00:00 微软研究院AI头条 阅读数:117    版权声明:本文为博主原创文章,未经博主允许不得转载. https:// ...

  4. Visual Stdio C++ 编译常见问题

    1. new 数组出现崩溃 new 数组时数组下标出现负值,但未做出错处理: new数组,数组字节数大于4MB的时候有可能出现crash! 解决办法: 加入 try  catch 后,这样的错误几乎没 ...

  5. c# 执行调用Oracle Procedure传参及回传值

    ////定義參數               //IDataParameter[] parameters =               //             {               ...

  6. python 制作影视动画、电影特效工具

    一直觉得电影特效,动画制作这些都很什么,在google上搜索了下python开发电影特效的内容,发现了几个不错的软件,都支持python脚本开发. Houdini  Houdini (电影特效魔术师) ...

  7. golang使用sftp连接服务器远程上传、下载文件

    安装github.com/pkg/sftp 我们之前介绍了,golang如何通过ssh连接服务器执行命令,下面我们来如何上传文件,上传文件同样需要之前的ssh,但是除此之外还需要一个模块,直接使用go ...

  8. Tcp/IP协议详讲

    TCP/IP协议分层详解 目录 TCP/IP 和 ISO/OSI TCP/IP分层模型 数据的封装与分用 其他相关概念 TCP/IP 通信传输流 负责传输的 IP 协议 正文 回到顶部 TCP/IP ...

  9. HRNet网络结构

    最近正在阅读CVPR2019的论文Deep High-Resolution Representation Learning for Human Pose Estimation. 无奈看论文中的Netw ...

  10. SP703 SERVICE - Mobile Service[DP]

    题意翻译 Description 一个公司有三个移动服务员.如果某个地方有一个请求,某个员工必须赶到那个地方去(那个地方没有其他员工),某一时刻只有一个员工能移动.只有被请求后,他才能移动,不允许在同 ...