linux內存管理 (二) [硬件1] MMU及其運行過程 關鍵過程一 TLB

===========================================
虛擬地址和物理地址的轉換 關鍵過程1 從TLBs獲取pa
	
當處理器要訪問一個虛擬地址時,首先會在TLB中查詢。
	如果TLB表項中沒有相應的表項,稱爲TLB Miss,那麼就需要
		1.訪問頁表(translation table walk)來計算出相應的物理地址。
		2.並在TLB中放置映射
	如果TLB表項中有相應的表項,那麼直接從TLB表項中獲取物理地址,稱爲TLB命中。 

TLB 的產生原因及作用

  • TLB的 產生
在現代處理器中,軟件使用虛擬地址訪問內存,而處理器的MMU單元負責把虛擬地址轉換成物理地址
爲了完成這個映射過程,軟件和硬件共同來維護一個多級映射的頁表。

爲了完成虛擬地址到物理地址的轉換,查詢頁表需要兩次訪問內存
	1.訪問頁表(translation table walk,walk 一級頁表和二級頁表)來計算出相應的物理地址
	2.根據物理地址訪問主存,得到物理地址對應的值

而 我們可以在步驟1 進行優化,即 優化虛擬地址到物理地址轉換的速度
	通過 TLB (將一級二級等頁表項緩存到MMU內部的cache,即TLB)

綜上,TLB是爲了
	優化虛擬地址到物理地址轉換的速度
	降低內存訪問的平均成本
	

TLB是什麼,TLB項內容是什麼

  • TLB 本質
// 物理本質
TLB(Translation Lookaside Buffer)傳輸後備緩衝器是位於MMU中的小的緩存,其中每一行都保存着一個由單個PTE組成的塊。
// 內容本質
TLB 用於緩存內存中的頁表項(用於 虛擬尋址)
  • TLB 物理組成
// 物理組成
	實現可以有
		一個統一的TLB(von Neumann架構)
		或單獨的指令和數據TLB(Harvard架構)。
	TLB表項( TLB entry )數量比較少,一般有多少個?
	TLB表項 有4字節.
  • TLB表項內容
// 內容

每個TLB條目都包含
	修改過的虛擬地址
	頁面大小
		TLB可以基於以下塊大小存儲條目:
			超節由16MB內存塊組成
			部分由1MB內存塊組成
			大頁面由64KB的內存塊組成
			小頁面由4KB內存塊組成。
	物理地址
	一組內存屬性
		內存屬性1: 每個TLB條目被標記爲  // 用於 匹配 tlb表項與 vma
			1.與特定的應用程序空間關聯, 
			2.或被標記爲所有應用程序空間的全局。
		內存屬性2: Domain // 用於校驗權限
			Register 3: Domain access control 和 頁表項中的 Domain[8:5]  定義了 四種情況
		內存屬性3: Access permissions // 用於校驗權限
			當前執行指令時的特權級 和 頁表項中的AP[11:10] 定義了四種情況
		內存屬性4: 一組相關的內存區域屬性,用來表示該塊的 內存區域類型 // 用於定義內存塊的 內存區域類型
			// 內存區域類型 : ARMv6 memory attributes - introduction on page B2-8.
			每個TLB條目都有一組相關的內存區域屬性。
			這些控制訪問 緩存/寫緩衝區/內存區域 的 內存區域類型
			在VMSAv6之前
				只提供了C(可緩存)和B(可緩衝)位。
				它們的準確使用模型(例如,位設置如何影響直寫與回寫緩存策略)和任何其他控件都是由實現定義的。
			VMSAv6
				引入了一個更正式的內存模型(參見第B2-8頁上的ARMv6內存屬性-簡介),由本節中描述的附加位字段(TEX)和定義支持。
				頁表格式使用5bit(TEX[2:0]和C位和B位)來編碼內存區域類型
				第B4-12頁的表B4-3顯示了類型擴展字段(TEX)和可緩存和可緩衝位(C和B)到內存區域類型的映射
					沒有TEX字段的頁表格式
						TEX = 0b000
					如果頁表包含共享位。
						共享位 僅適用於普通內存,而不是設備內存或強順序內存
						並確定內存區域是共享(1)還是不共享(0)。
					如果頁表不包含共享位。
						假定S位爲0(不共享)。




// 內容什麼時候填充的
	TLB中內容是  硬件翻譯單元 從內存中維護的一組頁表(轉換表)中查找得來的.
		如果在TLB中找不到地址的映射,則硬件會自動讀取轉換表,並在TLB中放置映射。
		執行完整翻譯表查找的過程稱爲 translation table walk。
	

