【发布时间】:2018-03-10 16:01:17
【问题描述】:
我一直在尝试理解正在运行的程序使用的虚拟地址空间概念。让我以在 32 位 Windows 操作系统上运行的 32 位应用程序为例。
据我所知,每个进程都认为(或“认为”)自己是系统上运行的唯一应用程序(这是正确的吗?)并且它可以访问 4GB 地址,在标准配置中,2GB分配给内核,2分配给用户进程。我对此有以下疑问:
为什么用户进程需要在其地址空间中加载内核代码?为什么内核不能拥有自己完整的 4GB 地址空间,让每个进程都能享受 4GB 空间?
在 2GB+2GB 配置中,2GB 是否足以让内核加载其所有代码?构成内核的所有应用程序代码肯定都(或可能)超过 2GB 吗?同样,如果考虑到它自己的代码以及 dll 等其他依赖项,分配了 2GB 地址空间的用户进程肯定需要超过 2GB 的空间?
我对这个主题的另一个问题是关于计算机系统上存在正在运行的进程的各个位置 - 例如,我有一个程序 C:\Program Files\MyApp\app.exe。当我启动它时,它使用虚拟地址空间加载到进程中,并使用分页 (pagefile.sys) 来使用有限的 RAM。我的问题是,一旦 app.exe 启动,它是全部加载到 RAM+Pagefile 中还是只从 C:\Program Files\MyApp\myapp.exe 加载程序的一部分,因此它继续引用exe 位置在需要时获取更多信息?
最后一个问题 - 在 32 位操作系统上,如果我的 RAM 超过 4 GB,内存管理是否可以使用超过 4 GB 的 RAM 空间,否则会浪费?
谢谢 史蒂夫
【问题讨论】:
标签: virtual-memory