1、虛擬內存的基本思想:
每個程序擁有自己的地址空間,這個地址空間被分割成多個塊,每一塊稱作一
頁或頁面。每一頁有連續的地址范圍。這些頁被映射到物理內存,但
並不是所有的頁都在內存中才能運行程序。當程序引用一部分在物理內存中的地址空間時,有硬件立刻執行必要的映射。當程序引用到一部分不在物理內存中的地址空間時,由操作系統負責將缺的部分裝入物理內存並重新的執行失敗的指令。
虛擬內存很適合在多道程序設計系統中使用,許多程序的片段同時保存在內存中。當一個程序等待它的一部分讀入內存時,可以把CPU交給另一個進程使用;
2、分頁
大部分虛擬內存中使用一種
分頁的技術。
由程序產生的這些地址稱為
虛擬地址,他們構成了一個
虛擬地址空間,在使用虛擬內存的情況下,虛擬地址不是被直接送到內存的總線上,而是被送到
內存管理單元(MMU),MMU把虛擬地址映射為物理內存地址;如圖:
圖3-9中例子說明了映射是如何工作的。在例子中有一台可以產生16位地址的計算機,地址的范圍從0-64k,且地址是虛擬地址。然而這台計算機只有32K的物理內存,So 編寫64K的程序,但他們不能完全的調入內存運行。在磁盤上必須有一個可以大到64K的程序核心映像的完全副本,以保證程序片段在需要時被調入內存。
虛擬地址空間按照
固定大小划分稱為
頁面的若干單元。在物理內存中對應的單元稱為
頁框。頁面和頁框的大小通常是一樣的。
圖3-9的標記符號如下:標記0-4K的范圍表示該頁面的虛擬地址或物理地址0-4095,4-8K的范圍表示地址4096-8191,等等。每一頁包含了4096個地址,起始4096的整數倍位置,結束於4096倍數缺1;
3.實現原理:
當程序試圖訪問地址0時,例如執行如下指令:
MOV REG 0
將虛擬地址0送到MMU。MMU看到虛擬地址落在頁面0(0-4095),根據其映像結果,這一頁面對應的是頁框2(8192-12287),因此MMU吧地址變換為8192,並把地址8192送到總線上。內存MMU一無所知,它只看到一個讀或寫地址8192的請求並執行它。MMU從而有效地吧所有從0-4095的虛擬地址映射帶到了8192-12287的物理地址。
4.查看MMU的內部結構及了解MMU是如何工作的:
在下圖會看到一個虛擬地址的例子,虛擬地址8196(二進制是0010000000000100)用圖3-9所示的MMU映射機制,輸入的16位虛擬地址被分為4位的頁面號和12位的偏移量,4位頁號可以表示16個頁面,12位的偏移可以為一個頁內的全部4096個字節的編址。
可用頁號作為表頁的索引,以得出對應的該虛擬頁面的頁框號。如果“在/不在”位是0,則將引起一個操作系統陷阱。如果該位是1,則將在頁表中查到的頁框號復制到輸出寄存器的高3位中,在加上輸入虛擬地址中的低12位偏移量。如此就構成了15位的物理地址。輸出寄存器的內容即被作為物理地址送到內存總線。
5.頁表項的結構:
虛擬頁號可用作頁表的索引,已找到該虛擬頁面對應的頁表項。由頁表項可以找到頁框號。然后把頁框號拼接到偏移量的高位端,以替換掉虛擬頁號,形成送往內存的15位物理地址。
頁表的目的是把虛擬頁面映射為頁框。從數學的角度看,其好比一個函數,輸入為虛擬頁號,輸出為物理頁框號。
不同的計算機頁表項的機構會不同;
最重要的域是
頁框號,畢竟頁映射的目的是找到這個值。
其次是
“在/不在”位,這位是
1時表示該項是有效地,可以使用;如果是
0,則表示該項對應的虛擬頁面現在不在內存中,該頁面會引起
缺頁中斷(到內存中找指定頁面沒有,就會產生缺頁中斷)。
”保護“位指出一個頁允許什么類型的訪問。
為了記錄頁面的使用狀況,引入
”修改位“ 和”訪問位“ 在寫入一頁是由硬件自動的設置修改位。修改位在操作系統重新分配頁框時非常有用。如果一個頁面已經被修改過,則必須要把它寫回磁盤。如果一個頁面沒有被修改過,則只簡單的把它丟棄就可以了,因為它在磁盤上的副本仍然是有效地。
高速緩存禁止位:對那些映射到設備寄存器而不是常規內存的頁面而言,這個特殊性是非常重要的;
6.加速分頁過程:
在任何分頁系統中,都需要考慮兩個問題:
(1) 虛擬地址到物理地址的映射必須非常快;
(2) 如果虛擬地址空間很大,頁表也會很大。
解決的方案:
針對第一個問題:可以用”轉換檢測緩沖區TLB“:
TLB這種方案的建立是基於這樣一種現象:大多數程序總是對少量的頁面進行多次的訪問,而不是相反的。因此,只有很少的頁表會被反復讀取,而且他的頁表項很少被訪問;通過這個方案為計算機設置了一個小型的硬件設備,將虛擬地址直接映射到物理地址,而不是在訪問頁表。這種設備稱為”
轉換檢測緩沖區“.
TLB如何工作:
將一個虛擬地址放入MMU中進行轉換時,硬件首先通過將該虛擬頁號與TLB中所有表項同時(即並行)進行匹配,判斷虛擬頁面是否在其中。如果發現了一個有效的匹配並且要進行的訪問操縱並不違反保護位,則將頁框號直接從TLB中取出而不必再訪問頁表。如果虛擬頁面號確實是在TLB中,但指令試圖在一個只讀頁面上進行寫操作,則會產生一個保護錯誤,就像對頁表項的非法訪問一樣。
如果MMU檢測到沒有有效地匹配項時,就會進行正常的頁表查詢。接着從TLB中淘汰一個表項,然后用新找到的頁表項代替它。這樣,如果這一頁面很快再被訪問,第二次訪問TLB時自然將會命中而不是不命中。當一個表項被清除出TLB時,將修改位復制到內存中的頁表項,而除了訪問位,其他的值不變。當頁表項中從頁表裝入到TLB中時,所有的值都會來自內存。
針對大內存的頁表,有兩種解決方法:
1、多級頁表:
一個簡單的例子如圖3-13a,32位的虛擬地址被划分為10位的PT1域,10位PT2域和2位的Offset(偏移量)域。因為偏移量是12位,所以頁面長度是4KB,共有2^20個頁面。
引入多級頁表的
原因是避免把全部頁表一直保存在內存中。特別是那些從不需要的餓頁表就不應該保留。
考察圖3-13b例子中的二級頁表是如何工作的。在左邊是頂級頁表,它具有1024個表項,對應於10位的pT1 域。當一個虛擬地址被送到MMU時,MMU首先提取pT1域並把該值作為訪問頂級頁表的索引。因為整個4GB虛擬地址空間已經被分為1024個4MB的塊,所以這1024個表項中的每一個都表示4MB的虛擬地址空間。

