Ark*_*rka 5 linux x86-64 linux-kernel mmu
Linux的x86-64用户虚拟地址空间为47位.这实际上意味着Linux可以映射具有大约~128 TB虚拟地址范围的进程.
然而,让我感到困惑的是x86-64架构支持每个进程的ISA定义的4级分层页表(排列为基数树).页表的根目录最多只能映射512 GB的连续虚拟地址空间.那么Linux如何支持512GB以上的虚拟地址范围呢?它是否为每个进程使用多个页表?如果是,那么对于一个进程,CR3(x86-64的寄存器包含页表基址的地址)应包含哪个给定进程?我错过了什么吗?
页表的根目录最多只能映射512 GB的连续虚拟地址空间.那么Linux如何支持512GB以上的虚拟地址范围呢?它是否为每个进程使用多个页表?如果是,那么对于一个进程,CR3(x86-64的寄存器包含页表基址的地址)应包含哪个给定进程?我错过了什么吗?
我不知道"页面表的根目录"是什么意思,但x86-64上的分页看起来像这样:
512 * 4 KiB = 2 MiB了内存(它也可以作为2 MiB页面使用,但现在让我们保留它).512 * 2 MiB = 1 GiB了内存(它也可以作为1 GiB页面,类似于PT).512 * 1 Gib = 512 GiB了内存.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 - 但是如果有什么我可以澄清,请询问它.
| 归档时间: |
|
| 查看次数: |
903 次 |
| 最近记录: |