Intel微处理器学习笔记(二) 三种模式
三种模式:实模式、保护模式和平展模式。
实模式存储器(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微处理器学习笔记(二) 三种模式的更多相关文章
- Intel微处理器学习笔记(三) 不可见寄存器
参考资料: 1. http://blog.chinaunix.net/uid-20797642-id-2495244.html 2. http://www.techbulo.com/708.htm ...
- Java设计模式学习笔记(二) 简单工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...
- JavaScript新手学习笔记3——三种排序方式(冒泡排序、插入排序、快速排序)
每种编程语言学到数组的时候,都会讲到排序算法,当时学C语言的时候,卡在排序算法.今天来总结一下javascript中如何实现三种排序算法. 1.冒泡排序(默认升序排列哦) 原理: 冒泡排序的原理,顾名 ...
- Intel微处理器学习笔记(一) 实模式内存结构
图一 奔腾概念示意图 存储系统一般划分为三个主要部分:TPA(transient program area),System Area和XMS(extended memory system). 图二 内 ...
- Intel微处理器学习笔记(五) 中断
▼ 中断是一个由硬件激发的过程,它中断当前正在执行的任何程序. ▼ 在Intel系列微处理器中,包括INTR和NMI(Non Maskable Interrupt)两个申请中断的引脚和一个响应INTR ...
- Intel微处理器学习笔记(四) 内存分页
内存分页机制(memory paging mechanism)是从386开始的.线性地址通过分页机制透明转换为物理地址. 从这里知道:1. 如果不分页,则线性地址等于物理地址:2. 如果分页,则线性地 ...
- MySQL学习笔记:三种组内排序方法
由于MySQ没有提供像Oracle的dense_rank()或者row_number() over(partition by)等函数,来实现组内排序,想实现这个功能,还是得自己想想办法,最终通过创建行 ...
- 概率图模型(PGM)学习笔记(三)模式判断与概率图流
我们依旧使用"学生网络"作为样例,如图1. 图1 首先给出因果判断(Causal Reasoning)的直觉解释. 能够算出来 即学生获得好的推荐信的概率大约是0.5. 但假设我们 ...
- PHP语言学习之php-fpm 三种运行模式
本文主要向大家介绍了PHP语言学习之php-fpm 三种运行模式,通过具体的内容向大家展示,希望对大家学习php语言有所帮助. php-fpm配置 配置文件:php-fpm.conf 开启慢日志功能的 ...
随机推荐
- (转)spring boot整合redis
一篇写的更清晰的文章,包括redis序列化:http://makaidong.com/ncjava/330749_5285125.html 1.项目目录结构 2.引入所需jar包 <!-- Sp ...
- linux 使用文件作为交换分区
sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile ...
- Sublime text 3搭建Python-Anaconda开发环境
网络上的教程各种各样,大同小异.自己安装时还是出了些问题,因此总结一篇博文. Sublime Text 是一款轻量级跨平台的文本编辑器,可通过包(Package)扩充自身功能. 有很多搭建python ...
- 20165324 《网络对抗技术》week1 Kali的安装与配置
20165324 <网络对抗技术>week1 Kali的安装与配置 安装过程 VMware安装过程省略 kali 光盘映像文件的下载 新建虚拟机,并导入. 安装Tools 在菜单中,选择虚 ...
- kendo datetimepicker
@(Html.Kendo().DatePicker() .Name("yearCalendar") .Value(DateTime.Now) .Start(CalendarView ...
- IO—代码—基础及其用例
字节流:文件.图片.歌曲 使用字节流的应用场景:如果是读写的数据都不需要转换成字符的时候,则使用字节流. 字节流处理单元为1个字节, 操作字节和字节数组.不能直接处理Unicode字符 字节流可用于任 ...
- VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)
上一节中鸡啄米讲了为Ribbon Bar添加控件的方法.本节教程鸡啄米将继续完善前面的实例,讲解一些稍复杂的控件的添加方法,及如何为它们添加消息处理函数. 一.为Ribbon Bar添加更多Ribbo ...
- uva12083 二分图 求最大独立集 转化为求最大匹配 由题意推出二分图
这题大白书例题 : Frank 是一个思想有些保守的高中老师,有一次,他需要带一些学生出去旅行,但又怕其中一些学生在旅途中萌生爱意.为了降低这种事情的发生概率,他决定确保带出去的任意两个学生至少要满足 ...
- JSON草稿
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- PHP二维数组排序(感谢滔哥lvtao.net)
滔哥原创 /* _ooOoo_ o8888888o 88" . "88 (| -_- |) O\ = /O ____/`---'\____ .' \\| |// `. / \\|| ...