ARM MMU工作原理剖析)

來源:互聯網
上載者:User

一、MMU的產生

      許多年以前,當人們還在使用DOS或是更古老的作業系統的時候,電腦的記憶體還非常小,一般都是以K為單位進行計算,相應的,當時的程式規模也不大,所以記憶體容量雖然小,但還是可以容納當時的程式。但隨著圖形介面的興起還用使用者需求的不斷增大,應用程式的規模也隨之膨脹起來,終於一個難題出現在程式員的面前,那就是應用程式太大以至於記憶體容納不下該程式,通常解決的辦法是把程式分割成許多稱為覆蓋塊(overlay)的片段。覆蓋塊0首先運行,結束時他將調用另一個覆蓋塊。雖然覆蓋塊的交換是由OS完成的,但是必須先由程式員把程式先進行分割,這是一個費時費力的工作,而且相當枯燥。人們必須找到更好的辦法從根本上解決這個問題。不久人們找到了一個辦法,這就是虛擬儲存空間(virtual memory).虛擬儲存空間的基本思想是程式,資料,堆棧的總的大小可以超過實體儲存體器的大小,作業系統把當前使用的部分保留在記憶體中,而把其他未被使用的部分儲存在磁碟上比如對一個16MB的程式和一個記憶體只有4MB的機器,OS通過選擇,可以決定各個時刻將哪4M的內容保留在記憶體中,並在需要時在記憶體和磁碟間交換程式片段,這樣就可以把這個16M的程式運行在一個只具有4M記憶體機器上了。而這個16M的程式在運行前不必由程式員進行分割。

      任何時候,電腦上都存在一個程式能夠產生的地址集合,我們稱之為位址範圍。這個範圍的大小由CPU的位元決定,例如一個32位的CPU,它的位址範圍是0~0xFFFFFFFF (4G)而對於一個64位的CPU,它的位址範圍為0~0xFFFFFFFFFFFFFFFF (64T),這個範圍就是我們的程式能夠產生的位址範圍,我們把這個位址範圍稱為虛擬位址空間,該空間中的某一個地址我們稱之為虛擬位址。與虛擬位址空間和虛擬位址相對應的則是物理地址空間和物理地址,大多數時候我們的系統所具備的物理地址空間只是虛擬位址空間的一個子集,這裡舉一個最簡單的例子直觀地說明這兩者,對於一台記憶體為256MB的32bit x86主機來說,它的虛擬位址空間範圍是0~0xFFFFFFFF(4G),而物理地址空間範圍是0x000000000~0x0FFFFFFF(256MB)。

      在沒有使用虛擬儲存空間的機器上,虛擬位址被直接送到記憶體匯流排上,使具有相同地址的實體儲存體器被讀寫。而在使用了虛擬儲存空間的情況下,虛擬位址不是被直接送到記憶體位址匯流排上,而是送到記憶體管理單元——MMU(主角終於出現了)。他由一個或一組晶片集成,一般存在與副處理器中,其功能是把虛擬位址映射為物理地址。

 

二、MMU工作過程

      大多數使用虛擬儲存空間的系統都使用一種稱為分頁(paging)。虛擬位址空間劃分成稱為頁(page)的單位,而相應的物理地址空間也被進行劃分,單位是頁框(frame).頁和頁框的大小必須相同。接下來配合圖片我以一個例子說明頁與頁框之間在MMU的調度下是如何進行映射的:

      在這個例子中我們有一台可以產生16位地址的機器,它的虛擬位址範圍從0x0000~0xFFFF(64K),而這台機器只有32K的物理地址,因此他可以運行64K的程式,但該程式不能一次性調入記憶體運行。這台機器必須有一個達到可以存放64K程式的外部儲存空間(例如磁碟或是FLASH)以保證程式片段在需要時可以被調用。在這個例子中,頁的大小為4K,頁框大小與頁相同(這點是必須保證的,記憶體和外圍儲存空間之間的傳輸總是以頁為單位的),對應64K的虛擬位址和32K的實體儲存體器,他們分別包含了16個頁和8個頁框。

      我們先根據解釋一下分頁後要用到的幾個術語,在上面我們已經接觸了頁和頁框,中綠色部分是物理空間,其中每一格表示一個物理頁框。橘黃色部分是虛擬空間,每一格表示一個頁,它由兩部分組成,分別是Frame Index(頁框索引)和位p(present 存在位),Frame Index的意義很明顯,它指出本頁是往哪個物理頁框進行映射的,位p的意義則是指出本頁的映射是否有效,如,當某個頁並沒有被映射時(或稱映射無效,Frame Index部分為X),該位為0,映射有效則該位為1。

    我們執行下面這些指令(本例子的指令不針對任何特定機型,都是偽指令)
