本系列文章由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粒度为字节,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

段描述符表
•段描述符形成段描述符表(可以理解为数组)
•
•段描述符表简称描述符表,用来存储保护方式下段描述符的一个阵列。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. Linux Mysql 备份与还原

    1. 备份 cd /var/lib/mysql //进入到MySQL库目录 mysqldump -u root -p 数据库>/root/backup/数据库.sql 然后输入密码 2. 还原 ...

  2. Google Drive ubuntu

    Google尚未发布用于从Ubuntu访问其drive的官方Linux客户端.然开源社区却业已开发完毕非官方之软件包‘grive-tools’. grive乃是Google Drive(在线存储服务) ...

  3. Python考试_第三次

    - python 全栈11期月考题 一 基础知识:(70分) 1.文件操作有哪些模式?请简述各模式的作用(2分) 2.详细说明tuple.list.dict的用法,以及它们的特点(3分) 3.解释生成 ...

  4. 提高前端开发效率的N种方法

    一.使用固定的html模板和css公共样式 事先把模板建好,每次需要用的时候直接拿来就行,不再需要为浏览器兼容问题考虑太多时间 这里我整理了一套,希望对大家有帮助:http://www.cnblogs ...

  5. Ubuntu安装rpm

    # sudo apt-get install alien # sudo alien xxx.rpm # sudo dpkg -i xxx.deb

  6. flask小结

    http通讯过程 https://www.cnblogs.com/andy9468/p/10871079.html 1.flask开发环境 https://www.cnblogs.com/andy94 ...

  7. 【leetcode】575. Distribute Candies

    原题 Given an integer array with even length, where different numbers in this array represent differen ...

  8. MySQL全同步复制基于GR集群架构实现(Centos7)

    目录 一. 理论概述 概述 二. 部署 向组加入新节点 测试 三.总结 一. 理论概述 概述 本案例操作的是针对于MySQL的复制类型中的全同步复制,对几种复制类型简单总结下: 异步复制:MySQL默 ...

  9. MySQl 进阶一 基本查询及练习

    知识点及练习 USE myemployees; #.查询表中的单个字段 SELECT last_name FROM employees; #.查询表中多个字段 #.查询全部 SELECT * FROM ...

  10. 【Java基础-实验7】Banking_7 -添加银行透支扣款系统的 thorw异常机制

    实验基本要求: 实验题目 7:(在6基础上修改) 将建立一个 OverdraftException 异常,它由 Account 类的withdraw()方法 抛出. 实验目的: 自定义异常 实验说明: ...