MMU和TLB
MMU
虛拟存儲器的基本思想是程式,資料,堆棧的總的大小可以超過實體存儲器的大小,作業系統把目前使用的部分保留在記憶體中,而把其他未被使用的部分儲存在磁盤上。
- 比如對一個16MB的程式和一個記憶體隻有4MB的機器,OS通過選擇,可以決定各個時刻将哪4M的内容保留在記憶體中,并在需要時在記憶體和磁盤間交換程式片段,這樣就可以把這個16M的程式運作在一個隻具有4M記憶體機器上了。
- 而這個16M的程式在運作前不必由程式員進行分割。
- 一個實體存儲塊(通常為一個頁框)被多個邏輯頁映射。
伴随着這種技術的出現,“virtual address,即VA”和“physical address, 即PA”也就出現了。一般來說,CPU看到的位址是VA,VA是有位址線來決定的。
- 比如,s3c2410是32位的SoC,那麼它的尋址空間為 2^32=4GB,那麼VA空間也就是4GB。
既然PA沒有VA那麼大,而且CPU隻能看到 VA,那麼CPU如何找到PA呢?**這也正是MMU的基本作用之一,就是提供VA到PA的轉換機制,除了硬體的支援外,軟體上實際就是維護一張表,表中的内 容是VA到PA的轉換法則。**由于有了MMU,那麼就可以實作利用VA找到實際實體記憶體區域。具體的轉換方法将在以後介紹。
總而言之,CPU認為的記憶體空間是由其位址線決定的,但是我們真實的記憶體空間可能會發生與認為的不比對,是以我們就引入了虛拟記憶體,虛拟記憶體就需要MMU來進行映射。
什麼是MMU
MMU是 Memory Management Unit 的縮寫即,記憶體管理單元. 針對各種CPU, MMU是個可選的配件. MMU負責的是虛拟位址與實體位址的轉換. 提供硬體機制的記憶體通路授權.(現代 CPU 的應用中,基本上都選擇了使用 MMU)
現代的多使用者多程序作業系統, 需要MMU, 才能達到每個使用者程序都擁有自己的獨立的位址空間的目标. 使用MMU, OS劃分出一段位址區域,在這塊位址區域中, 每個程序看到的内容都不一定一樣.
例如MICROSOFT WINDOWS作業系統, 位址4M-2G處劃分為使用者位址空間. 程序A在位址 0X400000映射了可執行檔案. 程序B同樣在位址 0X400000映射了可執行檔案. 如果A程序讀位址0X400000, 讀到的是A的可執行檔案映射到RAM的内容. 而程序B讀取位址0X400000時則讀到的是B的可執行檔案映射到RAM的内容.
MMU 作用
MMU 的作用:
- 将虛拟位址翻譯成為實體位址,然後通路實際的實體位址
- 通路權限控制
MMU 工作過程
參考了這篇
一些概念
- MMU 進行虛拟位址轉換成為實體位址的過程是 MMU 工作的核心
- 大多數使用虛拟存儲器的系統都使用一種稱為分頁(paging)。
- 虛拟位址空間劃分成稱為**頁(page)**的機關;
- 而相應的實體位址空間也被進行劃分,機關是頁框-也可以說是塊(frame),這裡的塊就是計組裡面的記憶體劃分塊了。
- 頁和頁框的大小必須相同。
工作過程
我們已經知道,大多數使用虛拟存儲器的系統都使用一種稱為分頁(paging)的技術。
虛拟位址空間被分成大小相同的一組頁,每個頁有一個用來标示它的頁号(這個頁号一般是它在該組中的索引,這點和C/C++中的數組相似)。
配置設定頁号:我們可以假設04K的頁号為0,48K的頁号為1,8~12K的頁号為2,以此類推。
而虛拟位址(注意:是一個确定的位址,不是一個空間)被MMU分為2個部分
- 第一部分是頁号索引(page Index)
- 第二部分則是相對該頁首位址的偏移量(offset)
使用虛拟位址中的虛頁号查詢頁表得到對應的實體頁号,然後與虛拟位址中的頁内位移組成實體位址。
記憶體保護
MMU除了具有位址翻譯的功能外,還提供了記憶體保護功能。
采用頁式記憶體管理時可以提供頁粒度級别的保護,允許對單一記憶體頁設定某一類使用者的讀、寫、執行權限.
比如:一個頁中存儲代碼,并且該代碼不允許在使用者模式下執行,那麼可以設定該頁的保護屬性,這樣當處理器在使用者模式下要求執行該頁的代碼時,MMU會檢測到并觸發異常,進而實作對代碼的保護。
TLB
參考
頁表以資料結構的方式存放在DDR(DDR是一個記憶體名稱,意思即雙倍速率同步動态随機存儲器,是記憶體的其中一種)中,假如cpu每做一次位址通路,都要去DDR裡去取出1級描述符,然後解析1級描述符,再去查找2級描述符,解析2級描述符,加上偏移得到實體位址,那真是太慢了。
MMU的cache-TLB
TLB的全稱是Translation Lookaside Buffer,我們知道,處理器在取指或者執行通路memory指令的時候都需要進行位址翻譯,即把虛拟位址翻譯成實體位址。而位址翻譯是一個漫長的過程,需要周遊幾個level的Translation table,進而産生嚴重的開銷。為了提高性能,我們會在MMU中增加一個TLB的單元,把位址翻譯關系儲存在這個高速緩存中,進而省略了對記憶體中頁表的通路
TLB也是一種cache,有cache也就意味着資料有多個copy,是以存在一緻性(coherence)問題。和資料、指令cache或者unified cache不同的是,硬體并不維護TLB的coherence,一旦軟體修改了page table,那麼軟體也需要進行TLB invalidate操作,進而維護了TLB一緻性。
快速上下文切換FSCE
對于MMU如何識别程序的切換,幾乎所有的參考資料上(包括ARM體系結構)均講解的是快速上下文切換的方法,但其實作業系統并沒有使用
**快速上下文切換擴充FCSE(Fast Context Switch Extension),是MMU中的一個附加硬體,用于提高ARM嵌入式系統的系統性能。FCSE使得多個獨立的任務可以運作在一個固定的重疊存儲空間中,而上下文切換時又不需要清理或清除cache,或TLB。**如果沒有FCSE,則從一個任務切換到另一個任務需要改變虛拟存儲映射。
如果涉及兩個有重疊位址的任務,則儲存在cache和TLB中的資訊将變為無效,這樣系統就必須清除cache和TLB中的無效資料。清除這些子產品的過程使任務切換增加了很多時間,因為核心不僅要清除cache和TLB中的無效資料,還要從主存中裝載新的資料到cache和TLB。
使用FCSE,虛拟存儲管理增加了一次位址轉換。FCSE在虛拟位址到達cache和TLB前,使用一個特殊的,包含程序ID值的重定位寄存器來修改虛拟位址。把修改之前的虛存位址稱為VA(Virtual Address),把第一次轉換之後的位址稱為修改後虛位址MVA(Modified Virtual Address)。
這樣,任務間的切換就不用涉及到改變頁表,隻需簡單的将新任務的程序ID寫到位于CP15的FCSE程序ID寄存器。為了利用FCSE,編譯連結所有的任務,使他們都運作在虛存的第一個32MB塊空間,為每個任務配置設定一個程序ID;然後通過下邊的公式,将每個任務放置在修改後虛存的不同32MB分區中:MVA = VA +(0x2000000 * 程序ID)
FSCE的一個主要限制是您最多有128個程序,并且每個程序的大小被限制為2^25或32MB才能利用它。它還消耗大量的虛拟位址空間。這就是為什麼它從未被引入Linux主線的原因。盡管許多嵌入式Linux裝置可能受益,但它不像ASID那樣通用,ASID支援256個程序,沒有大小限制,也不消耗虛拟位址空間。
Global TLB和non-global
現代OS都将位址空間分為核心空間和使用者空間。核心空間特權态通路,使用者空間使用者态通路。
核心空間内容基本各個程序(包括核心線程)都差不多,核心位址空間是一樣的,是以對于這部分位址翻譯,無論程序如何切換,核心位址空間轉換到實體位址的關系是永遠不變的,在程序的時候,不需要清掉。
對于使用者空間,各個程序的内容都不太一樣,保留隻會造成混亂,需要清掉。在這種思路引導下,**CPU在切換程序的時候,隻會清掉不帶Global标志的使用者空間頁表TLB,而不會動帶有global标志的核心頁表項。**一個新的程序會開始一個半新的TLB,效能提高不少。
TLB失效
TLB的原理就是将映射到實體頁框的虛拟頁面的映射關系緩存在MMU中的硬體緩沖當中,每次MMU拿到一個虛拟位址後,都根據位址分析出虛拟頁面号,然後查找TLB中有沒有該頁面的項目,有的話則取出其中的實體頁框号,加上頁内位址獲得實際的實體位址送到位址總線上去通路記憶體,沒有該頁面的項目的話,即TLB失效的情況下,有兩種方式去處理:
1.硬體處理TLB失效
即發生虛拟頁号在TLB中找不到的情況,有兩個原因:
- 該頁面沒有被加載到記憶體:這種情況就是缺頁錯誤,MMU到程序的頁表上查找發現頁面沒有在記憶體中,需要引發缺頁中斷,然後調用作業系統的一個彙編函數,由作業系統根據寄存器中的位址或者最後一條運作的指令拿到發生缺頁錯誤的虛拟位址,根據虛拟頁面号從磁盤中将頁面加載到記憶體(當中可能涉及頁面交換,由于記憶體空餘頁面不足,需要将記憶體中不常通路使用的頁面換出到磁盤上的交換空間),然後更新發生缺頁的程序的頁表,将該虛拟頁号和實體頁框号的映射寫到頁表中,接着傳回到CPU上再次執行最後一條指令,此時TLB上仍然沒有該虛拟頁面的表項,是以,由MMU到程序的頁表中查找,找到該頁面号的映射關系,取出該映射關系,加入到TLB中(如果TLB的表項中沒有空餘的空間,則犧牲一條已有表項)中,最後取出表項中的實體頁框号,組成實體位址通路實體記憶體。
- 頁面已被加載到記憶體,隻是TLB中沒有對應的映射關系:這種情況大部分是由于該頁面的映射關系在TLB之前新增表項的時候被犧牲了,是以隻要MMU在去程序的頁面中重新加載該映射關系既可。
2.軟體處理TLB失效
軟體處理TLB失效和硬體處理方式雷同,最大的差別在于查找程序頁表中的虛拟頁面的映射關系以及添加映射關系到TLB表的操作由作業系統來完成。