0
Object1 * test= new Object1();

“测试”是否在 RAM 上具有绝对地址或在虚拟内存中具有与 RAM 的零地址相对起点的绝对地址?

一个例子可能是,在一个非常碎片化的内存中,我启动了许多应用程序,每个应用程序在 10 小时内多次分配和释放,其中一个应用程序是 RAM 错误检查和基准测试。它可以测试所有 RAM 地址还是仅在有限区域上运行?如果它达到所有 RAM,那么除了移动其对象之外,操作系统如何能够保护应用程序免受其他应用程序的影响?特别是当从 pci-e 流式传输非固定数组到 pci-e 时。

4

2 回答 2

3

大多数操作系统使用虚拟寻址,因此程序看到的地址在很大程度上独立于 RAM 本身的物理地址。

但是,有些确实具有可用于分配具有固定物理地址的物理内存的特殊功能。例如,在 Windows 上,您可以使用它AllocateUserPhysicalPages来分配一些物理页面(然后您可以将其映射到虚拟地址/从虚拟地址取消映射)。

不过,这仍然只能让您测试有限的区域。它会尝试分配一些物理页面,并在可能的情况下成功——但也有(例如)内核的某些部分在启动时被映射到特定的内存位置,并一直留在那里直到关闭(并且没有方法提供以要求他们移动)。

于 2016-09-12T20:00:32.240 回答
1

它在虚拟内存空间中保持相同的地址。这与物理内存空间不同 - 请记住,这就是页面文件的用途,以便能够分配比总可用物理内存更多的内存。此外,两个不同的应用程序可以通过同时调用 new/malloc 来获得相同的(虚拟)内存地址(但如果它们同时被分页,它们在物理内存中确实是不同的地址)。

这也意味着,在虚拟化内存的系统(基本上所有现代系统,如 Windows、Linux 等)中,实际实现一个测试物理内存的应用程序并非易事。这就是为什么许多内存检查应用程序(如 Memtest 等)从可引导驱动器运行,以便能够直接访问和利用物理内存。

顺便提一句。请注意,Linux 有一个名为“over-committing”的功能(通常默认启用),这意味着 new/malloc 可以返回一个“有效”的对象地址,但它根本不对应任何物理位置(即尚未“真正”分配)。并且仅当实际将某些内容写入该内存区域时才分配内存。

于 2016-09-12T20:02:56.920 回答