Win32基礎知識3
讓編程改變世界
Change the world by program
Windows的內存管理機制
在這一節中,我們需要通過學習解決兩大疑問:
Win32彙編中,每個程序都可以用4GB的內存嗎?
Win32彙編源代碼中爲什麼看不到CS, DS, ES 和 SS 等段寄存器的使用?
DOS操作系統的內存安排
Win32編程相對於 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,所以用任何一個通用寄存器來間接尋址,不必分段就已經可以訪問到所有的內存地址。