对于x86_64来说,逻辑地址由16位选择子和64位偏移量组成(而32位时,逻辑地址由16位段选择符和32位偏移量组成),段寄存器仅仅存放选择子。CPU的分段单元(SU)执行以下操作:
[1] 先检查选择子的TI字段,以决定描述子对应的描述子保存在哪一个描述符表中。TI字段指明描述子是在GDT中(在这种情况下,分段单元从gdtr寄存器中得到GDT的线性基地址)还是在激活的LDT中(在这种情况下,分段单元从ldtr寄存器中得到LDT的线性基地址)。
[2] 从选择子的13位index字段计算描述子的地址,index字段的值乘以8(一个描述子的大小,其实就是屏蔽掉末尾那三位指示特权级的CPL和指示TI的字段),这个结果与gdtr或ldtr寄存器中的内容相加。
[3] 将对应的段描述子从内存拷贝到CPU的影子Cache中,这样,只有在选择子改变的情况下才会修改影子Cache中的内容。
[4] 把虚拟地址的偏移量与隐Cache中描述符Base字段的值相加就得到了线性地址。

虽然逻辑地址扩展到了64位,但是,现有的设计并没有完全用到这64位的空间(2^64=16EB),因为使用到如此大的空间,势必造成很大的 系统开销。AMD64在设计的时候就决定在x86_64的第一阶段,只用这64位中的低48位来做页式地址转换,高16位(48-64位)将填充第47位相同的内容(这种方式类似于符号扩展)。 如果逻辑地址不符合此规定,系统将产生异常。符合此规定的地址称为canonical form,地址的范围分为两段:0 到 00007FFF-FFFFFFFF,以及FFFF8 000-0000 0000到FFFFFFFF-FFFFFFFF,总共为256TB。 这种虚拟地址的分层结构,也为操作系统的设计带来了一定便利:可以取地址的上半段保留做为操作系统的逻辑地址空间,而低地址部分做为装载应用程序的空间, 而canonical form不允许的地址空间则做为操作系统的标志、以及特权级的标识等。当然,这样的设计在未来地址进一步扩展的时候将成为一个新的问题。

可以想象,用到48位的x86-64虚拟地址的分配机制为:   

- 0-11(12)位:页内偏移;   

- 12-20(9)位:由PML4来映射;   

- 21-29(9)位:高一级页目录来映射(如果PS=1,则该页表项指向一个2MB的页);   

- 30-38(9)位:再高一级的页目录来映射(如果PS=2,则该页表项指向一个1GB的页);   

- 39-47(9)位:页目录指针表来映射。   

其虚拟地址空间布局如下:

0000000000000000 - 00007fffffffffff (=47 bits) user space, different per mm
hole caused by [48:63] sign extension
ffff800000000000 - ffff80ffffffffff (=40 bits) guard hole
ffff880000000000 - ffffc7ffffffffff (=64 TB) direct mapping of all phys. memory
ffffc80000000000 - ffffc8ffffffffff (=40 bits) hole
ffffc90000000000 - ffffe8ffffffffff (=45 bits) vmalloc/ioremap space
ffffe90000000000 - ffffe9ffffffffff (=40 bits) hole
ffffea0000000000 - ffffeaffffffffff (=40 bits) virtual memory map (1TB)
... unused hole ...
ffffffff80000000 - ffffffffa0000000 (=512 MB) kernel text mapping, from phys 0
ffffffffa0000000 - fffffffffff00000 (=1536 MB) module mapping space

x86-64的长模式下,对16位以及32位代码进行了兼容,即使CPU上跑的是64位的操作系统,历史遗留的16位以及32位代码将都能够在该操作系统上运行。 由于x86-64兼容IA32的指令,所以,这些代码在这种情况下运行,基本上没有性能损耗。   

在传统模式(Legacy mode)下,x86-64的CPU的工作模式跟传统的IA32没有什么两样。