例1:
    MOVE REG,0 //將0號地址的值傳遞進寄存器REG.
    虛擬位址0將被送往MMU,MMU看到該虛地址落在頁0範圍內(頁0範圍是0到4095),從我們看到頁0所對應(映射)的頁框為2(頁框2的位址範圍是8192到12287),因此MMU將該虛擬位址轉化為物理地址8192,並把地址8192送到地址匯流排上。記憶體對MMU的映射一無所知,它只看到一個對地址8192的讀請求並執行它。MMU從而把0到4096的虛擬位址映射到8192到12287的物理地址。

例2:
    MOVE REG,8192
    被轉換為
    MOVE REG,24576
    因為虛擬位址8192在頁2中,而頁2被映射到頁框6(物理地址從24576到28671)

例3:
    MOVE REG,20500
    被轉換為
    MOVE REG,12308
    虛擬位址20500在虛頁5(虛擬位址範圍是20480到24575)距開頭20個位元組處,虛頁5映射到頁框3(頁框3的位址範圍是 12288到16383),於是被映射到物理地址12288+20=12308。

      通過適當的設定MMU,可以把16個虛頁隱射到8個頁框中的任何一個,但是這個方法並沒有有效解決虛擬位址空間比物理地址空間大的問題。從中我們可以看到,我們只有8個頁框(物理地址),但我們有16個頁(虛擬位址),所以我們只能把16個頁中的8個進行有效映射。我們看看例4會發生什麼情況

      MOV REG,32780
      虛擬位址32780落在頁8的範圍內,從總我們看到頁8沒有被有效進行映射(該頁被打上X),這是又會發生什嗎?MMU注意到這個頁沒有被映射,於是通知CPU發生一個缺頁故障(page fault).這種情況下作業系統必須處理這個頁故障,它必須從8個物理頁框中找到1個當前很少被使用的頁框並把該頁框的內容寫入外圍儲存空間(這個動作被稱為page copy),隨後把需要引用的頁(例4中是頁8)映射到剛才釋放的頁框中(這個動作稱為修改映射關係),然後從新執行產生故障的指令(MOV REG,32780)。假設作業系統決定釋放頁框1,那麼它將把虛頁8裝入物理地址的4-8K,並做兩處修改:首先把標記虛頁1未被映射(原來虛頁1是被影射到頁框1的),以使以後任何對虛擬位址4K到8K的訪問都引起頁故障而使作業系統做出適當的動作(這個動作正是我們現在在討論的),其次他把虛頁8對應的頁框號由X變為1,因此重新執行MOV REG,32780時,MMU將把32780映射為4108。

      我們大致瞭解了MMU在我們的機器中扮演了什麼角色以及它基本的工作內容是什麼,下面我們將舉例子說明它究竟是如何工作的(注意,本例中的MMU並無針對某種特定的機型,它是所有MMU工作的一個抽象)。

      首先明確一點,MMU的主要工作只有一個,就是把虛擬位址映射到物理地址。
我們已經知道,大多數使用虛擬儲存空間的系統都使用一種稱為分頁(paging)的技術,就象我們剛才所舉的例子,虛擬位址空間被分成大小相同的一組頁,每個頁有一個用來標示它的頁號(這個頁號一般是它在該組中的索引,這點和C/C++中的數組相似)。在上面的例子中0~4K的頁號為0,4~8K的頁號為1,8~12K的頁號為2,以此類推。而虛擬位址(注意:是一個確定的地址,不是一個空間)被MMU分為2個部分,第一部分是頁號索引(page Index),第二部分則是相對該頁首地址的位移量(offset). 。我們還是以剛才那個16位機器結合進行一個執行個體說明,該執行個體中,虛擬位址8196被送進MMU,MMU把它映射成物理地址。16位的CPU總共能產生的位址範圍是0~64K,按每頁4K的大小計算,該空間必須被分成16個頁。而我們的虛擬位址第一部分所能夠表達的範圍也必須等於16(這樣才能索引到該頁組中的每一個頁),也就是說這個部分至少需要4個bit。一個頁的大小是4K(4096),也就是說位移部分必須使用12個bit來表示(2^12=4096,這樣才能訪問到一個頁中的所有地址),8196的二進位碼如所示:

      該地址的頁號索引為0010(二進位碼),既索引的頁為頁2,第二部分為000000000100(二進位),位移量為4。頁2中的頁框號為6(頁2映射在頁框6,見),我們看到頁框6的物理地址是24~28K。於是MMU計算出虛擬位址8196應該被映射成物理地址24580(頁框首地址+位移量=24576+4=24580)。同樣的,若我們對虛擬位址1026進行讀取,1026的二進位碼為0000010000000010,page index="0000"=0,offset=010000000010=1026。頁號為0,該頁映射的頁框號為2,頁框2的物理位址範圍是8192~12287,故MMU將虛擬位址1026映射為物理地址9218(頁框首地址+位移量=8192+1026=9218)。以上就是MMU的工作過程。

