物理地址扩展 - 虚拟地址如何工作?

物理地址扩展 - 虚拟地址如何工作?

我正在运行 Debian Linux。uname -m表示启用标志i686的 32 位架构机器paegetconf LONG_BIT32。安装的 RAM 容量为 6GB。

我的/proc/cpuinfo有一个条目address sizes : 40 bits physical, 48 bits virtual。但是,我的程序仅生成 32 位地址。 ( Address of x is 0xbfbaf5cc)

cat /proc/cpuinfo我不明白 所示的 48 位虚拟地址与 C 程序生成的虚拟地址之间的关系。可以找到完整的CPU信息这里。

有人可以解释一下吗?

答案1

PAE不会改变虚拟地址的任何内容。正如名称所暗示的,它仅与物理地址有关。作为应用程序程序员,PAE 不会为您改变任何事情。您的程序仍然具有 32 位地址空间,其中内核大约占用 1 位(Linux 根据编译选项向用户空间授予 1GB、2GB 或 3GB)。如果你想要更大的地址空间,你需要64位系统。

PAE 的目的是允许内核寻址超过 4GB 的物理 RAM。为了利用所有这些 RAM,您需要多个进程,每个进程最多可以映射 2GB(或 1GB 或 3GB)。

在 PAE 模式下,MMU 表使用三级表将 32 位虚拟地址映射到 40 位物理地址(与非 PAE 模式不同,在非 PAE 模式下,MMU 表使用两级表将 32 位虚拟地址映射到 32 位物理地址)级表)。

“48 位虚拟”指示是指 CPU 的功能。我认为这意味着CPU是64位的(即支持amd64 又名 x86-64)。为了使用 48 位虚拟地址,您需要运行 64 位操作系统。这里 48 位对于应用程序程序员来说有点令人困惑:CPU 仅翻译地址的 48 位,但地址以 64 位编码 - 指针占用 8 个字节,而不是 6 个字节。高 16 位可以包含操作系统使用的附加标签

答案2

帕埃代表物理地址扩展并允许CPU具有32位地址总线讲话4G以上。

请注意,如果您的/proc/cpuinfo显示支持pae不够,则需要使用pae启用了选项的编译内核(例如:我使用的是 Debian 预构建的 3.16-2-686-pae)

Linux 进程的内存模型/布局由 Linux 内核定义,并且在体系结构之间(或者无论如何可能)不同,用户进程永远不会整个物理 RAM(仅内核),假设内核可能允许进程理论上使用 2G 但实际上只有在需要时才使用页面(通常每个大小为 4K 或 16K)地图从物理Ram 进入进程。

相关内容