问题标签 [virtual-address-space]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
760 浏览

memory-address - 虚拟地址和物理地址的区别?

请根据以下示例解释虚拟地址和物理地址之间的区别。请说明这里具体使用哪个地址,以及如何在同一个地方使用其他地址。还有,这两者怎么总能区分开来。

代码:

&a两个语句中都指的是什么地址?

0 投票
2 回答
16223 浏览

paging - 了解虚拟地址、虚拟内存和分页

我一直在学习这些主题并阅读了许多文章和书籍,但它们都缺乏一些补充信息,让我更加困惑。所以在这里,我想解释一下我在提问时所知道的。希望这个主题对像我这样的许多人有用。我还想了解我的知识的有效性,并在必要时进行更正。

虚拟内存

一些文章说“虚拟内存是硬盘的一些空间,它模拟物理内存,因此我们可以拥有比实际更多的内存。”。其他一些文章说“虚拟内存是物理内存 (RAM) 的组合,它是硬盘的一部分,其作用类似于物理内存和页表。” 但是它们是不同的东西,我不明白为什么会有这样的不同解释。

让我们继续第二个解释,因为它也是 Wikipedia 描述虚拟内存的方式。在这一点上,虚拟地址是有意义的,因为我们在虚拟内存中使用地址而不是直接使用物理内存。

顺便说一句,我的 Mac 说我有 8GB 物理内存和 8GB 虚拟内存。在这种情况下,VM 是否包括物理内存或者它是 HD 中用作内存的空间量?我的程序是否有 16GB 内存可用?

在此处输入图像描述

问题一:

Intel i5 具有 36 位地址总线,这意味着您可以寻址 64GB 内存。假设我在我的电脑上安装了 4GB RAM。但是,我的程序可能不知道安装的内存大小,因为它将用于具有不同内存大小的许多不同系统。这就是虚拟内存变得方便的地方。它抽象出安装的内存的实际大小。

但是,当我的程序想要访问内存地址 0xFFFFFFFFF 时会发生什么?我只安装了 4GB,也许还有一些 HD 内存空间。

对于这个问题,我有两个理论:

1.由于页表是由 OS 维护的,OS 对该地址进行解码并找出是哪个页,并在页表中检查该页以查看它们是否具有与其关联的物理地址(有效和无效标志),如果是然后转到物理内存中页面入口点的物理地址+虚拟地址中定义的偏移量并带来该值。否则会发生页面错误,操作系统在辅助存储中查找该页面,获取它并将其放入内存并更新页表。

2.它抛出 OutOfMemory 类型的异常,表示我没有给定地址可以寻址的任何内存。

第一种理论的缺点是当程序想要使用 64GB 内存时会发生什么?然后我们需要有 60GB 的 HD 内存空间,因为我们只有 4GB。但是,在下面的屏幕截图中,MAC 告诉我只有 8GB 虚拟内存。

问题2:

进程如何放入虚拟内存中?我的意思是每个进程都有 0x0 - 0xFFFFFFFFF 可用的虚拟内存空间,还是只有一个虚拟内存地址空间可以放置所有进程?

如果每个进程都假设它们拥有所有可用的内存,那么这些内存如下所示:

在此处输入图像描述

如果只有一个虚拟内存概念,那么它看起来像这样:

在此处输入图像描述

页表

所以页表是一种位于物理地址和虚拟地址之间的数据结构。它是一个关联数组(或类似字典),对于每个页面(键),都有一个关联的物理地址(值)。

操作系统使用 MMU(内存管理单元)来执行从虚拟地址到物理地址的转换。

在此处输入图像描述

问题 3:

是否有一个巨大的页表,其中包含每个进程的所有页面,或者每个进程都有自己的页表?

寻呼

分页是一种内存管理方法。虚拟内存和物理内存由内存管理单元划分为页面(它们是固定且大小相同的块)。当您在内存和辅助存储之间交换页面时,此技术很有用,以便您可以在它们之间交换页面。例如,您的程序请求位于地址中的数据。但是,您的程序使用的地址是虚拟地址,MMU 使用页表对其进行转换。在此期间,MMU 检查页表中是否存在请求的页表,如果没有,则 OS 从辅助存储中获取并更新页表。

问题4:

假设一个进程从一个地址请求数据,该地址被转换为一个已经有一些数据的物理地址。怎么知道数据不属于请求者进程而应该替换为二级存储中的数据?

例如,有脏位用于是否将该页面写回硬盘,但我认为这不是决定所有者进程的因素。

0 投票
1 回答
109 浏览

windows - 不同区域有相同的分配地址

我检查了 Windows 7 中进程的地址空间。我使用VirtualQueryEx函数,这是我的示例的一部分,handleOfProcess_某些进程的句柄在哪里:

当我进行调试时,我看到0x00020000AllocationBase0x00020000,而0x000210000x00000000 这是另一个区域的。AllocationbaseallocationBase

