在 64 位中,如何在没有 highmem 的情况下为每个进程创建一个隔离的地址空间?

在 64 位中,如何在没有 highmem 的情况下为每个进程创建一个隔离的地址空间?

我的问题可能很愚蠢。但即使经过一番搜索,我仍然不明白为什么 highmem 在 64 位架构中是不必要的。

据我搜索,在x64位中,没有highmem。换句话说,所有的物理内存都是直接与虚拟内存映射的。

但同时,出于包括安全在内的各种原因,所有进程都将拥有自己的从 0x00000 到 sth 的地址空间。

如果所有的物理内存都已经直接映射到了每块虚拟内存,那么如何在不改变物理内存和虚拟内存映射的情况下,为每个进程创建一个独立的、隔离的地址空间呢?

答案1

如何在不改变物理内存和虚拟内存映射的情况下,为每个进程创建独立且隔离的地址空间?

这正是虚拟内存所允许的,也是内核所做的:每个进程都有自己的、单独的虚拟内存映射。这使得一个进程中的页 1000 指向内存中的物理页 X,而另一个进程中的页 1000 指向内存中的物理页 Y,而另一个进程中的页 1000 被换出。每次上下文从一个进程切换到另一个进程时,虚拟内存映射都会更改以匹配新进程。

高级内存之所以需要,是因为内核在其虚拟地址空间中保留了自己的物理内存映射(在 32 位 x86 上,典型的 3G/1G 分割中地址空间的最高 GB 字节)。内核需要能够访问物理内存的任何页面,无论它是否映射在当前进程的虚拟内存中;这就是直接物理内存映射有用的原因。在 32 位系统上,与潜在的物理内存大小相比,这种直接映射的大小受到限制:在 32 位 x86 上最多约为 896MiB。要访问该区域之外的物理内存,内核需要动态映射页面。在 64 位系统上,地址空间的内核端有足够的空间直接映射高达 64TiB 的物理内存,这对于大多数系统来说已经足够了(在还不够的系统上,五级页表允许映射最多 32PiB 的物理内存)。

也可以看看这篇最近的 LWN 文章其中包括高记忆刷新。

相关内容