-
-
[原创]x64存储管理机制初窥
-
发表于: 2009-12-3 15:39 7115
-
【文章标题】: x64存储管理机制初窥
【文章作者】: childz
【软件名称】: intel手册 volume:3A和AMD手册volume:2
【下载地址】: intel官网和AMD官网
【编写语言】: 汉语
【操作平台】: Windows xp sp2
【作者声明】: 没什么技术含量,主要来源于intel手册和AMD手册
--------------------------------------------------------------------------------
【详细过程】
前几天,问x64存储管理机制,经prolj和mik指点,去找intel手册和AMD手册看,看完之后把我的理解 写下,
如有什么理解偏差之处,还望各位不要笑话,毕竟本人英语也是cai啊
1.长模式(long mode)
在AMD64架构的长模式中包括两个子模式:64bit模式和compatibility模式。
● 64bit模式:在此模式中虚拟地址空间使用平坦(flat)模式,段寄存器包括CS,DS,ES,SS全部清零
(FS,GS除外,在线性地址计算时,提供额外的base寄存器寻址某些OS的系统数据结构),
能为64bit的OS和应用程序提供64位寻址支持。
●compatiblity模式:在此模式中使用与lagecy保护模式一样的存储管理模式,为的是平滑运行32bit
和16bit的应用程序,无需重新编译
注意:在长模式中不支持实模式和虚拟8086模式!!
由于在64bit模式下使用flat模式,所以无lagecy保护模式下的分段管理模式,所以虚拟地址直接对应线性
地址。所以x64的分页
管理模式才是64bit下的重头戏
2.x64分页管理模式
如下图,是x86-64下的所有页大小和物理地址大小的汇总
在x64下,理论上可以通过使用PAE(物理地址扩展)分页结构支持64bit的线性地址到52bit物理地址的映
射的,但在对这一架构的首次实现中,
只实现了48位的线性地址到40位物理地址的映射。现在你可以通过CPUID指令查看自己的cpu所支持的最大
物理地址(MAXPHYDDR).
大家一定还记得在lagecy保护模式下通过PAE功能来访问超过32bit(36bit)的物理地址,但是在x64模式下
的PAE与先前的PAE是不一样的!!
从线性地址到物理地址的转换中用到了四级页数据结构,一个新的页表数据结构---PML4被引入用来指向页
目录指针表。PML4表
只能在x64模式下使用。而且页目录表指针从原来的4个项增加到了512个,所以要从线性地址中分配9bit用
来索引PDP表(原来是2bit)。
PDE和PTE的大小保持不变。所以我们可以看到PML4+PDP+PDE+PTE+page offset=48bit,高16bit保留(其实
是用以符号扩展,下面将看到
符号扩展的用途)。
CR3指向了PML4的基地址。
需要注意的是在使用x64模式之前,必须使CR4.PAE=1(PAE用来扩展PDE和PTE至64bit)。如果你在未使
CR4.PAE=1之前,企图开启
x64模式的话,会引发#GP异常。
我们从上图还可以看到页大小的选择完全取决于PDE.PS(但我并没有在文档中看到ps位,是直接在文档中
置1或0),无视CR4.PSE的存在。
2.1x64分页管理(4kb)
上图再说
●sign extended--符号扩展位
●PML4 entry--在线性地址39~47bit用于索引PML4 entry,指向PDP
●PDP entry--在线性地址的30~38bit用来索引PDP entry,指向PDE
●PDE entry--在线性地址的21~29bit用来索引PDEentry,指向PTE
●PTE entry--在线性地址的12~20bit用来索引PTE entry,指向page offset
●page offset--在线性地址的0~11bit提供在页中的offset
2.2x64分页管理(2mb)
我们可以看到与4kb的页相比少了PTE,page offset从原来的12bit增加到了21bit
下面我们来看看各页表项的内部结构
上图看到,用上述方法可以得到512×512×512×512=2^36个页面,2^36*4kb=2^48个线性地址
上图看到,用上述方法可以得到512×512×512=2^27个页面,2^27*2mb=2^48个线性地址
0bit:P位,即存在位,表示由项所指的页面或页表当前是否加载到了物理存储器中,如不存在,可以通过
引发#PF异常从磁盘中
加载到物理存储器中
1bit:R/W,即读写位,为页表指定读写特权,当置位时可读可写;清零是只读
2bit:用户/系统位,即为页表指定系统还是普通用户特权
3bit:页面通写,指定高速缓存写策略是回写还是通写
4bit:高速缓存禁止位,当置位时禁止相关的页面和页表进行高速缓存,反之,可以
5bit:访问位,当置位时表示已经被访问,反之,没有
6bit(非PTE或PDE(2MB)):可用位
6bit(PTE或PDE(2MB)):D位,dirty,即脏位,置位时表示页面被写过
7~8bit(非PTE或PDE(2MB)):0
avail:系统程序员可用
G:全局标志
PAT:页表属性
各种base address是用来得到下一级表的基地址的,
最后的物理地址=page base address*2^12(2^21),而page base address的大小取决于你的cpu的最大物理
地址了。
3.最后,我来看一看sign extended会形成什么效果。
由于sign extended的作用会将线性地址分成相同大小的两段,从0至00007FFF`FFFFFFFF,
以及从 FFFF8000`00000000至FFFFFFFF`FFFFFFFF总计256TB的地址范围,这非常符合操作系统的习惯。
这种“古怪”的规则为日后扩展到真正的64位寻址保留了一个重要的特性:很多的操作系统(包括但不限
于Windows NT系列)
将地址空间的高半部分(被称作内核空间)留给自己,将低半部分(用户空间)留给应用程序代码、用户
态栈、堆和其他数
据区。这种设计保证了每一个符合AMD64的实现都拥有两个内存片段:低半段从00000000`00000000开始,
随着更多的虚拟地址位变得可用而“向上生长”;高半部分被“悬挂”在地址空间的顶部而“向下生长”
。同样,
将未被使用的地址位内容固定下来防止被操作系统用作标志位、特权级标号等其他用途,是为了避免当架
构扩展至52,
56, 60 和64位的时候出现问题。
参考资料:
1.http://zh.wikipedia.org/zh-cn/X86-64
2.intel手册
3AMD手册
--------------------------------------------------------------------------------
【经验总结】
我还很菜,继续努力,向mik大侠学习
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2009年12月03日 14:53:35
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
- [原创]x64存储管理机制初窥 7116
- 罗云彬网站关了? 11618
- [求助]大家帮我看看,这个程序编译不过 3143
- [求助]自己编写了一个小的驱动,有没有办法自己手动安装呢? 6323
- [分享]一个别人用来为难sunbird的crackme 4205