• x86_64的内存映射


    对于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没有什么两样。

  • 相关阅读:
    私活。
    sql server 模拟数组【转】
    Updlock 与 Holdlock
    连上交换机后电脑无法上网
    linux的发展
    MySQL5.7中,用root用户登陆不进去数据库,报以下错误,然后重新修改了密码,好了。
    nginx反响代理tomcat配置ssl
    tomcat日志的切割脚本
    重启nginx报错:[error] invalid PID number "" in "/application/nginx-1.13.3/logs/nginx.pid"
    数据盘的挂载
  • 原文地址:https://www.cnblogs.com/chaozhu/p/6494394.html
Copyright © 2020-2023  润新知