【发布时间】:2016-11-08 17:47:34
【问题描述】:
Image demonstrating the memory window while debugging 在 Visual Studio 中使用内存窗口时,我们看到的是该进程的虚拟地址还是 RAM 的物理地址?
【问题讨论】:
Image demonstrating the memory window while debugging 在 Visual Studio 中使用内存窗口时,我们看到的是该进程的虚拟地址还是 RAM 的物理地址?
【问题讨论】:
澄清一下:所有操作系统(除了 MS-DOS 等...)在虚拟内存空间中运行用户程序。每个程序对“位置$12345678 包含的内容”都有自己的感知,并且每个程序的感知对它来说都是正确的。每个程序都可以有不同的编号,并且可以随意更改。
他们可以这样做是因为没有他们实际上知道:
$12345678'”实际驻留。 (如果确实如此......而且很可能不会!)
$12345678中有什么。操作系统为每个进程维护虚拟内存,使用物理RAM和(如果需要)页面文件和/或交换文件空间的组合。进程正在积极使用的信息“按需”提供给它,位于它不知道和不知道可能的物理 RAM 位置。最近未使用的信息最终会从物理 RAM 中“窃取”并移至外部存储……直到再次被引用,从而触发所谓的“页面错误”。
调试器提供给您的内存视图是被调试程序感知的并且对被调试程序正确的内存视图:虚拟地址,在进程的虚拟 内存。
【讨论】:
top 命令看到不断变化的值的原因是因为它可以看到操作系统的虚拟内存子系统的活动。它可以查看当前用于支持任何进程的 物理 资源:当前物理 RAM 占用空间和每个进程使用的交换/页面空间。它可以查看进程希望拥有多少 RAM(其所谓的“工作集大小”),以及它实际获得多少 RAM。它可以看到等待的时间。进程竞争物理 RAM 资源。身体状况不断变化……每微秒。
用户级代码总是看到虚拟地址。它无法知道当前哪个物理地址(如果有!) 对应于这些地址之一。 “虚拟”是它唯一存在的世界,也是它唯一知道的世界。就程序的所有意图和目的而言,“虚拟就是现实。”
【讨论】: