2012-01-26 47 views
5

所以我正在玩Olly調試器,嗅探我還可以找出有關窗口的內容,然後按下M按鈕,彈出內存映射窗口。所以我搜索了一些關於這個主題的文章,我發現我實際上可以寫入64K以上的地址,我嘗試了很好,爲什麼它不起作用。關於那些較低的2GB空間:窗口進程內存佈局

  • 爲什麼有這些差距?例如,有0x10000-0x1FFFF R/Wable空間,然後有128K沒有,然後一些只是可讀的空間。我的意思是這已經是分頁的權利,所以在物理空間中是否有過去的東西(不提到0x20000-0x40000應該完全可以反轉),爲什麼有人會決定不要隨意使用一些地址空間? 很可能我只是感到困惑,因爲在olly調試器的內存映射中,很多行在列中顯示爲'Contains'時被留空。有沒有可能我可以從olly對這個內存映射的一些參考,並找出什麼空間有什麼目的,因此是或不是這樣的頁面?

  • 假設我真的不會在內存管理方面搞點什麼,可以使用低內存而不是使用堆來編寫windows程序,還是可以遇到一些問題?

感謝您閱讀此問題。

編輯

here我們去在0x10000什麼那可能也是爲什麼頁面讓寫。

+1

在操作系統上學習:) – Adrian

+0

嗯..這就是我想用這個:) – Pyjong

+0

關於你的最後一個問題......我懷疑你可以寫保護內存。它的位置取決於操作系統。因此,閱讀更多有關製作操作系統的知識,然後閱讀ab如何映射其內存(我認爲自從您提到Olly以來就贏了) – Adrian

回答

1

並非所有內存都可供應用程序使用。例如,某些類型的硬件需要內存,因此係統(BIOS或OS)將分配一塊物理內存,並讓硬件自行管理。該內存可能無法直接讀取(或可寫),因爲執行此類操作會影響硬件。硬件本身可能有自己的限制,它可以使用什麼內存範圍。

如果你在Windows中,你不能寫入任意的內存位置 - 操作系統不會讓你(在用戶模式至少),並且無論如何都會分頁,所以你認爲你的地址'重新看(虛擬地址)將不會匹配實際的物理內存地址。

一般情況下,您只應讀取和寫入由操作系統請求並分配給您的內存。

+0

是的,它可能是分頁內存,這就是爲什麼我不明白爲什麼像這樣的地圖,而不是連續的虛擬內存塊。 – Pyjong

+0

@stupid_idiot可能是碎片;也許MS決定在他們的算法中這樣做 – Adrian

3

您似乎沒有專注的問題,因此很難提供有價值的答案。但是,您似乎暗示了這個問題Windows如何映射用戶空間內存?

首先,低虛擬內存空間—從零到64K或更多—未分配以捕獲基於NULL的指針解引用。這些是我們想要立即知道的常見編程錯誤。該程序幾乎肯定會在發生時終止。通過保留這個空間未映射,Windows的等效SEGFAULT發生。很有用。

通常,接下來分配代碼和常量空間。一旦程序開始運行,通常不需要更改這個空間,所以它被設置爲只讀,並且它的一部分通常被標記爲可執行的第一部分,其可以是空間的99%。如果共享代碼庫,那麼這些代碼庫通常會在主代碼之後(通常)映射到,通常會有小的間隔,以便庫代碼段與頁面對齊(可能爲4K,可能是64K或更大),以實現高效的內存管理寄存器使用。很少需要保存虛擬內存空間。

之後是數據空間。這可以是初始化的內存,也可以是未初始化的。這一切都必須是可讀寫的。而且它需要在其上面保留空間,以便它可以爲堆空間增長而增長。

上面的數據空間的方式是堆棧空間。它必須是可讀寫的,並且在以下有的空間,因此它可以增長。所有現代CPU堆棧都向低內存方向發展。

並且在堆棧之上是系統空間。

如果進程請求訪問共享內存(使用其他進程),則映射窗口的大小決定了它可以放在內存映射中的哪個位置。映射太靠近堆增長的地方是一個問題,太靠近潛在的堆棧增長也是一個問題。幸運的是,相當簡單的放置算法可以爲絕大多數程序解決這個問題。只要想想各種需求,你就可以弄清楚爲什麼操作系統要做它的工作。