三种模式:实模式、保护模式和平展模式。

  实模式存储器(DOS存储器)位于00000H~FFFFFH,共1M空间(任何型号微处理器都支持)。

  保护模式存储器(Windows存储器)可位于整个保护存储系统的任何位置(80286以上的微处理器)。

  平展模式(Windows Vista以上),64位扩展,可寻址1TB的内存(Pentium 4以上未处理器)。

  64位通用寄存器:RAX(累加器)、RBX(基址)、RCX(计数)、RDX(数据)、RBP(基指针)、RDI(目的变址)、RSI(源变址)。

  64位专用寄存器:RIP(指令指针)、RSP(堆栈指针)、RFLAGS(状态)。

  64位段寄存器:CS(代码段)、DS(数据段)、ES(附加段)、SS(堆栈段)、FS(标志,指向当前活动线程的TEB结构->线程结构)、GS(全局)。

  原来放段地址的段寄存器存选择子(selector),用于选择描述表内的一个描述符。描述符(descriptor)描述存储器段的位置、长度和访问权限。一个描述符说明了一个存储段。

  段寄存器可访问两个描述符表:一个是全局描述符表,一个是局部描述符表。全局描述符(global descriptor)适用于所有程序的段定义,而局部描述符(local descriptor)通常用于唯一的应用程序。全局描述符又称系统描述符(system descriptor),局部描述符又称应用描述符(application descriptor)。每个描述符表共2^13=8192个描述符,故两个描述符表共8192*2=16384个描述符。故,一个应用程序可访问内存大小为4G*16384=64TB。

  每个描述符长8B,故全局和局部描述符表每个最长为64KB。

  

图一 Core2微处理器描述符

  1. 基地址(base address)部分表示存储器段的起始位置。

  2. 段界限(segment limit)包含该段中最大的偏移地址。80286访问长度为1B~64KB,而80386之上则为1B~1MB或者4KB~4GB。受控于标志位G粒度位(granularity bit)。

  3. L位是large的意思,决定是否开启32或64位保护模式。64没有段或者界限,只包含一个访问权限字节和若干控制位,段的基地址为00 0000 0000H,即所有代码段都从地址0开始,且没有边界检查。

  4. AV(active)位指示段是否有效。

  5. D位标志是否打开32位指令,1为32位指令(只能用于保护模式),0为16位指令。

  6. 访问权限字节(access rights byte)控制着对保护模式中存储器段的访问,它全面控制着段。例如,如果是数据段,则指定其增长方向。注意,在64位模式中,只有代码段,而没有其它段描述符类型,一个64位平展模式的程序在代码段包含数据和堆栈。

  

图二 访问权限字节

  描述符是通过段寄存器从描述符表中选择的。在段寄存器中,包含13位选择子字段、表选择子位(TI)和请求优先级字段。如下图:

图三 段寄存器内容

  Windows将优先级00赋予内核和驱动程序(同Linux),而分配给应用程序为优先级11。Windows不用优先级01和10。

  平展模式内存系统是不存在分段的系统。首地址为00 0000 0000H,尾地址为FF FFFF FFFFH(40位)。它不使用段寄存器进行寻址。CS只定义代码段访问权限的描述符表中的选择描述符。段寄存器仍负责选择软件的优先级。但不使用描述符中的基址和界限来选择段的内存地址,不会像32位模式下那样修改实际内存地址。64位模式下的偏移地址即是实际的物理地址,且实模式系统是不可用的,但仍允许保护机制和页面调度(CS)。另外,它的打开有L标志位控制。

  另外,由于地址只有40位,故任何超过40位的地址都会被截断。Pentium工作在完全的64位模式下(目前大多数应用程序都是工作在IA32兼容模式下的)。另外,也不是所有的指令都是支持64位的(例如指令的偏移地址的位数就可能会限制住)。

