2012-03-29 125 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