天天看點

第九章-----虛拟記憶體

第九章-----虛拟記憶體

       為了更有效地管理記憶體并且少出錯,現代系統提供了一種對主存的抽象概念,叫做虛拟記憶體(VM)。虛拟記憶體是硬體異常、硬體位址翻譯、主存、磁盤檔案和核心軟體的俺沒互動,它為每個程序提供了一個大的、一緻的和私有的位址空間。通過一個很清晰的機制,虛拟位址記憶體提供了三個重要的能力:          ● 它将主存看成是一個存儲在磁盤上的位址空間的高速緩存,在主存中隻儲存活動區域,并根據需要在磁盤和主存之間來回傳送資料,通過這種方式,它高效地使用了主存。        ● 它為每個程序提供了一緻的位址空間,進而簡化了記憶體管理。        ● 它保護了每個程序的位址空間不被其他程序破壞。 1.實體和虛拟位址        計算機系統的主存被組織成一個由M個連續的位元組大小的單元組成的數組。每位元組都有一個唯一地實體位址(Physical Address, PA)。第一個位元組的位址為0,接下來的位元組位址為1,再下一個為2,以此類推。給這種簡單的結構,CPU通路記憶體的最自然的方式就是使用實體位址。我們把這種方式稱為實體尋址。        早期的PC使用實體位址,而且諸如數字信号處理器、嵌入式微控制器以及Cray超級計算機這樣的系統仍然繼續使用這種尋址方式。然而現代處理器使用的是一種稱為 虛拟尋址的尋址形式。如下圖:        

第九章-----虛拟記憶體

       使用虛拟尋址,CPU通過生成一個虛拟位址(Virtual Address, VA)來通路主存,這個虛拟位址在被送到記憶體之前先轉換成适當的實體位址。将一個虛拟位址轉換為實體位址的任務叫做 位址翻譯。就像異常處理一樣,位址翻譯需要CPU硬體和作業系統之間的緊密合作。CPU晶片上叫做記憶體管理單元(Memory Management Unit, MMU)的專用硬體,利用存放在主存中的查詢表來動态翻譯虛拟位址,該表的内容由作業系統管理。 2.虛拟記憶體作為緩存的工具       概念上而言,虛拟記憶體被組織為一個由存放在磁盤上的N個連續的位元組大小的單元組成的數組。每位元組都有一個唯一地虛拟位址,作為到數組的索引。磁盤上數組的内容被緩存在主存中。和存儲器層次結構中其它緩存一樣,磁盤(較低層)上的資料被分割成塊,這些塊作為磁盤和主存(較高層)之間的傳輸單元。VM系統通過将虛拟記憶體分割為稱為虛拟頁(Virtual Page, VP)的大小固定的塊來處理這個問題。每個虛拟頁的大小為

第九章-----虛拟記憶體

位元組。類似地,實體記憶體被分割為實體頁(Physical Page,PP),大小也為P位元組(實體頁也被稱為頁幀)。       一個位址空間的大小由表示最大位址所需要的位數來描述的。例如,一個包含N=

第九章-----虛拟記憶體

個位址虛拟位址空間就叫做一個n位位址空間。現代系統通常支援32位或者64位虛拟位址空間。       在任意時刻,虛拟頁面的集合都分為三個不想交的子集:        ● 未配置設定的:VM系統還未配置設定(或者建立)的頁。未配置設定的塊沒有任何資料和它們相關聯,是以也就不占用任何磁盤空間。       ● 緩存的:目前已緩存在實體記憶體中的已配置設定頁。       ● 未緩存的: 未緩存在實體記憶體中的已配置設定頁。 3.DRAM緩存的組織結構       在存儲層次結構中,DRAM緩存的位置對它的組織結構有很大的影響。回想一下,DRAM比SRAM要慢大約10倍,而磁盤要比DRAM慢大約100 000多倍。一次DRAM緩存中的不命中比起SRAM緩存中的不命中要昂貴的多,這是因為DRAM緩存不命中要由磁盤來服務,而SRAM緩存不命中通常是由基于DRAM的主存來服務的。而且,從磁盤的第一個扇區讀取第一個位元組的時間開銷比起讀這個扇區中連續的位元組慢大約100 000倍。       因為大的不命中處罰和通路第一個位元組的開銷,虛拟頁往往很大,通常是4KB~2MB。 4.頁表       同任何緩存一樣,虛拟記憶體系統必須有某種方法來判定一個虛拟頁是否緩存在DRAM中的某個地方。如果是,系統還必須确定這個虛拟頁存放在哪個實體頁。如果不命中,系統必須判斷這個虛拟頁存放在磁盤的哪個位置,在實體記憶體中選擇一個犧牲頁,并将虛拟頁從磁盤複制到DRAM中,替換這個犧牲頁。       這些功能是由軟硬體聯合提供的,包括作業系統軟體、MMU(記憶體管理單元)中的位址翻譯硬體和一個存放在實體記憶體中叫做頁表的資料結構,頁表将虛拟頁映射到實體頁。每次位址翻譯硬體将一個虛拟位址轉換為實體位址時,都會讀取頁表。作業系統負責維護頁表内容,以及在磁盤與DRAM之間來回傳送頁。       下圖展示了一個頁表的基本組織結構。頁表就是一個頁表條目(Page Table Entry, PTE)的數組。虛拟位址空間中的每個頁中一個固定偏移量處都有一個PTE。假設每個PTE都由一個有效位和一個n位位址字段組成的。有效位表明了該虛拟頁目前是否被緩存在DRAM中。如果設定了有效位,那麼位址字段就表示DRAM中相應的實體頁的起始位址。如果沒有設定有效位,那麼一個空位址表示這個虛拟頁還未配置設定。否則,這個位址就指向該虛拟頁在磁盤上的起始位置。       