怎么会发生?

谢谢大家。

0 投票
2 回答
931 浏览

windows - 为什么不能从具有 PAGE_GUARD 保护的块中读取数据?

我使用 ReadProcessMemory 函数从地址空间读取数据。我尝试从所有具有 MEM_PRIVATE 类型的块中读取。但是当该块具有 PAGE_GUARD 保护时,我得到错误(函数返回 0),为什么?

谢谢大家。

0 投票
0 回答
193 浏览

c++ - 如何将 PE 映像中的所有虚拟地址 (VA) 映射到相对 VA

我想使用 Win32 C++ API 将模块的图像(加载到进程的内存中)读入缓冲区。阅读后,我想将缓冲区中的所有 VA 更改为 RVA。

ImageRvaToVa在 MSDN 上找到了该功能,但是,我需要反向映射,即ImageVaToRva,我需要将它应用于给定图像内的所有 VA。但是,我找不到这样的功能或类似的功能。Win32中是否存在这样的功能?

做我想做的一种方法是解析.reloc图像的部分。但是,我没有找到任何直接的方法来做到这一点。是否有任何可以轻松解析该.reloc部分的 Win32 API 函数?

对于解决此问题的方法的任何其他建议将不胜感激。

0 投票
1 回答
500 浏览

windows - PE header and LARGEADDRESSAWARE not evaluated for DLL modules?

In the PE header there's a flag to indicate whether the binary is LargeAddressAware or not.
The PE header itself exists for both, *.exe and *.dll.

Is it really the case that Windows OS evaluates this flag for the parent executable, only?
Is it completely ignored for all DLL modules?

So why should i enable the LAA linker flag for DLLs if nobody is evaluating it?

I was having the following in mind:
Is there a way to force Windows issue a warning in case a LAA enabled exe loads a module that is not compiled as being LAA?

Also see related question: Drawbacks of using /LARGEADDRESSAWARE for 32 bit Windows executables?

0 投票
2 回答
6673 浏览

architecture - 32 v/s 64 位架构 - 虚拟地址空间

我正在参加一个操作系统课程,其中讲师提到了 32 v/s 64 位架构。

我对我的架构类的这种差异的理解是 32 位与 64 位表示 CPU 字长、寄存器大小以及 ALU 可以执行计算的大小。

导师说:“今天使用的是 64 位架构,所以进程的虚拟地址空间大小是 64 位。”

请问32位v/s 64位是否也表示一个进程的虚拟地址空间大小是否是32位v/s 64位?如果不是,虚拟地址空间大小是否对架构类型(32 位/64 位)有任何依赖性。

0 投票
1 回答
2256 浏览

windows - x86 LargeAddressAware 兼容性的单元测试

对于 win32 可执行文件 (x86),我们可以设置 LargeAddressAware 标志,以便它在 x64 Windows 上运行时可以访问 4 GB(而不仅仅是 2 GB)的虚拟地址空间。
这看起来非常吸引人。但是,也存在风险。
例如,请参阅:对 32 位 Windows 可执行文件使用 /LARGEADDRESSAWARE 的缺点?

因此,让我们继续配置正在执行一些单元测试的系统,并将系统范围的注册表开关AllocationPreference设置为MEM_TOP_DOWN.
应该这样做,不是吗?

它没有!
问题是 Visual Studio 的 x86“测试运行器”(执行引擎)本身没有启用 LAA。
这个父进程只会看到“较低”的 2 GB 的 VAS,我们要测试的模块也是如此。

来自 VS2013.1 的示例

  • mstest.exe产卵QTAgent32.exe
  • vstest.console.exe产卵vstest.executionengine.x86.exe

它们都没有启用 LAA!

那么使用启用 LAA 的 x86 测试运行器的推荐方法是什么?


这是一个小代码片段(VS 单元测试,csharp)来检查 LAA 执行环境。
除非它成功,否则您的测试环境适合让您的一组单元测试(也)涵盖与 LAA 的兼容性:

0 投票
1 回答
30 浏览

windows - 为什么地址空间的私有区域中有这么多零字节?

我正在检查windows下进程的地址空间。当我看到私有区域的内容时,我想知道,因为有很多零字节(在某些区域超过 95%)。如果在应用程序运行时没有使用更多的私有区域,为什么它们不仅是保留的或免费的?

谢谢大家。

0 投票
1 回答
122 浏览

linux - 如何通过 ring 0 虚拟内存访问 pte?

有人可以指点我有关内核如何将进程页表映射到内核空间的代码或一些资源吗?

这在 32 位和 64 位(在 x86 和 x86_64 处理器上)如何工作?内核如何设置通过内核虚拟地址访问的进程和内核的页表?

似乎有鸡和蛋的问题。您需要内核中的虚拟地址来访问物理页面,但是您需要为此设置页表条目,该条目是使用虚拟地址设置来访问物理页面的。