部分**:
一、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的工作過程。
MMU工作原理
許多年以前,當人們還在使用dos或是更古老的作業系統的時候,計算機的記憶體還非常小,一般都是以 k為單位進行計算,相應的,當時的程式規模也不大,所以記憶體容量雖然小,但還是可以容納當時的程式。但隨著圖形介面的興起還用使用者需求的不斷增大,應用程式的規模也隨之膨脹起來,終於乙個難題出現在程式設計師的面...
mini2440裸機之MMU(二 mmu
mini2440裸機之mmu 二 mmu.c 智在天涯 include def.h include option.h include 2440addr.h include 2440lib.h include 2440slib.h include mmu.h 段 section 是大小為1mb的儲存塊...
ARM中mmu的對映原理與配置步驟
在mmu啟動之前 1.將ttb放置在cp15的c2的高18位 注 構建一級頁表是對所選的對映進行設定,配置domain ap 等 有關mmu的轉換過程 我的理解 1 虛擬位址中的前12位位址他可以反映本次描述符在一級頁表中的索引 即ttb 前12位位址 2 對於頁對映 一級頁表的前12位存放二級頁表...