x86_64的内存映射的更多相关文章

  1. Python之mmap内存映射模块(大文本处理)说明

    背景: 通常在UNIX下面处理文本文件的方法是sed.awk等shell命令,对于处理大文件受CPU,IO等因素影响,对服务器也有一定的压力.关于sed的说明可以看了解sed的工作原理,本文将介绍通过 ...

  2. 【转】Python之mmap内存映射模块(大文本处理)说明

    [转]Python之mmap内存映射模块(大文本处理)说明 背景: 通常在UNIX下面处理文本文件的方法是sed.awk等shell命令,对于处理大文件受CPU,IO等因素影响,对服务器也有一定的压力 ...

  3. 内存映射文件MemoryMappedFile使用

    参考资料: http://blog.csdn.net/bitfan/article/details/4438458 所谓内存映射文件,其实就是在内存中开辟出一块存放数据的专用区域,这区域往往与硬盘上特 ...

  4. JAVA NIO FileChannel 内存映射文件

      文件通道总是阻塞式的. 文件通道不能创建,只能通过(RandomAccessFile.FileInputStream.FileOutputStream)getChannel()获得,具有与File ...

  5. 使用ZwMapViewOfSection创建内存映射文件总结

    标 题: [原创]使用ZwMapViewOfSection创建内存映射文件总结 作 者: 小覃 时 间: 2012-06-15,02:28:36 链 接: http://bbs.pediy.com/s ...

  6. C#大文件读取和查询--内存映射

    笔者最近需要快速查询日志文件,文件大小在4G以上. 需求如下: 1.读取4G左右大小的文件中的指定行,程序运行占用内存不超过500M. 2.希望查询1G以内容,能控制在20s左右. 刚开始觉得这个应该 ...

  7. 用C#实现的内存映射

    当文件过大时,无法一次性载入内存时,就需要分次,分段的载入文件 主要是用了以下的WinAPI LPVOID MapViewOfFile(HANDLE hFileMappingObject, DWORD ...

  8. 【转】C#大文件读取和查询--内存映射

    笔者最近需要快速查询日志文件,文件大小在4G以上. 需求如下: 1.读取4G左右大小的文件中的指定行,程序运行占用内存不超过500M. 2.希望查询1G以内容,能控制在20s左右. 刚开始觉得这个应该 ...

  9. Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer

    Atitit.病毒木马的快速扩散机制原理nio 内存映射MappedByteBuffer 1. Java NIO(New Input/Output)1 1.1. 变更通知(因为每个事件都需要一个监听者 ...

随机推荐

  1. ArcGIS Server的切图原理深入(转载)

    http://forum.osgearth.org/template/NamlServlet.jtp?macro=search_page&node=2174485&query=arcg ...

  2. 在centos 6.5 x64中安装 spark-1.5.1

    以下内容参考:http://blog.csdn.net/lovehuangjiaju/article/details/48494737 1.解压安装文件,设置环境变量 这里我们使用的安装文件是已经编译 ...

  3. K-Means 算法(转载)

    K-Means 算法 在数据挖掘中, k-Means 算法是一种 cluster analysis 的算法,其主要是来计算数据聚集的算法,主要通过不断地取离种子点最近均值的算法. 问题 K-Means ...

  4. mongoDB文档操作

    数据库操作无非就是增.删.改.查.这篇主要介绍增.删.改. 1.增 Mongodb插入操作很简单,使用关键字“insert”.实例: > db.test.blog.insert({"h ...

  5. WPF中将16进制颜色码转换成SolidColorBrush

    使用ColorConverter.ConvertFromString(string colorValue)方法 例如:new SolidColorBrush((Color)ColorConverter ...

  6. jQuery如何实现点击页面获得当前点击元素

    获得jquery对象: function foo(e){ var obj = $(e.target); }

  7. Linux笔记(十一) - 文件系统管理

    (1)文件系统查看命令:df [选项] [挂载点]-a 显示所有文件系统信息,包括特殊文件系统,如/proc /sysfs-h 使用习惯单位显示容量,如KB,MB或GB-T 显示文件系统类型-m 以M ...

  8. Android中微信抢红包助手的实现

    参考(感谢作者):http://www.jianshu.com/p/cd1cd53909d7 http://blog.csdn.net/jiangwei0910410003/article/detai ...

  9. 真分布式SolrCloud+Zookeeper+tomcat搭建、索引Mysql数据库、IK中文分词器配置以及web项目中solr的应用(1)

    版权声明:本文为博主原创文章,转载请注明本文地址.http://www.cnblogs.com/o0Iris0o/p/5813856.html 内容介绍: 真分布式SolrCloud+Zookeepe ...

  10. PLSQL语法深入浅出

    一:PLSQL概览:PLSQL 是Oracle公司在SQL基础上进行扩展而成的一种过程语言.PLSQL提供了典型的高级语言特 性,包括封装,例外处理机制,信息隐藏,面向对象等:并把新的编程思想带到了数 ...