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

Chr*_*her 17 linux

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

在此处输入图片说明

但是一个64位的进程虚拟地址空间是如何划分的呢?

Ste*_*itt 15

x86

64 位 x86 虚拟内存映射将地址空间分成两部分:低部分(最高位设置为 0)是用户空间,高部分(最高位设置为 1)是内核空间。(请注意,x86-64 定义了“规范的”“下半部分”和“上半部分”地址,其中许多位有效地限制为 48 或 56;有关详细信息,请参阅维基百科。)

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

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

使用 48 位虚拟地址。(56 位变体具有相同的结构,在 16K PiB 孔的两侧有 64 PiB 的可用地址空间。)?(注意 16K?PiB = 16M?TiB = 2 64 ?bytes。)

与 32 位情况不同,“64 位”内存映射是硬件约束的直接反映。

手臂

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

这也在内核中详细记录。