第九章-----虛拟記憶體

     上圖展示了一個有8個虛拟頁和4個實體頁的系統的頁表。四個虛拟頁(VP1、VP2、VP4和VP7)目前被緩存在DRAM中。兩個頁(VP0和VP5)還未被配置設定,而剩下的頁(VP3和VP6)已經被配置設定了,但是目前還未被緩存。       ● 頁命中       考慮一下當CPU想要讀包含在VP2中的虛拟記憶體的一個字時會發生什麼,VP2被緩存在DRAM中。使用位址翻譯技術,位址翻譯硬體将虛拟位址作為一個索引來定位PTE2,并從記憶體中讀取它。因為設定了有效位,那麼位址翻譯硬體就知道VP2是緩存在記憶體中的了。是以它使用PTE中的實體記憶體位址(該位址指向PP1中緩存頁的起始位置),構造出這個字的實體位址。        

第九章-----虛拟記憶體

       ● 缺頁        在虛拟記憶體的習慣說法中,緩存不命中稱為缺頁。下圖展示了在缺頁之前我們的示例頁表的狀态。CPU引用了VP3中的一個字,VP3并未緩存在DRAM中。位址翻譯硬體從記憶體中讀取PTE3,從有效位推斷出VP3未被緩存,并且觸發一個缺頁異常。缺頁異常調用核心中的缺頁異常處理程式,該程式會選擇一個犧牲頁,在此例中就是存放在PP3中的VP4。如果VP4已經被修改了,那麼核心就會将它複制回磁盤。無論哪種情況,核心都會修改VP4的頁表條目,反映出VP4不再還存在主存中這一事實。        

第九章-----虛拟記憶體

       接下來,核心從磁盤複制VP3到記憶體中的PP3,更新PTE3,随後傳回。當異常處理程式傳回時,它會重新啟動導緻缺頁的指令,該指令會把導緻缺頁的虛拟位址重發送到位址翻譯硬體。但是現在,VP3已經緩存在主存中了,那麼頁命中也能由位址翻譯硬體正常處理了。下圖展示了在缺頁之後我們的示例頁表的狀态。        

第九章-----虛拟記憶體

5.位址翻譯        形式上來說,位址翻譯是一個N元素的虛拟位址空間(VAS)的元素和一個M元素的實體位址空間(PAS)中元素之間的映射,                                                             

第九章-----虛拟記憶體

       這裡               

第九章-----虛拟記憶體

      下圖展示了MMU如何利用頁表來實作這種映射。CPU中的一個控制寄存器,頁表基址寄存器(Page Table Base Register, PTRB)指向目前頁表。n位的虛拟位址包含兩個部分:一個p位的虛拟頁面偏移(Virtual Page Offset, VPO)和一個(n-p)位的虛拟頁号(Virtual Page Number, VPN)。MMU利用VPN來選擇适當的PTE。例如,VPN 0選擇PTE 0,VPN 1選擇PTE 1,以此類推。将頁表條目中實體頁号(Physical Page Number,PPN)和虛拟位址中的VPO串聯起來,就得到相應的實體位址。        

第九章-----虛拟記憶體

          ● 多級頁表          用來壓縮頁表的常用方法是使用層次結構的頁表。用一個具體的示例是最容易了解這個思想的。假設32位虛拟位址空間被配置設定位4KB的頁,而每個頁表條目都是4位元組。還假設在這一時刻,虛拟位址空間有如下形式:記憶體的前2K個頁面配置設定給了代碼和資料,接下來6K個頁面未配置設定,再接下來的1023個也未配置設定,接下來的1個頁面配置設定給了使用者棧。下圖展示了如何為虛拟空間構造一個兩級也表層次結構:         

第九章-----虛拟記憶體

6.Linux虛拟記憶體區域         下圖記錄了一個程序中虛拟記憶體區域的核心資料結構。核心為系統中的每個程序維護一個單獨的任務結構(源代碼中的task_struct)。任務結構中的元素包含或者指向核心運作該程序所需要的所有資訊(例如,PID、指向使用者棧的指針、可執行目标檔案的名字,以及程式計數器)。        

第九章-----虛拟記憶體

      任務結構中的一個條目指向mm_struct,它描述了虛拟記憶體的目前狀态。我們感興趣的兩個字段是pgd和mmap,其中pgd指向第一級頁表(頁全局目錄)的基址,而mmap指向一個vm_area_structs(區域結構)的連結清單,其中每個vm_area_structs都描述了目前虛拟位址空間的區域。當核心運作這個程序時,就将pgd存放在CR3控制寄存器中。       一個具體區域結構包含下面的字段:       ●   vm_start: 指向這個區域的起始處。       ●  vm_end: 指向這個區域的結束處。      ●  vm_prot: 描述這個區域内包含的所有頁的讀寫許可權限。      ●  vm_flags:描述這個區域内的頁面是與其他程序共享的,還是這個程序私有的(還描述了其他一些資訊)。      ●  vm_next: 指向連結清單中的下一個區域結構。 7.記憶體映射      Linux通過将虛拟記憶體區域與磁盤上的對象關聯起來,以初始化這個虛拟記憶體區域的内容,這個過程稱為記憶體映射。

繼續閱讀