三、S3C24XX的MMU工作過程

    下面我們針對s3c2410的MMU(注1)進行講解。
    S3c2410總共有4種記憶體映射方式,分別是:
    1.Fault (無映射)
    2.Coarse Page (粗表)
    3.Section (段)
    4.Fine Page (細表)
    我們以Section(段)進行說明。
    ARM920T是一個32bit的CPU,它的虛擬位址空間為2^32=4G。而在Section模式,這4G的虛擬空間被分成一個一個稱為段(Section)的單位(與我們上面講的頁在本質上其實是一致的),每個段的長度是1M (而我們之前所使用的頁的長度是4K)。4G的虛擬記憶體總共可以被分成4096個段(1M*4096=4G),因此我們必須用4096個描述符來對這組段進行描述,每個描述符佔用4個Byte,故這組描述符的大小為16KB (4byte*4096),這4096個描述符構為一個表格,我們稱其為Tralaton Table.

    是描述符的結構
    Section base address:段基地址(相當於頁框號首地址)
    AP: 存取控制位Access Permission
    Domain: 存取控制寄存器的索引。Domain與AP配合使用,對存取權限進行檢查
    C:當C被置1時為write-through (WT)模式
    B: 當B被置1時為write-back (WB)模式(C,B兩個位在同一時刻只能有一個被置1)
    下面是s3c2410記憶體映射後的一個:

      我的s3c2410上配置的SDRSAM大小為64M,該SDRAM的物理位址範圍是0x3000 0000~0x33FF FFFF(屬於Bank 6),由於1個Section的大小是1M,所以該物理空間可以被分成64個物理段(頁框).

      在Section模式下,送進MMU的虛擬位址(注1)被分為兩部分(這點和我們上面舉的例子是一樣的),這兩部分為 Descriptor Index(相當於上面例子的Page Index)和 Offset,descript index長度為12bit(2^12=4096,從這個關係式你能看出什嗎?:) ),Offset長度為20bit(2^20=1M,你又能看出什嗎?:)).觀察一下一個描述符(Descriptor)中的Section Base Address部分,它長度為12 bit,裡面的值是該虛擬段(頁)映射成的物理段(頁框)的物理地址前12bit,由於每一個物理段的長度都是1M,所以物理段首地址的後20bit總是為0x00000(每個Section都是以1M對齊),確定一個物理地址的方法是 物理頁框基地址+虛擬位址中的位移部分=Section Base Address<<20+Offset ,呵呵,可能你有點糊塗了,還是舉一個實際例子說明吧。

      假設現在執行指令MOV REG, 0x30000012,虛擬位址的二進位碼為00110000 00000000 00000000 00010010,前12位是Descriptor Index= 00110000 0000=768,故在Translation Table裡面找到第768號描述符,該描述的Section Base Address="0x0300",也就是說描述符所描述的虛擬段(頁)所映射的物理段(頁框)的首地址為0x3000 0000(物理段(頁框)的基地址=Section Base Address左移20bit=0x0300<<20=0x3000 0000),而Offset=000000 00000000 00010010=0x12,故虛擬位址0x30000012映射成的物理地址=0x3000 0000+0x12=0x3000 0012(物理頁框基地址+虛擬位址中的位移)。你可能會問怎麼這個虛擬位址和映射後的物理地址一樣?這是由我們定義的映射規則所決定的。在這個例子中我們定義的映射規則是把虛擬位址映射成和他相等的物理地址。我們這樣書寫映射關係的代碼:
void mem_mapping_linear(void)
{
    unsigned long descriptor_index, section_base, sdram_base, sdram_size;
    sdram_base=0x30000000;
    sdram_size=0x 4000000;
    for (section _base= sdram_base,descriptor_index = section _base>>20;
         section _base < sdram_base+ sdram_size;
         descriptor_index+=1;section _base +=0x100000)
    {
         *(mmu_tlb_base + (descriptor_index)) = (section _base>>20) | MMU_OTHER_SECDESC;
    }
}

      上面的這段段代碼把虛擬空間0x3000 0000~0x33FF FFFF映射到物理空間0x3000 0000~0x33FF FFFF,由於虛擬空間與物理空間空間相吻合,所以虛擬位址與他們各自對應的物理地址在值上是一致的。當初始完Translation Table之後,記得要把Translation Table的首地址(第0號描述符的地址)載入進副處理器CP15的Control Register2(2號控制寄存器)中,該控制寄存器的名稱叫做Translation table base (TTB) register。

      以上討論的是descriptor中的Section Base Address以及虛擬位址和物理地址的映射關係,然而MMU還有一個重要的功能,那就是存取控制機制(Access Permission )。簡單說存取控制機制就是CPU通過某種方法判斷當前程式對記憶體的訪問是否合法(是否有許可權對該記憶體進行訪問),如果當前的程式並沒有許可權對即將訪問的記憶體地區進行操作,則CPU將引發一個異常,s3c2410稱該異常為Permission fault,x86架構則把這種異常稱之為通用保護異常(General Protection),什麼情況會引起Permission fault呢?比如處於User層級的程式要對一個System層級的記憶體地區進行寫操作,這種操作是越權的,應該引起一個Permission fault,搞過x86架構的朋友應該聽過保護模式(Protection Mode),保護模式就是基於這種思想進行工作的,於是我們也可以這麼說:s3c2410的存取控制機制其實就是一種保護機制。那s3c2410的存取控制機制到底是由什麼元素去參與完成的呢?它們間是怎麼協調工作的呢?這些元素總共有:
    1.副處理器CP15中Control Register3:DOMAIN ACCESS CONTROL REGISTER
    2.段描述符中的AP位和Domain位
    3.副處理器CP15中Control Register1(控制寄存器1)中的S bit和R bit
    4.副處理器CP15中Control Register5(控制寄存器5)
    5.副處理器CP15中Control Register6(控制寄存器6)
    DOMAIN ACCESS CONTROL REGISTER 是存取控制寄存器,該寄存器有效位為32,被分成16個地區,每個地區由兩個位組成,他們說明了當前記憶體的存取權限檢查的層級,如所示:


      每地區可以填寫的值有4個,分別為00,01,10,11(二進位),他們的意義如下所示:


    00:當前層級下,該記憶體地區不允許被訪問,任何的訪問都會引起一個domain fault
    01:當前層級下,該記憶體地區的訪問必須配合該記憶體地區的段描述符中AP位進行權檢查
    10:保留狀態(我們最好不要填寫該值,以免引起不能確定的問題)
    11:當前層級下,對該記憶體地區的訪問都不進行許可權檢查。
      我們再來看看discriptor中的Domain地區,該地區總共有4個bit,裡面的值是對DOMAIN ACCESS CONTROL REGISTER中16個地區的索引.而AP位配合S bit和A bit對當前描述符描述的記憶體地區被存取權限的說明,他們的配合關係如所示:

    AP位也是有四個值,我結合執行個體對其進行說明.
    在下面的例子中,我們的DOMAIN ACCESS CONTROL REGISTER都被初始化成0xFFFF BDCF,如所示:

例1:
Discriptor 中的domain=4,AP=10(這種情況下S bit ,A bit 被忽略)
假設現在我要對該描述符描述的記憶體地區進行訪問:
由於domain=4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01,系統會對該訪問進行存取權限的檢查。
假設當前CPU處於Supervisor模式下,則程式可以對該描述符描述的記憶體地區進行讀寫操作。
假設當前CPU處於User模式下,則程式可以對該描述符描述的記憶體進行讀訪問,若對其進行寫操作則引起一個permission fault.

例2:
Discriptor 中的domain=0,AP=10(這種情況下S bit ,A bit 被忽略)
domain=0,而DOMAIN ACCESS CONTROL REGISTER中field 0的值是11,系統對任何記憶體地區的訪問都不進行存取權限的檢查。
由於統對任何記憶體地區的訪問都不進行存取權限的檢查,所以無論CPU處於合種模式下(Supervisor模式或是User模式),程式對該描述符描述的記憶體都可以順利地進行讀寫操作

例3:Discriptor 中的domain=4,AP=11(這種情況下S bit ,A bit 被忽略)
由於domain=4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01,系統會對該訪問進行存取權限的檢查。
由於AP=11,所以無論CPU處於合種模式下(Supervisor模式或是User模式),程式對該描述符描述的記憶體都可以順利地進行讀寫操作

例4:
Discriptor 中的domain=4,AP=00, S bit="0",A bit="0"
由於domain=4,而DOMAIN ACCESS CONTROL REGISTER中field 4的值是01,系統會對該訪問進行存取權限的檢查。
由於AP=00,S bit="0",A bit="0",所以無論CPU處於合種模式下(Supervisor模式或是User模式),程式對該描述符描述的記憶體都只能進行讀操作,否則引起permission fault.
通過以上4個例子我們得出兩個結論:
1.對某個記憶體地區的訪問是否需要進行許可權檢查是由該記憶體地區的描述符中的Domain域決定的。
2.某個記憶體地區的存取權限是由該記憶體地區的描述符中的AP位和副處理器CP15中Control Register1(控制寄存器1)中的S bit和R bit所決定的。

 

 

原文地址:http://blog.chinaunix.net/u3/101649/showart_210084

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.