TLB hit/miss

  • TLB hit/miss過程
// 虛擬地址 和 其他 東西  與 tlb 表項比較 ,並 命中了  tlb 表項A
tlb表項 = tlb_map_func(虛擬地址)
tlb_map_func有三種
	全關聯
	直接映射
	分組關聯
        
直接映射方式 // 直接映射方式是指每一個虛擬地址只能映射到TLB中唯一的一個表項
    TLB條目與VMA匹配
        修改後的虛擬地址的位31-N匹配,且它被標記爲全局,其中N=log2(TLB條目 頁面大小)
        修改後的虛擬地址的位31-N匹配,且TLB條目中的ASID與當前ASID(CP15中的寄存器13)匹配,其中N=log2(TLB條目 頁面大小)
            在使用ASID的地方,CP15中的寄存器13確定當前選擇的應用空間。

    TLB條目與TLB條目匹配
        如果TLB條目能夠匹配TLB條目,則TLB的行爲是不可預測的。
        操作系統必須確保在任何時候都不能有多個TLB條目匹配,通常是在更改全局頁映射時刷新其TLB來實現這個目標
  • TLB hit/miss機率
TLB內部存放的基本單位是TLB表項(表項所佔字節是一定的)
	TLB容量越大,所能存放的TLB表項就越多,TLB命中率就越高
	但是TLB的容量是有限的(一般不超過1000個TLB表項)
	所以 一般 通過 提高頁面大小 來提高TLB miss 機率.

頁越大,TLB miss 機率就越小
	如果一個程序使用4M,
		Linux內核目前默認採用4KB大小的小頁面,
			1024個頁面,那麼需要1024個TLB表項就可以保證不會出現 TLB Miss的情況。
		如果使用2MB大小的大頁
			2 個頁面  ,那麼需要2   個TLB表項就可以保證不會出現 TLB Miss的情況。
		以1GB爲單位的大頁
			1 個頁面  ,那麼需要1   個TLB表項就可以保證不會出現 TLB Miss的情況。

After TLB hit

  • TLB 命中之後,生成物理地址的過程


If a matching TLB entry is found then the information it contains is used as follows:

1. The access permission bits and the domain are used to determine whether access is permitted. If the access is not permitted the MMU signals a memory abort. Otherwise the access is allowed to proceed.
2. The memory region attributes are used to control:
• the cache and write buffer
• whether the access is cached or uncached
• the target memory type
• whether the target memory is shared or unshared.
3. The physical address is used for any access to external or tightly coupled memory, and can be used to perform TAG matching for cache entries in physically tagged cache implementations.

TLB 與 Translation Table walk

  • TLB項與頁表項區別
相同點
	表項都是4字節
不同點
	1. tlb項存儲在tlb中,頁表項存儲在主存中
	2. tlb項 沒有 頁表項 多, 是因爲 tlb 沒有 主存 大
	4. 內容不同
		3.1 tlb 的索引過程通過 標識(VMA[19:31])index(VMA[13:18]) 來索引 // TODO
			更正: 通過  VMA[31:log2(頁面大小)] 和 應用程序空間關聯關係  來 命中.
		3.2 頁表項通過 虛擬地址 (which entry + offset in block) 中的 which entry 來索引
  • Translation Table walk 時間 與 TLB 時間 消耗 比較
如果沒有TLB,則每次取數據都需要兩次訪問內存,即
	1.從內存中查頁表獲得物理地址
	2.從內存中取數據。
	
如果有TLB,則每次取數據最少需要1次訪問內存,至多需要2次訪問內存,
	1.從TLB中查頁表獲得物理地址,如果能查到,執行2,如果查不到,則從內存中查頁表獲得物理地址(執行一次Translation Table walk),然後執行2
	2.從內存中 取數據。

Translation Table walk
	//它由硬件自動執行,並且在執行時間上有很大的開銷,至少有一個主內存訪問,通常有兩個。(到底是幾個?)


TLB的operations

  • 上下文切換之後需要軟件操作TLB 刷新
當進程地址空間進行了切換,
	比如現在是進程1運行,TLB中放的是進程1的相關數據的地址;
	突然切換到進程2,TLB中原有的數據不是進程2相關的,
此時TLB需要刷新數據。怎麼刷新數據? 

目前兩種方法:
	一,全部刷新。
		全部刷新很簡單,但花銷大,很多不必刷新的數據也進行刷新,增加了無畏的花銷。 
	二,部分刷新。 
		部分刷新是根據標誌位,刷新需要刷新的數據,保留不需要刷新的數據。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章