虛擬化技術分析:動態地址轉換
盡管虛擬化在主機上是很成熟的技術,我們最近還是經常聽聞有關該技術的討論。早在1967年,CP-67虛擬機管理程序就已經支持虛擬機和虛擬化系統鏡像。在這個虛擬機管理程序下,整個磁盤可以被虛擬為多個小型磁盤。例如像讀卡器、打卡機和打印機等單元記錄設備,甚至無需實際物理設備存在就能被虛擬出來。從硬件的角度來看,此時的System/360 Model 67并沒有提供虛擬化設備的支持,是CP-67虛擬機管理程序自己提供了所需的虛擬化。然而CP-67并不能虛擬化主內存,它還是需要Model 67的協助來完成。
System/360 Model 67可以借助CP-67創建的表,來實施動態地址轉換(DAT)。通過這種方式,虛擬機中一個特定內存塊可以被映射到實際內存中的任意塊。實際內存中非連續的內存塊在虛擬機中可能就是連續的。更有趣的是,“虛擬內存”中的塊有可能并不映射到實際內存中。相反,它會被CP-67映射到磁盤上的數據塊,這個數據塊只有在被引用時才讀入真實的內存數據。這樣的設計使得客戶操作系統認為數據一直在內存中。這便所謂的分頁技術,同時也是虛擬化技術的基礎。今天的z/os系統正是利用這種機制隔離不同的應用和程序。
轉譯后備緩沖區(TLB)提供了實用性
動態地址轉換是一個偉大的想法,但如果每次訪問內存中指令或者操作數地址,都需要進行地址轉換,那這個時間花費是不可接受的。大多數大型機的指令涉及多個地址,如果沒有突破性的創新,動態地址轉換反而會降低機器運行效率。這時出現了讓動態地址轉換依舊可用的創新,那就是轉譯后備緩沖區(TLB)。TLB是一種可以記錄并快速訪問前一次轉譯結果的結構。
在這里我們不會太深入講解TLB的工程設計,但仍有幾點需要留意。TLB是一個二維數組,其內容就是一系列的條目。如圖1-01所示,它是長度為32個條目,寬度為4個條目的TLB。每個條目包含一個已被轉譯的虛擬地址和一個真實地址。使用索引和內容可尋址存儲器,我們可以從TLB中獲得正確的先前轉譯。如果先前轉譯并沒有在TLB中,其它電子元件就會讀取內存中的表并進行轉換,然后將結果寫入到TLB的相應列中,以備后續使用。
使用大型的TLB是非常有用的,這樣就能最小化內存中表的訪問。然而不幸的是,大型電子電路的速度訪問會非常緩慢,因為信號必須在更大的結構中傳播更遠的距離。此外,內容尋址存儲器所需的電路數增長是非線性的。所以TLB一般來說都比較小。幸運的是我們已經有一些技術可以提升有效容量,因此無需使用很大的TLB。
圖1-01 一級TLB
***化TLB的容量
起初,單一的TLB可用于轉譯指令地址和操作數地址。但同時也有兩個地方需要轉譯,那就是指令提取邏輯和操作數訪問邏輯。一個能有效增加容量的方法是使用兩套TLB,一個用于處理指令地址,另一個用于處理操作數地址。處理指令的TLB一般物理位置上臨近指令存取邏輯,處理數據的則被放置在操作數地址邏輯附近。即使這樣的設計需要額外邏輯來維護這兩個TLB的交互,但這個額外花銷是值得的,因為它帶來了效率的提升。
另外可做的是增加TLB的層級,這些額外增加的層級可以是大容量和低速度的設備,因為它們僅會在小型高速TLB未***時使用。這種添加層級的方法已被用于處理器高速緩存幾十年了。每個次級層次都容量更大,同時需要更多的周期來訪問。為此IBM工程師用非線性的方式實現了二級轉譯后備緩沖區(TLB2)。在內存中的DAT表并不再是線性表,而是更復雜的多層結構(如圖2-01所示)。例如在雙層表中,***級表稱為段表,它包含內存映射到二級表的入口;二級表稱為頁面表,它包含256個用于映射4K內存的條目。
圖2-01 存儲中的DAT表結構
現代的z系統處理器的TLB2有兩種類型的條目(如圖2-02所示),大小為1MB的段和大小為4K的頁。當轉譯在***層TLB(TLB1)中找不到時,TLB2就會搜索4KB頁條目所提供的轉譯。如果沒有找到,TLB2就會在段條目中搜索包含待轉譯的地址。如果這個條目被找到,就不會再使用內存中表的轉譯,因為對應的頁表可以直接被訪問,而無需訪問存儲器中的段表。因此如使用TLB2,額外的轉譯可以通過訪問內存中的表來實現,至少減少了這些訪問的次數。
圖2-02 二級TLB的結構
增加TLB有效容量的另一種方法是支持更大的頁面,使得僅需要較少的條目就能覆蓋給定的虛擬地址。在z系統的處理器中,這個特性得到了支持。首先在Z10的處理器上,TLB1會繼續支持4KB的條目,但TLB2可以容納1MB的頁條目。這些1MB的頁條目可以無需訪問內存中的表來創建TLB1所需的4KB條目。在z196處理器中,TLB1已經可以支持1MB的頁條目。在這個處理器中,添加了特殊的數據TLB1用于1MB頁條目的處理,同時指令TLB1也被增強用于支持4KB和1MB兩個頁條目。在zEC12還引入了2GB頁條目的支持。在這種結構下,有一個小型的數據TLB1持有一些2GB的頁條目,而一些非常大的頁條目被用作DB2緩沖區域和JAVA堆的有效映射。
虛擬化的創新還在繼續
本文的簡介并沒有談到z/VM虛擬機支持客戶機的虛擬內存。為了實現這種功能,z系統的處理器支持兩層的轉譯。首先,客戶機的虛擬地址被轉譯成客戶機的實際地址。但是客戶機的真實地址是主機端的虛擬地址,它需要轉譯成主機的真實地址。在這里我們不會就本話題做進一步探討,僅僅有一點提醒大家注意,那便是兩層轉譯涉及到許多表的訪問,因為客戶表的轉譯還涉及到額外的主機轉譯。還有許多更復雜的操作在z系統硬件上實現,這種實現使得對上層操作是透明的。