2012-03-29 32 views
0

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

我读过的地方是,Windows(32位)中的每个进程都有自己的4 GB内存 - 这要归功于交换到磁盘。但32位Windows可以使用最大4 GB。所以我认为每个进程只“认为”它有4 GB,但实际上它少了。 我正确吗?

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

有人可以进一步解释这一点吗?也许指点我一些好文章。

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

+0

不要混淆地址空间和物理内存数量。 – Joey 2012-03-29 11:35:18

回答

1

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

在32位Microsoft Windows的每个进程具有能够处理高达4G内存自身的虚拟地址空间。 [...]

+0

如何知道地址是虚拟的还是物理的?你可以给我一个例子在ASM?例如。 JMP XXX或CALL XXX - 我怎么知道XXX是什么内存? 或者我只是想念一些东西。如果我想从我的程序加载到ImageBase 0x400000的DLL中访问函数,该函数也是在0x400000加载的,该怎么办? – Samuel 2012-03-29 12:30:13

+0

用户模式应用程序不直接处理物理内存。在asm或不是,你只是使用你知道的地址。也就是说,你从VirtualAlloc获得了一个指针 - 你可以使用它。操作系统和内核模式组件将虚拟地址映射为真实内存。你不能只打未知的[内存]地址,并期望它以某种方式工作。 – 2012-03-29 13:35:57

+0

好的,我明白了。但是我怎样才能访问另一个进程的内存呢?或DLL的?是否再次将DLL加载到使用它的每个进程中?如果我的应用使用例如Kernel32.dll(几乎总是在Windows上使用)是否可以访问我应用程序的虚拟地址空间或其他地址?有没有共享的地址空间?为每个进程加载相同的DLL xxx次似乎毫无意义。 – Samuel 2012-03-29 14:22:04