一:程序虛拟位址空間的實作
每個程序都有一個私有的虛拟位址空間
系統将每個程序的虛拟位址空間映射到實體記憶體上
為了實作每個程序都有一個私有的虛拟位址空間系統為每個程序都建立了一個頁目錄和一組頁表
每個程序的頁表是獨立的
而核心空間的頁表是所有程序共享的
X86平台上有一個CR3寄存器,該寄存器儲存目前運作的程序的頁目錄位址
系統進行程序切換時,會将CR3内的位址置為将要執行的程序的頁目錄位址
每個程序都有一個KPROCESS結構的屬性,其中包括了程序頁目錄位址
二:資料共享與保護
有一些程序間共享的資料,系統的可執行代碼(系統DLL)等,在各個程序間都是一緻的
由此可得:不同程序的虛拟記憶體分頁可以映射為相同的實體記憶體分頁
如果多個程序同時向一個DLL檔案寫入資料怎麼辦?
系統是通過Copy-On-Write實作資料保護的
1.程序将某個系統DLL加載入程序記憶體空間
2.開始對該DLL進行寫操作
3.作業系統監視到寫操作将要進行
4.系統将程序虛拟記憶體分頁映射到另一個新的實體記憶體分頁(此分頁是不共享的)
5.系統将DLL的内容也映射到這個新的實體記憶體分頁
6.在新的實體記憶體分頁上完成寫操作
這樣就不會影響到其他程序通路該DLL了
三:虛拟記憶體布局、分工、堆和棧
虛拟記憶體空間分兩部分,低2G由應用程式使用,高2G由系統核心使用
應用程式使用的虛拟記憶體空間分為 代碼,資料(全局變量),系統和使用者DLL的代碼,各線程的棧,堆等
程序的每個線程都有自己的棧
棧與函數的調用,執行和傳回 局部變量的儲存相關
堆是一種可以動态配置設定和釋放的記憶體
記憶體配置設定函數都是通過堆進行配置設定記憶體的
四:總結
虛拟位址空間中的資料是分頁管理的
應用程式不用考慮系統中其他應用程式使用記憶體的情況
虛拟位址并不是實體位址空間中的位址
如果系統中沒有足夠的實體記憶體供使用,那麼作業系統會将目前沒有使用的記憶體分頁排程到硬碟上儲存起來,應用程式不用關心系統怎麼實作排程的