Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Linux如何在x86-64中支持超过512GB的虚拟地址范围?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

Linux的x86-64用户虚拟地址空间为47位.这实际上意味着Linux可以映射具有大约~128 TB虚拟地址范围的进程. 然而,让我感到困惑的是x86-64架构支持每个进程的ISA定义的4级分层页表(排列为基数树).页表的根目录最多只能映射512 GB的连续虚拟地址空间.那么Linux如何支持512GB以上的虚拟地址范围呢?它是否为每个进程使用多个页表?如果是,那么对于一个进程,CR3(x86
Linux的x86-64用户虚拟地址空间为47位.这实际上意味着Linux可以映射具有大约~128 TB虚拟地址范围的进程.

然而,让我感到困惑的是x86-64架构支持每个进程的ISA定义的4级分层页表(排列为基数树).页表的根目录最多只能映射512 GB的连续虚拟地址空间.那么Linux如何支持512GB以上的虚拟地址范围呢?它是否为每个进程使用多个页表?如果是,那么对于一个进程,CR3(x86-64的寄存器包含页表基址的地址)应包含哪个给定进程?我错过了什么吗?

解决方法

我不知道“页面表的根目录”是什么意思,但x86-64上的分页看起来像这样:

>页表 – 最低级别的分页结构.每个都有512个8字节条目(PTE)描述一个4 KiB页面,因此PT描述512 * 4 KiB = 2 MiB的内存(它也可以作为2 MiB页面使用,但现在让我们离开它).
>页面目录 – 表,类似于PT,包含指向PT的512个8字节条目(PDE);因此,PD描述512 * 2 MiB = 1 GiB的内存(它也可以作为1 GiB页面,类似于PT).
>页面目录页面表 – 类似于PD,但包含指向PD的512个8字节条目(PDPTE);所以,PDPTE描述了512 * 1 Gib = 512 GiB的内存.
> PML4,最高级别的分页结构,是包含512个8字节条目(PML4E)的表,指向PDPT;所以,PML4描述了512 * 512 GiB = 256 TiB的内存.

我不知道Linux的确切内存映射,但可能更高的一半(从-128 TiB到0 – 从0xFFFF800000000000到0xFFFFFFFFFFFFFFFF)保留给内核,下半部分(从0到128 TiB – 从0x0000000000000000到0x00007FFFFFFFFFFF)是用户空间应用程序因此,Linux支持512倍于您要求的512 GiB虚拟地址范围;甚至托瓦兹也不会说“我们不会支持PML4”.我不知道是什么让你感到困惑 – 是你错过了这个部分,说页面表映射2 MiB并且你已经把它当作一个页面映射 – 4 KiB – 但是如果有什么我可以澄清,请询问它.

大佬总结

以上是大佬教程为你收集整理的Linux如何在x86-64中支持超过512GB的虚拟地址范围?全部内容,希望文章能够帮你解决Linux如何在x86-64中支持超过512GB的虚拟地址范围?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: