1、用戶編制程序時使用的地址稱為虛地址或邏輯地址,其對應的存儲空間稱為虛存空間或邏輯地址空間;而計算機物理內存的訪問地址則稱為實地址或物理地址,其對應的存儲空間稱為物理存儲空間或主存空間。
2、虛擬存儲器的容量限制:主存容量+輔存(硬盤)容量。
3、物理內存:在應用中,真實存在的,插在主板內存槽上的內存條的容量的大小。從本質上來說,物理內存是代碼和數據在其中運行的窗口。
4、虛擬內存:使程序認為它擁有連續的可用的內存(一個連續完整的地址空間),而實際上,它通常是被分隔成多個物理內存碎片,還有部分暫時存儲在外部磁盤存儲器上,在需要時進行數據交換。
若計算機運行程序或操作所需的隨機存儲器(RAM)不足時,則 Windows 會用虛擬存儲器進行補償,即拿出一部分硬盤空間來充當內存使用,這部分空間即稱為虛擬內存,虛擬內存在硬盤上的存在形式就是 PAGEFILE.SYS這個頁面文件。它將計算機的RAM和硬盤上的臨時空間組合。將數據移入分頁文件可釋放RAM,以便完成工作。
若計算機的速率由於RAM可用空間匱乏而減緩,則可嘗試通過增加虛擬內存來進行補償。但是,計算機從RAM讀取數據的速率要比從硬盤讀取數據的速率快,因而擴增RAM容量(可加內存條)是最佳選擇。
分頁文件:硬盤上一個或者多個隱藏文件pagefile.sys,Windows用於存儲未存入內存的部分程序和數據文件。頁面文件和物理內存或隨機存取內存(RAM)構成了虛擬內存。Windows會根據需要將數據從頁面文件移至內存,或將數據從內存移至頁面文件以便為新數據釋放內存。也叫“交換文件”。
5、虛存的訪問過程:
虛存空間的用戶程序按照虛地址編程並存放在輔存(硬盤)中。程序運行時,由地址變換機構依據當時分配給該程序的實地址空間把程序的一部分調入實存。每次訪存時,首先判斷該虛地址所對應的部分是否在實存中。如果是,則進行地址轉換並用實地址訪問主存;否則,按照某種算法將輔存中的部分程序調度進內存,再按同樣的方法訪問主存。由此可見,每個程序的虛地址空間可以遠大於實地址空間,也可以遠小於實地址空間。前一種情況以提高存儲容量為目的,后一種情況則以地址變換為目的。后者通常出現在多用戶或多任務系統中:實存空間較大,而單個任務並不需要很大的地址空間,較小的虛存空間則可以縮短指令中地址字段的長度。
6、引入虛擬存儲技術的好處:
可在較小的可用內存中執行較大的用戶程序;
可在內存中容納更多程序並發執行;
不必影響編程時的程序結構(與覆蓋技術比較);
提供給用戶可用的虛擬內存空間通常大於物理內存。
7、虛擬地址:
如果CPU寄存器中的分頁標志位被設置,那么執行內存操作的機器指令時,CPU會自動根據頁目錄和頁表中的信息,把虛擬地址轉換成物理地址,完成該指令。比如 mov eax,004227b8h ,這是把地址004227b8h處的值賦給寄存器的匯編代碼,004227b8這個地址就是虛擬址。CPU在執行這行代碼時,發現寄存器中的分頁標志位已經被設定,就自動完成虛擬地址到物理地址的轉換,使用物理地址取出值,完成指令。對於Intel CPU 來說,分頁標志位是寄存器CR0的第31位,為1表示使用分頁,為0表示不使用分頁。對於初始化之后的 Win2k 我們觀察 CR0 ,發現第31位為1。表明Win2k是使用分頁的。
使用了分頁機制之后,4G的地址空間被分成了固定大小的頁,每一頁或者被映射到物理內存,或者被映射到硬盤上的交換文件中,或者沒有映射任何東西。對於一般程序來說,4G的地址空間,只有一小部分映射了物理內存,大片大片的部分是沒有映射任何東西。物理內存也被分頁,來映射地址空間。對於32bit的Win2k,頁的大小是4K字節。CPU用來把虛擬地址轉換成物理地址的信息存放在叫做頁目錄和頁表的結構里。
8、物理內存分頁:
一個物理頁的大小為4K字節,第0個物理頁從物理地址 0x00000000 處開始。由於頁的大小為4KB,就是0x1000字節,所以第1頁從物理地址0x00001000 處開始。第2頁從物理地址 0x00002000 處開始。可以看到由於頁的大小是4KB,所以只需要32bit的地址中高20bit來尋址物理頁。
頁表:一個頁表的大小為4K字節(32bit),放在一個物理頁中。由1024個4字節的頁表項組成。頁表中的每一項的內容(每項4個字節,32bit)高20bit用來放一個物理頁的物理地址,低12bit放着一些標志。
頁目錄:一個頁目錄大小為4K字節(32bit),放在一個物理頁中。由1024個4字節的頁目錄項組成。頁目錄中的每一項的內容(每項4個字節)高20bit用來放一個頁表的物理地址,低12bit放着一些標志。
9、對於x86系統(32bit),頁目錄的物理地址放在CPU的CR3寄存器中。
一個虛擬地址轉換成物理地址的計算過程就是:處理器通過CR3找到當前頁目錄所在物理頁,取虛擬地址的高10bit,然后把這10bit左移2bit(因為每個頁目錄項4個字節長,左移2bit相當於乘4)得到在該頁中的地址,取出該地址處PDE(4個字節),就找到了該虛擬地址對應頁表所在物理頁,取虛擬地址第12位到第21位這10位,然后把這10bit左移2bit(因為每個頁表項4個字節長,左移2bit相當於乘4)得到在該頁中的地址,取出該地址處的PTE(4個字節),就找到了該虛擬地址對應物理頁的地址,最后加上12bit的頁內偏移得到了物理地址。
10、32bit的一個指針,可以尋址范圍0x00000000-0xFFFFFFFF,4GB大小。也就是說一個32bit的指針可以尋址整個4GB地址空間的每一個字節。一個頁表項負責4K的地址空間和物理內存的映射,一個頁表1024項,也就是負責1024*4k=4M的地址空間的映射。一個頁目錄項,對應一個頁表。一個頁目錄有1024項,也就對應着1024個頁表,每個頁表負責4M地址空間的映射。1024個頁表負責1024*4M=4G的地址空間映射。一個進程有一個頁目錄,所以以頁為單位。頁目錄和頁表可以保證4G的地址空間中的每頁和物理內存的映射。
11、每個進程都有自己的4G地址空間,從 0x00000000-0xFFFFFFFF 。通過每個進程自己的一套頁目錄和頁表來實現。由於每個進程有自己的頁目錄和頁表,所以每個進程的地址空間映射的物理內存是不一樣的。兩個進程的同一個虛擬地址處(如果都有物理內存映射)的值一般是不同的,因為他們往往對應不同的物理頁。
====================================================
虛擬內存:
1.每個進程都有各自獨立的4G 字節的虛擬地址空間。4G的進程空間分為兩部分,0~3G-1 為用戶空間,3G~ 4G-1 為內核空間。
2.用戶程序中使用的都是虛擬地址空間中的地址,永遠無法直接訪問實際物理地址。
3.虛擬內存到物理內存的映射由操作系統動態維護。
4.虛擬內存一方面保護了操作系統的安全,另一方面允許應用程序使用比實際物理內存更大的地址空間。
5.用戶空間中的代碼不能直接訪問內核空間中的代碼和數據,但是可以通過系統調用進入內核態,間接地與內核交互。
6.對內存的越權訪問,或訪問未建立映射的虛擬內存(野指針、不在映射表中),將會導致段錯誤。
7. 用戶空間對應進程,進程一切換,用戶空間隨即變換。
內核空間由操作系統內核使用,不會隨進程切換而變化。
內核空間由內核根據獨立且唯一的頁表init_mm.pgd 進行映射,而用戶空間的頁表則每個進程一份。
8. 每個進程的內存空間完全獨立,因此在不同進程之間交換虛擬地址毫無意義。
9.虛擬內存到物理內存的映射,以頁(4096字節)為單位。