win32 006 Windows的內存管理機制

Win32基礎知識3

 

讓編程改變世界

Change the world by program


 

Windows的內存管理機制

 

在這一節中,我們需要通過學習解決兩大疑問:

Win32彙編中,每個程序都可以用4GB的內存嗎?

Win32彙編源代碼中爲什麼看不到CS, DS, ES 和 SS 等段寄存器的使用?

 

DOS操作系統的內存安排

Win32編程相對於 DOS編程最大的區別之一就是內存的使用問題。

先來回顧一下DOS操作系統的內存使用,DOS操作系統運行於實模式中,內存安排如圖:

DOS 操作系統的內存安排

 

我們看到,由於8086處理器的尋址範圍只有可憐的1 MB 大小,當時系統硬件使用的存儲器地址被安排在高端。

地址是從A0000h(即640 KB)開始的384 KB中,其中有用於顯示的視頻緩衝區和BIOS的地址空間。

 

而在內存低端,安排了中斷向量表和BIOS數據區。

剩下從500h開始到A0000h總共不到640KB的內存是操作系統和應用程序所能夠使用的。

應用程序不可能使用這640 KB以外的內存。

這就是著名的“640KB限制”。

 

而即使在這640KB中,DOS操作系統又佔領了低端的一部分內存,最後剩下600KB左右的內存纔是應用程序真正可以用的。

如果系統中有內存駐留程序存在,那麼應用程序還要和這些TSR程序共同分享這段內存空間。

註釋:TSR 即(Terminate and Stay Resident)原意是停止並駐留,指的是內存駐留程序。

 

80386的內存尋址機制

 

Windows的內存管理和DOS的內存管理有很大的不同,在瞭解Windows的內存管理模式之前,需要對80386保護模式下內存分頁機制有所瞭解。

爲了做個對比,先來看實模式下的內存尋址方式:在實模式下,一個完整的地址由段地址和偏移地址兩部分組成。

處理器換算時先將段地址乘以10h,得到段在物理內存中的起始地址,然後加上16位的偏移地址得到實際的物理地址。

 

現在我們談回到80386處理器的工作模式:

當80386處理器工作在保護模式和虛擬8086模式的時候,可以使用全部32根地址線訪問4 GB大的內存。段地址加偏移地址的計算方法顯然無法覆蓋這麼大的範圍。

但計算一下就可以發現,實際上和8086同樣的限制已經不復存在,因爲80386所有的通用寄存器都是32位的,2^32 == 4G,所以用任何一個通用寄存器來間接尋址,不必分段就已經可以訪問到所有的內存地址。

發佈了49 篇原創文章 · 獲贊 18 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章