1. 程式人生 > 其它 >關於windows記憶體管理機制

關於windows記憶體管理機制

完整的

https://blog.csdn.net/vsooda/article/details/8992446

1.程序地址空間

1.1地址空間

·32|64位的系統|CPU

作業系統執行在硬體CPU上,32位作業系統運行於32位CPU上,64位作業系統運行於64位CPU上;目前沒有真正的64位CPU。

32位CPU一次只能操作32位二進位制數;位數多CPU設計越複雜,軟體設計越簡單。

軟體的程序運行於32位系統上,其定址位也是32位,能表示的空間是232=4G,範圍從0x0000 0000~0xFFFF FFFF。

·NULL指標分割槽

範圍:0x0000 0000~0x0000 FFFF

作用:保護記憶體非法訪問

例子:分配記憶體時,如果由於某種原因分配不成功,則返回空指標0x0000 0000;當用戶繼續使用比如改寫資料時,系統將因為發生訪問違規而退出。

那麼,為什麼需要那麼大的區域呢,一個地址值不就行了嗎?我在想,是不是因為不讓8或16位的程式運行於32位的系統上呢?!因為NULL分割槽剛好範圍是16的程序空間。

·獨享使用者分割槽

範圍:0x0001 0000~0x7FFE FFFF

作用:程序只能讀取或訪問這個範圍的虛擬地址;超越這個範圍的行為都會產生違規退出。

例子:

程式的二進位制程式碼中所用的地址大部分將在這個範圍,所有exe和dll檔案都載入到這個。每個程序將近2G的空間是獨享的。

注意:如果在boot.ini上設定了/3G,這個區域的範圍從2G擴大為3G:0x0001 0000~0xBFFE FFFF。

·共享核心分割槽

範圍:0x8000 0000~0xFFFF FFFF

作用:這個空間是供作業系統核心程式碼、裝置驅動程式、裝置I/O快取記憶體、非頁面記憶體池的分配、程序目表和頁表等。

例子:

這段地址各程序是可以共享的。

注意:如果在boot.ini上設定了/3G,這個區域的範圍從2G縮小為1G:0xC000 0000~0xFFFF FFFF。

通過以上分析,可以知道,如果系統有n個程序,它所需的虛擬空間是:2G*n+2G (核心只需2G的共享空間)。