【问题标题】:Windows memory managementWindows 内存管理
【发布时间】:2012-03-29 11:30:08
【问题描述】:

我对 Windows 内存管理有点困惑。

我在某处读到,Windows(32 位)中的每个进程都有自己的 4 GB 内存——这要归功于交换到磁盘。但是 32 位 Windows 最多可以使用 4 GB。所以我认为每个进程只“认为”它有 4 GB,但实际上它有更少。 我说的对吗?

那么我怎样才能从一个进程访问数据到另一个进程呢?如果在 0x400000 处加载了 2 个 PE,我该怎么做?你能给我举个 C 或 ASM 的例子吗?

有人可以进一步向我解释一下吗?也许给我一些好文章。

简单的描述就足够了:)。 谢谢。

【问题讨论】:

  • 不要混淆地址空间和物理内存量。

标签: windows memory memory-management


【解决方案1】:

进程最多可以寻址 4 GB 的地址,这些地址由“真实”内存支持或不支持。 Windows 操作系统,即使是 32 位,也可以寻址超过 4 GB,但可能有理由限制这个数量,或者限制是由硬件规定的。

32 位 Microsoft Windows 上的每个进程都有自己的虚拟地址空间,最多可以寻址 4 GB 的内存。 [...]

【讨论】:

  • 我如何判断一个地址是虚拟的还是物理的?你能给我一个asm的例子吗?例如。 JMP XXX 或 CALL XXX - 我怎么知道记忆 XXX 是什么?或者,也许我只是错过了一些东西。如果我想从我的程序中访问在 ImageBase 0x400000 处加载的 DLL 中的函数,该程序也在 0x400000 处加载,该怎么办?
  • 用户模式应用程序不直接处理物理内存。无论是否使用 asm,您只需使用您知道的那些地址。也就是说,你从VirtualAlloc 获得了一个指针——你可以使用它。操作系统和内核模式组件为您将虚拟地址映射到真实内存。你不能只是点击未知的[内存]地址并期望它以某种方式工作。
  • 好的,我明白了。但是我怎样才能访问另一个进程的内存呢?还是DLL? DLL 是否再次加载到正在使用它的每个进程中?如果我的应用使用例如Kernel32.dll(几乎总是在 Windows 上使用)我是访问我的应用程序的虚拟地址空间还是另一个应用程序的虚拟地址空间?有共享地址空间吗?为每个进程加载相同的 DLL xxx 次似乎毫无意义。
  • 除非你想写驱动,而且我确定你不会,你可以使用ReadProcessMemory API msdn.microsoft.com/en-us/library/windows/desktop/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 2012-03-21
相关资源
最近更新 更多