Intel微处理器学习笔记(二) 三种模式的更多相关文章

  1. Intel微处理器学习笔记(三) 不可见寄存器

    参考资料: 1.  http://blog.chinaunix.net/uid-20797642-id-2495244.html 2.  http://www.techbulo.com/708.htm ...

  2. Java设计模式学习笔记(二) 简单工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...

  3. JavaScript新手学习笔记3——三种排序方式(冒泡排序、插入排序、快速排序)

    每种编程语言学到数组的时候,都会讲到排序算法,当时学C语言的时候,卡在排序算法.今天来总结一下javascript中如何实现三种排序算法. 1.冒泡排序(默认升序排列哦) 原理: 冒泡排序的原理,顾名 ...

  4. Intel微处理器学习笔记(一) 实模式内存结构

    图一 奔腾概念示意图 存储系统一般划分为三个主要部分:TPA(transient program area),System Area和XMS(extended memory system). 图二 内 ...

  5. Intel微处理器学习笔记(五) 中断

    ▼ 中断是一个由硬件激发的过程,它中断当前正在执行的任何程序. ▼ 在Intel系列微处理器中,包括INTR和NMI(Non Maskable Interrupt)两个申请中断的引脚和一个响应INTR ...

  6. Intel微处理器学习笔记(四) 内存分页

    内存分页机制(memory paging mechanism)是从386开始的.线性地址通过分页机制透明转换为物理地址. 从这里知道:1. 如果不分页,则线性地址等于物理地址:2. 如果分页,则线性地 ...

  7. MySQL学习笔记:三种组内排序方法

    由于MySQ没有提供像Oracle的dense_rank()或者row_number() over(partition by)等函数,来实现组内排序,想实现这个功能,还是得自己想想办法,最终通过创建行 ...

  8. 概率图模型(PGM)学习笔记(三)模式判断与概率图流

    我们依旧使用"学生网络"作为样例,如图1. 图1 首先给出因果判断(Causal Reasoning)的直觉解释. 能够算出来 即学生获得好的推荐信的概率大约是0.5. 但假设我们 ...

  9. PHP语言学习之php-fpm 三种运行模式

    本文主要向大家介绍了PHP语言学习之php-fpm 三种运行模式,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. php-fpm配置 配置文件:php-fpm.conf 开启慢日志功能的 ...

随机推荐

  1. html08

    1.JQuery 是一个js框架一堆的 js文件 -形成 > 包 - 形成> 工具 - 形成> ->库 -> 框架 是一个轻量级的库 封装了js原生里js css dom ...

  2. 服务器修改用户密码注意iis部署的网站问题

    当服务器修改用户密码时,需要修改iis上部署的跟此用户权限有关的所有网站,选择网站——右击——应用程序管理——高级设置——物理路径凭证——特定用户——修改用户名和密码.

  3. Linux root用户下不能打开Google-chrome的解决办法

    在root下打开chrome会出现no sandbox的错误 解决方案: 1.找到google-chrome文件 在目录/opt/google/chrome 下 2.使用gedit打开该文件 最后一行 ...

  4. [转]mac上安装android sdk

    一.先下载android sdk for mac 给二个靠谱的网址: a). http://down.tech.sina.com.cn/page/45703.html b). http://mac.s ...

  5. java编译 Error: Could not find or load main class java执行包main方法

    在java源文件开头有包声明语句,编译的时候需要指定生成的class文件路径. 解决方法: javac -d your_path your_class.java 例如:javac -d . First ...

  6. Linux 远程连接sftp与ftp

    linux sftp远程连接命令 sftp -oPort=60001 root@192.168.0.254 使用-o选项来指定端口号. -oPort=远程端口号 sftp> get /var/w ...

  7. qmake使用方法(自动生成Makefile文件)

    qmake的使用简介 下面是qmake的简单介绍和使用要领,更为详细的信息请参阅手册 qmake的介绍 手写Makefile是比较困难并且容易出错的,尤其是需要给不同的平台和编译器组合写几个Makef ...

  8. 如何在Apache中运行Python脚本

    第一步:进入C:\Apache24\cgi-bin: 第二步:在cgi-bin目录下新建一个hello.py文件: 第三步: #!python #coding:utf-8 print("co ...

  9. String和StringBuffer和StringBuilder

    String类 Java语言中用String类代表不可变的字符串,它是由任意多个字符组成的序列.程序中需要存储大量的信息时,一般都用String对象. 1.字符串初始化 JavaSE API为字符串对 ...

  10. P3294 [SCOI2016]背单词

    P3294 [SCOI2016]背单词 Trie+贪心 倒插进树+取出重建+子树处理+贪心遍历 倒插进树:把后缀转化为前缀,所以把字符串倒着插进Trie中 取出重建:重新建立一棵以单词为节点的树,如果 ...