32位Windows中的虚拟和物理地址映射

32位Windows中的虚拟和物理地址映射

纠正我,我错了。

Q1) 我的理解是,在 32 位模式下,我们获得 4GB 虚拟地址空间。这是因为 32 位 Windows 只能支持 4 GB 物理 RAM 吗?

Q2) 每个进程都有自己的 4 GB 私有地址空间。2GB 用户模式和 2GB 内核。进程是否将其整个代码映射到用户模式,并且该进程与处理器通信以执行代码所需的操作系统组件是否加载到内核模式?

Q3) 如果一个进程正在获得其自己的私有 4GB 空间。如果我加载 3 个进程,总共 12 GB 地址空间。由于我只有 4 GB RAM,我会遇到性能问题吗?

但是虚拟地址是为了在 RAM 较少的情况下满足进程的需求而设计的。所以我真正的问题是,当一个进程(单进程应用程序)加载时,它是否会将整个代码映射到 4GB 虚拟地址,而不管应用程序当前只执行整个代码的某个部分。

我的理解是,当一个进程启动时,它的所有代码都加载到 2GB 用户模式的虚拟地址空间中,其余 2GB 加载操作系统内核文件。现在使用页表将虚拟地址映射到 RAM 和磁盘中的物理地址。所有 4GB 虚拟地址是否都将映射到 4GB 物理 RAM,其余映射到页面文件?如果我拒绝使用页面文件,这是否意味着只有 1 个具有 4GB 虚拟地址的进程可以在 32 位 4GB 操作系统上运行?

=================================================================================== 感谢您之前的回答。

我仍然有点困惑用户和内核地址空间是如何划分的。

1) 2 GB 的内核地址空间是否由所有进程共享,因为它是系统范围的并在启动时加载?还是每个进程都有 2GB 的内核地址空间? 2) 我读到一些编写不良的应用程序会消耗其所有地址空间?这是否意味着现在在 4GB 的机器上没有空间供其他应用程序运行? 3) 如果内核地址空间由所有进程共享,它是否会耗尽地址空间,或者它永远不会耗尽地址空间,因为(我认为)内核地址基于操作系统架构保持固定并由所有进程共享。 4) 通过使用 USERVA 开关,内核地址减少到 1 GB,仅适用于具有大地址感知的应用程序。如果内核地址空间为 2GB(我认为)由所有进程共享,为什么不对所有进程都这样做? 5) 我们究竟如何区分虚拟内存和虚拟地址空间?如果应用程序按照开发人员的要求需要 5GB 内存,那么它将无法在具有 2GB 地址的 32 位机器上运行(可以这样说进程的虚拟内存 = 进程的虚拟地址空间吗?)

答案1

纠正我,我错了。

非常乐意。你准备好了吗?


Q1) 我的理解是,在 32 位模式下我们获得 4GB 虚拟地址空间。

正确的。

这是因为 32 位 Windows 只能支持 4 GB 物理 RAM 吗?

不,虚拟内存的大小与物理或已安装内存的大小无关。
这些数量相同只是因为它们都使用 32 位宽的值(用于地址)。处理器可以设计为具有与其物理地址大小不同的虚拟地址大小。我记得在硬件尺寸和成本远高于今天的时候已经这样做了。


Q2) 每个进程都有自己私有的 4 GB 地址空间。

是的,虚拟地址空间。

2GB 用户模式和2GB 内核。

不,“用户模式”与 CPU 的运行状态(即 CPU 模式)有关。内存没有“用户模式”(也不是“内核模式”)。
虚拟内存分为用户空间和内核空间。

该进程是否将其整个代码映射到用户模式,并且该进程与处理器通信以执行代码所需的操作系统组件是否在内核模式下加载?

这个问题只有在“模式”被替换为“空格”。

内核在启动时加载到物理内存中。
内核的执行是控制系统的执行,例如进程启动和管理。
内核被映射到每个进程的虚拟地址空间中。这就是为什么进程虚拟内存的一部分是“内核空间”。

程序代码和(共享)库被映射到用户空间的虚拟内存。

操作系统没有“与处理器通信”(任何进程也没有)。
处理器/CPU 执行指令。没有“沟通”与 CPU 交互。
进程是概念化的作业或任务,它被分配了诸如内存(虚拟和物理)和调度的 CPU 时间等资源。
进程与处理器/CPU 之间的唯一交互是执行该进程的指令。内核与处理器/CPU 之间的交互是执行该内核的指令,以及路由异常和中断。


Q3) 如果一个进程正在获取它自己的私有 4GB 空间。

没有“如果”.每个进程都有4GB的虚拟内存。

如果我加载 3 个进程,总共 12 GB 地址空间。由于我只有 4 GB RAM,是否会有性能问题?

完全不可能,因为典型的进程很少会使用所有的虚拟内存。即使它们使用了,也有后备存储(例如分页文件或交换空间)来处理物理内存少于虚拟地址空间的情况(这是使用虚拟内存的最初原因)。


但是虚拟地址是为了在 RAM 较少的情况下满足进程的需要而设计的。

你可能指的是虚拟内存,而不是“虚拟地址”

所以我真正的问题是,当一个进程(单进程应用程序)加载时,它是否会将整个代码映射到 4GB 虚拟地址,而不管应用程序当前仅执行整个代码的某个部分。

(为什么你的“真正的问题”给定一个数字?)
我没有明确的答案,但希望它会加载整个程序,以便执行任何重定位,以及解析任何外部链接(例如到库)。
加载的任何内容都必须映射,即分配物理内存。

我的理解是,当启动一个进程时,它的所有代码都会加载到 2GB 用户模式的虚拟地址空间中,剩下的 2GB 会加载操作系统内核文件。

你又滥用了“用户模式”.
加载内核代码是在启动时进行的,而不是在启动进程时进行的。

现在使用页表将虚拟地址映射到 RAM 和磁盘中的物理地址。所有 4GB 虚拟地址是否都将映射到 4GB 物理 RAM,其余映射到页面文件。?

不,页表仅将虚拟内存映射到物理内存(以页面为单位)。没有映射到“磁盘”。这听起来像是对页面文件和虚拟内存工作原理的常见误解。
页面文件是一个后备存储。它临时保存不能驻留在内存中的虚拟内存页面的内容(即分配的物理内存)。

如果我拒绝使用页面文件,是否意味着只有 1 个具有 4GB 虚拟地址的进程可以在 32 位 4GB 操作系统上运行?

不是,因为进程通常不会使用其整个虚拟地址空间,因此它不需要 4GB 的物理内存。
我曾见过在 32 位 Linux 系统上执行超过二十个进程,而该系统只有 512MB 的安装 RAM 且没有交换文件。

答案2

Q1:不是,这是因为 32 位寄存器只能容纳 4GB 的唯一地址。

Q2:不正确,没有将用户内存划分为用户和内核。内核不在进程地址空间中。

Q3:是的,Windows 将根据需要换出最早引用的内存页面。

真正的问题:是的,如果没有将整个内存映射到交换空间,进程就无法启动,因此它可以随时全部或部分地换出。

对于其余的内容,我建议您先在维基百科上阅读一些内容:

相关内容