Linux中64位进程虚拟地址空间是如何划分的?

Linux中64位进程虚拟地址空间是如何划分的?

下图展示了32位进程虚拟地址空间是如何划分的:

在此输入图像描述

那么64位进程的虚拟地址空间是如何划分的呢?

答案1

x86

64 位 x86 虚拟内存映射将地址空间分为两部分:较低的部分(最高位设置为 0)是用户空间,较高的部分(最高位设置为 1)是内核空间。 (请注意,x86-64 定义了“规范”“下半部”和“上半部”地址,位数实际上限制为 48 或 57;请参阅维基百科或者英特尔SDM,第 3 卷第 4.5 节,了解详细信息。)

完整的地图有详细记录在内核中;目前看起来像

起始地址 抵消 结束地址 尺寸 虚拟机区域说明
0000_0000_0000_0000 0 0000_7fff_ffff_ffff  128 钛硼 用户空间虚拟内存
0000_8000_0000_0000 +128TiB ffff_7fff_ffff_ffff ~16M TiB 非规范的
ffff_8000_0000_0000 -128TiB ffff_ffff_ffff_ffff  128 钛硼 内核空间虚拟内存

具有 48 位虚拟地址。 57 位变体具有相同的结构,16K PiB 孔的两侧各有 64 PiB 可用地址空间:

起始地址 抵消 结束地址 尺寸 虚拟机区域说明
0000_0000_0000_0000 0 00ff_ffff_ffff_ffff  64 皮B 用户空间虚拟内存
0100_0000_0000_0000 +64 PiB feff_ffff_ffff_ffff ~16K PiB 非规范的
ff00_0000_0000_0000 -64个PiB ffff_ffff_ffff_ffff  64 皮B 内核空间虚拟内存

(请注意,16K PiB = 16M TiB = 2 64 字节。绝大多数可用地址空间都是非规范的。)

这两种布局都使用 52 条地址线 (4 PiB) 提供对相同物理地址空间的访问。 4 级分页仅提供在任何给定时间对 256 TiB 子集的访问; 5 级分页提供对完整物理地址空间的访问。当前的 x86 CPU 的处理能力远远低于此;据我所知,单路CPU最多可以处理6TiB。

与 32 位情况不同,“64 位”内存映射直接反映了硬件限制。

手臂

64位ARM在硬件上有类似的地址区别:前十二或十六位是0用于用户空间,1用于内核空间。 Linux 使用 39、42 或 48 位作为虚拟地址,具体取决于页表级别的数量和页面大小。对于 ARMv8.2-LVA,添加了另外 4 位,从而产生 52 位虚拟地址。

这也有详细记录在内核中

相关内容