Linux在x86-64下的虚拟内存布局
2016-06-14 00:00
337 查看
普通x86架构下的Linux内存布局大家应该都很清楚了. 物理内存分为ZONE_DMA, ZONE_NORMAL和ZONE_HIGHMEM三个区, 虚拟内存则一般是0-3G为用户空间, 3G-(4G-1)为内核空间. 那么, x86-64架构下呢?
有多大
首先, 目前大部分的操作系统和应用程序并不需要16EB( 2^64 )如此巨大的地址空间, 实现64位长的地址只会增加系统的复杂度和地址转换的成本, 带不来任何好处. 所以目前的x86-64架构CPU都遵循AMD的Canonical form, 即只有虚拟地址的最低48位才会在地址转换时被使用, 且任何虚拟地址的48位至63位必须与47位一致(sign extension). 也就是说, 总的虚拟地址空间为256TB( 2^48 ).如何布局
然后, 在这256TB的虚拟内存空间中, 0000000000000000 - 00007fffffffffff(128TB)为用户空间, ffff800000000000 - ffffffffffffffff(128TB)为内核空间. 这里需要注意的是, 内核空间中有很多空洞, 越过第一个空洞后, ffff880000000000 - ffffc7ffffffffff(64TB)才是直接映射物理内存的区域, 也就是说默认的PAGE_OFFSET为ffff880000000000. 从这里我们也可以看出, 这么大的直接映射区域足够映射所有的物理内存, 所以目前x86-64架构下是不存在高端内存, 也就是ZONE_HIGHMEM这个区域的(参考这篇).如何映射
64位寻址模式是PAE的扩展. 页大小支持PAE所支持的4K和2M, 以及独有的1G. 页表分为4级, 不但扩展了PAE的Page-Directory Pointer Table, 还添加了一个Page-Map Level 4(PML4)映射表. 巧妙之处在于, 这个表不但可以通过扩展来支持以后的完整64位地址空间, 也兼容很有可能出现的第5级页表.相关文章推荐
- centos上安装python插件以及setuptools ,pip
- Linux系统开机自动启动脚本。自动加载某些脚本或系统服务
- linux 文件内容查找(当前文件夹下)
- 超信Linux版(超信 for Linux下载) v1.3.0官方版
- SSMTP—让Linux系统从Office 365发送邮件
- 15 条实用 Linux/Unix 磁带管理命令
- Linux命令scp
- ubuntu下安装无线网卡Broadcom802.11驱动
- linux中的wget命令
- Linux中安装配置spark集群
- linux下各种工具的配置
- linux GDB调试程序(一)
- Linux下Makefile生成工具automake使用
- linux下libusb使用
- centos 搭建 git 服务端和客户端
- 使用Linux重定向解决nohup.out无写权限问题
- Linux - 输入和输出
- VMware 安装Ubuntu/Linux 无法满屏显示
- 浅谈Linux中的crond
- [uart]1.Linux中tty框架与uart框架之间的调用关系剖析