由頂級頁表得到的表項中含有二級頁表的地址或頁表框號。頂級頁表的表項0指向程序正文的頁表,表項1指向數據的頁表,表項1023指向的堆棧的頁表,其他的表項未用。現在把PT2域作為訪問選定的二級頁表的索引,以便找到該虛擬頁表的對應頁框號。
舉個例子:
考慮虛擬地址0x00403004(十進制4206596)位於數據部分12292字節處。它的虛擬地址對應PT1=1, PT2=2, Offset=4.MMU首先用PT1作為索引訪問頂級的=頁表得到表項1,它對應的地址范圍是4-8M,然后,它用PT2作為索引訪問剛剛找到的二級頁表並得到表項3,它對應的虛擬地址范圍是在它的4M塊內的12288-16383(即絕對地址4106592-4210687)。這個表項含有虛擬地址0x00403004所在頁面的頁框號。如果頁面不在內存中,頁表中的”在/不在“位將是0,引發一次缺頁中斷。如果該頁面在內存中,從二級頁表中得到的也框號將與偏移量結合形成物理地址。
2. 倒排頁表
對於32位虛擬地址空間,多級頁表可以發揮的很好,但對於64位的計算機情況發生了徹底的變化,因而64位分頁的虛擬地址空間的系統需要一個不同的解決方案。
倒排頁表的方法可以節省大量的空間,但也存在不足,主要在機器的運行效率上。
走出這種兩難的局面的辦法是使用TLB。如果TLB能夠記錄所有頻繁使用的頁面,地址轉換就可能變得像通常的頁表一樣快。但是,當發生TLB失效時,需要用軟件搜索整個倒排頁表。一個可行的實現該搜索的方法是建立一張
散列表,用虛擬地址來散列一當前所有在內存中的具有相同散列值的虛擬頁表被鏈接在一起,如圖3-14,如果散列表中的槽數與機器中物理頁面數一樣多,那么散列表的沖突鏈的平均長度將會是1個表項,這將會大大提高映射的速度。一旦也框號被找到,新的(虛擬頁號、物理葉框號)對就會被裝載到TLB中。
