【ARM】Tiny4412裸板编程之MMU简介
00. 目錄
文章目錄
- 00. 目錄
- 01. MMU簡介
- 02. MMU發展
- 03. 地址分類
- 04. MMU工作過程
- 05. 段地址轉換過程
- 06. 二級頁表描述符
- 07. TLB的作用
- 08. Cache的作用
- 09. 附錄
01. MMU簡介
MMU(Memory Management Unit)主要用來管理虛擬存儲器、物理存儲器的控制線路,同時也負責虛擬地址映射為物理地址,以及提供硬件機制的內存訪問授權、多任務多進程操作系統。
02. MMU發展
學習一個知識點,很重要的一步是了解其**為什么而存在?它的存在是為了解決什么問題?**然后,在學習的過程中帶著這些問題去理解、去思考。
在許多年以前,還是使用DOS或一些古老的操作系統時,內存很小,同時,應用程序也很小,將程序存儲在內存中基本能夠滿足需要。隨著科技的發展,圖形界面及一些其他更復雜的應用出現,內存已經無法存儲這些應用程序了,通常的解決辦法是將程序分割成很多個覆蓋塊,覆蓋塊0最先運行,運行結束之后,就調用另一個覆蓋塊,雖然這些操作由OS來完成,但是,需要程序員對程序進行分割,這非常不高效;因此,人們想出了一個**虛擬存儲器(virtual memory)**的方法。虛擬存儲器的基本思想是:程序、數據、堆棧的總大小可以超過內存空間的大小,操作系統將當前運行的部分保存在內存中,未使用的部分保存在磁盤中。比如一個16MB的程序和一個內存只有4MB的機器,操作系統通過選擇可以決定哪部分4MB的程序內容保存在內存中,并在需要時,在內存與磁盤中交換程序代碼,這樣16MB的代碼就可以運行在4MB的機器中了。注意:這里面包含了虛擬地址和物理地址的概念。
03. 地址分類
地址的分類
一個程序在運行之前,沒有必要全部裝入內存,僅需要將那些要運行的部分先裝入內存,其余部分在用到時從磁盤載入,當內存不足時,再將暫時不用的部分調出到磁盤。這使得大程序可以在較小的內存空間中運行,也使得內存中可以同時裝入更多的程序并發執行,這樣的存儲器一般稱為虛擬存儲器。
虛擬地址最終需要轉換為物理地址才能讀寫實際的數據,通過將虛擬地址空間和物理空間劃分為同樣大小的空間(段或頁),然后兩個空間建立映射關系。
由于虛擬地址空間遠大于物理地址,可能多塊虛擬地址空間映射到同一塊物理地址空間,或者有些虛擬地址空間沒有映射到具體的物理地址空間上去(使用到時再映射)。
ARM CPU地址轉換涉及三種地址:虛擬地址(VA,Virtual Address)、變換后的虛擬地址(MVA,Modified Virtual Address)、物理地址(PA,Physical Address)
沒有啟動MMU時,CPU核心,cache,MMU,外設等所有部件使用的都是物理地址。
啟動MMU后,CPU核心對外發出虛擬地址VA;VA被轉換為MVA供cache,MMU使用,在這里MVA被轉換成PA;最后使用PA讀取實際設備
①CPU核心看到和用到的只是虛擬地址VA,至于VA如果去對應物理地址PA,CPU核心不理會
②caches和MMU看不到VA,他們利用MVA轉換得到PA
③實際設備看不到VA、MVA,讀寫它們使用的是物理地址PA
04. MMU工作過程
MMU是由協處理器(cp15)控制的,Exynos 4412多會用到兩級頁表:以段(Section,1MB)的方式進行轉換時只用到一級頁表,以頁(page)的方式進行轉換時用到兩級頁表。頁的大小有3種:大頁(64KB),小頁(4KB),極小頁(1KB)。
條目也稱為"描述符"(Descriptor),有:段描述符,大頁描述符,小頁描述符,極小頁描述符----它們保存段、大頁、小頁或極小頁的起始物理地址;粗頁表描述符、細頁表描述符—他們保存二級頁表的物理地址
轉換過程如下:
(1) 根據給定的虛擬地址找到一級頁表中的條目
(2) 如果此條目是段描述符,則返回物理地址,轉換結束
(3) 如果此條目是二級頁表描述符,繼續利用虛擬地址在二級頁表中找到下一個條目;
(4) 如果這第二個條目是葉描述符,則返回物理地址,轉換結束;
(5) 其他情況出錯
05. 段地址轉換過程
使用 MVA[31:20]來索引一級頁表(20-31 一共 12 位,2^12=4096,所以是4096 個描述符)。其中段地址的轉換流程如下圖所示:
再來看看TTB
簡單的來說,它保存了一級頁表所存放的實際物理地址,要求16KB對齊,以段的方式映射,4GB的虛擬地址空間,需要段描述符4096個(每個段描述符映射1M空間),沒個描述符占用4byte,所以一段的方式映射一級頁表占用的空間為16KB。
在這里我們假設,我們的一級頁表存放在物理地址:0x30000000.
第一步:
獲得虛擬地址所對應的段描述符所在的地址
addr = TTB&0xffffc000 | ((viraddr >> 20) << 2 ) = 0x30000000 & 0xfffc000 | ((0xa0004000 >> 20) << 2)= 0x30000000 | (0xa00 << 2) = 0x30002800
第二步:
從0x30002800取出虛擬地址所對應的段描述符
? 段描述的構造我們到后面再來講解,這里我們假設我們把0xa0004000映射到實際的物理地址0x30004000,則這里的[31:20]為0x300
第三步:
組合成實際的物理地址
phyaddr = 0x300 << 20 | (0xa0004000 & 0xfffff) = 0x30004000
06. 二級頁表描述符
大頁描述符
? 位[31:16]為大頁基址,此描述符的低16位填充0后就是一塊64KB物理地址空間的起始地址粗頁表中的每個條目只能表示4KB物理空間,如果大頁描述符保存在粗頁表中,則連續16個條目都保存同一個大頁描述符。類似的,細頁表中每個條目只能表示1KB的物理空間,如果大頁描述符保存在細頁表中,則連續64個條目都保存同一個大頁描述符。
下面以保存在粗頁表中的大頁描述符為例,說明地址轉化那過程
①頁表基址寄存器[31:14]和MVA[31:20]組成一個低兩位為0的32位地址,MMU利用這個地址找到粗頁表描述符
②取出粗頁表描述符的[31:10](即粗頁表基址),它和MVA[19:12]組成一個低兩位為0的32位物理地址,通過這個地址找到大頁描述符
③取出大頁描述符的[31:16](即大頁基址),它和MVA[15:0]組成一個32位的物理地址,即MVA對應的PA
步驟②和③中,用于在粗頁表中索引的MVA[19:12]、用于在大頁內尋址的MVA[15:0]有重合的位[15:12],當位[15:12]從0b0000變化到0b1111時,步驟②得到的大頁描述符相同,所以粗頁表中有連續16個條目保存同一個大頁描述符。
大頁的地址轉換過程(大頁描述符保存在粗頁表中)
小頁描述符
[31:12]為小頁基址(Small page base address),此描述符的低12位填充0后就是一塊4kb([11:0],一共12位,2^12=4096)物理地址空間的起始地址。粗頁表中每個條目表示4kb的物理空間,如果小頁描述符保存在粗頁表中,則只需要用一個條目來保存一個小頁描述符。類似的,細頁表中每個條目只能表示1kb的物理空間,如果小頁保存在細頁表中,則連續4個條目都保存同一個小頁描述符。
下面以保存在粗頁表中的小頁描述符為例,說明地址轉換過程:
①頁表基址[31:14]和MVA[31:20]組成一個低兩位為0的32位地址,MMU利用這個地址找到粗頁表描述符
②取出粗頁表描述符[31:10](即粗頁表基址),它和MVA[19:12]組成一個低兩位為0的32位物理地址,用這個地址找到小頁描述符
③取出小頁描述符的位[31:12](即小頁基址),它和MVA[11:0]組成一個32位物理地址(即MVA對應的PA)
小頁描述符保存在細頁表中,地址轉換過程和上面類似。
小頁的地址轉換過程(小頁描述符保存在粗頁表中)
極小頁描述符
? [31:10]為極小頁基址(Tiny page base address),此描述符的低10位填充0后就是一塊1KB物理地址空間的起始地址。極小頁描述符只能保存在細頁表中,用一個條目來保存一耳光極小頁描述符
下面是極小頁的地址轉換過程:
①頁表基址寄存器[31:14]和MVA[31:20]組成一個低兩位為0的32位地址,MMU通過這個地址找到細頁表描述符
②取出細頁表描述符[31:12](即細頁表基址),它和MVA[19:10]組成一個低兩位為0的32位物理地址,通過這個地址即可找到極小頁描述符
③取出極小頁描述符[31:10](即極小頁基址),它和MVA[9:0]組成一個32位的物理地址(即MVA對應的PA)
極小頁的地址轉換過程(極小頁描述符保存在粗頁表中)
從段、大頁、小頁、極小頁的地址轉換過程可知
①以段進行映射時,通過MVA[31:20]結合頁表得到一段(1MB)的起始物理地址,MVA[19:0]用來在段中尋址
②以大頁進行映射時,通過MVA[31:16]結合頁表得到一個大頁(64KB)的起始物理地址,MVA[15:0]用來在小頁中尋址
③以小頁進行映射時,通過MVA[31:12]結合頁表得到一個小頁(4KB)的起始物理地址,MVA[11:0]用來在小頁中尋址
④以極小頁進行映射時,通過MVA[31:10]結合頁表得到一個極小頁(1KB)的起始物理地址,MVA[9:0]用來在極小頁中尋址
內存的訪問權限檢查
它決定一塊內存是否允許讀、是否允許寫。這由CP15寄存器C3(域訪問控制)、描述符的域(Domain)、CP15寄存器C1的R/S/A位、描述符的AP位共同決定。
“域”決定是否對某塊內存進行權限檢查,“AP”決定如何對某塊內容進行權限檢查。
exynos4412有16個域,CP15寄存器C3中每兩位對應一個域(一共32位),用來表示這個域是否進行權限檢查
每兩位數據的含義
00:無訪問權限(任何訪問都將導致“Domain fault”異常)
01:客戶模式(使用段描述符、頁描述符進行權限檢查)
10:保留(保留,目前相當于“無訪問權限”)
11:管理模式(不進行權限檢查,允許任何訪問)
Domain占用4位,用來表示內存屬于0-15,哪一個域
例如:
①段描述符中的“Domain”為0b0010,表示1MB內存屬于域2,如果域訪問控制寄存器的[5:4]等于0b00,則訪問這1MB空間都會產生“Domain fault”異常,如果等于0b01,則使用描述符中的“Ap”位進行權限檢查
②粗頁表中的“Domain”為0b1010,表示1MB內存屬于域10,如果域訪問控制寄存器的[21:20]等于0b01,則使用二級頁表中的大頁/小頁描述符中的"ap3"、“ap2”、“ap1”、"ap0"位進行權限檢查,如果等于0b11,則允許任何訪問,不進行權限檢查。
07. TLB的作用
從MVA到PA的轉換需要訪問多次內存,大大降低了CPU的性能,有沒有辦法改進呢?
程序執行過程中,用到的指令和數據的地址往往集中在一個很小的范圍內,其中的地址、數據經常使用,這是程序訪問的局部性。
由此,通過使用一個高速、容量相對較小的存儲器來存儲近期用到的頁表條目(段、大頁、小頁、極小頁描述符),避免每次地址轉換都到主存中查找,這樣就大幅提高性能。這個存儲器用來幫助快速地進行地址轉換,成為轉譯查找緩存(Translation Lookaside Buffers, TLB)
當CPU發出一個虛擬地址時,MMU首先訪問TLB。如果TLB中含有能轉換這個虛擬地址的描述符,則直接利用此描述符進行地址轉換和權限檢查,否則MMU訪問頁表找到描述符后再進行地址轉換和權限檢查,并將這個描述符填入TLB中,下次再使用這個虛擬地址時就直接使用TLB用的描述符。
使用TLB需要保證TLB中的內容與頁表一致,在啟動MMU之前,頁表中的內容發生變化后,尤其要注意。一般的做法是在啟動MMU之前使整個TLB無效,改變頁表時,使所涉及的虛擬地址對應的TLB中條目無效。
08. Cache的作用
同樣基于程序訪問的局部性,在主存和CPU通用寄存器之間設置一個高速的、容量相對較小的存儲器,把正在執行的指令地址附近的一部分指令或數據從主存調入這個存儲器,供CPU在一段時間內使用,對提高程序的運行速度有很大作用。這個cache一般稱為高速緩存。
①寫穿式(Write Through)
任一CPU發出寫信號送到Cache的同時,也寫入主存,保證主存的數據同步更新。優點是操作簡單,但由于主存速度慢,降低了系統的寫速度并占用了總線的時間。
②回寫式(Write Back)
數據一般只寫到Cache,這樣可能出現Cache中的數據得到更新而主存中的數據不變(數據陳舊)的情況。此時可在Cache中設一個標志地址及數據陳舊的信息,只有當Cache中的數據被換出或強制進行”清空“操作時,才將原更新的數據寫入主存響應的單元中,保證了Cache和主存中數據一致。
Cache有以下兩個操作:
①”清空“(clean):把Cache或Write buffer中已經臟的(修改過,但未寫入主存)數據寫入主存
②”使無效“(Invalidate):使之不能再使用,并不將臟的數據寫入主存。
09. 附錄
Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary0.pdf
參考博客:https://blog.csdn.net/prike/article/details/51956206?
總結
以上是生活随笔為你收集整理的【ARM】Tiny4412裸板编程之MMU简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Tools】VMware Workst
- 下一篇: 【ARM】Tiny4412裸板编程之协处