ARM MMU 建立頁表

2021-06-22 04:59:34 字數 4197 閱讀 1089

二、記憶體的訪問許可權檢查

記憶體的訪問許可權檢查決定一塊記憶體是否允許讀/寫。這由cp15暫存器c3(域訪問控制)、描述符的域(domain)、cp15暫存器c1的r/s/a位和描述符的ap位共同決定。「域」決定是否對某塊記憶體進行許可權檢查,"ap"決定如何對某塊內容進行許可權檢查。s3c2440有16個域,cp15暫存器c3中每兩位對應乙個域(一共32位),用來表示這個域是否進行許可權檢查。

每兩位資料的含義:00---無訪問許可權(任何訪問都將導致"domain fault"異常);01---客戶模式(使用段描述符、頁描述符進行許可權檢查);10---保留(保留,目前相當於「無訪問許可權」);11---管理模式(不進行許可權檢查,允許任何訪問)。"domain"占用4位,用來表示記憶體屬於0-15哪乙個域。

三、tlb和cache

首先說兩者都是利用程式訪問的區域性性原理,通過設定高速、小容量的儲存器來提高效能。

1.(tlb---translation lookaside buffers,轉譯查詢快取):由於從mva到pa的轉換需要訪問多次記憶體,大大降低了cpu的效能,故提出tlb辦法改進。當cpu發出乙個虛擬位址時,mmu首先訪問tlb。如果tlb中含有能轉換這個虛擬位址的描述符,則直接利用此描述符進行位址轉換和許可權檢查,否則mmu訪問頁表找到描述符後再進行位址轉換和許可權檢查,並將這個描述符填入tlb中,下次再使用這個虛擬位址時就直接使用tlb用的描述符。使用tlb需要保證tlb中的內容與頁表一致,在啟動mmu之前,頁表中的內容發生變化後,尤其要注意。一般的做法是在啟動mmu之前使整個tlb無效,改變頁表時,使所涉及的虛擬位址對應的tlb中條目無效。

2.(cache,快取記憶體):為提高程式的執行速度,在主存和cpu通用暫存器之間設定乙個高速的、容量相對較小的儲存器,把正在執行的指令位址附近的一部分指令或資料從主存調入這個儲存器,供cpu在一段時間內使用。

★寫資料的兩種方式:①(write through,寫穿式)---任一cpu發出寫訊號送到cache的同時,也寫入主存,保證主存的資料同步更新。優點是操作簡單,但由於主存速度慢,降低了系統的寫速度並占用了匯流排的時間。②(write back,回寫式)---資料一般只寫到cache,這樣可能出現cache中的資料得到更新而主存中的資料不變(資料陳舊)的情況。此時可在cache中設乙個標誌位址及資料陳舊的資訊,只有當cache中的資料被換出或強制進行」清空「操作時,才將原更新的資料寫入主存響應的單元中,保證了cache和主存中資料一致。

★cache有以下兩個操作:①(clean,清空)---把cache或write buffer中已經髒的(修改過,但未寫入主存)資料寫入主存。②(invalidate,使無效)---使之不能再使用,並不將髒的資料寫入主存。

★s2c2440內建了(icaches,指令cache)、(dcaches,資料cache)和(write buffer,寫快取),操作時需要用到描述符中的c位(ctt)和b位(btt)。①(icaches,指令cache)---系統剛上電或復位時,icaches中的內容是無效的,並且icaches功能關閉。往icr位(cp15協處理器中暫存器1的第12位)寫1可以啟動icaches,寫0停止icaches。icaches一般在mmu開啟後使用,此時描述符的c位用來表示一段記憶體是否可以被cache。若ctt=1,允許cache,否則不允許。如果mmu沒有開啟,icaches也可以被使用,此時cpu讀取指令時所涉及的記憶體都被當做允許cache。icaches關閉時,cpu每次取指都要讀取主存,效能低,所以通常盡早啟動icaches。icaches開啟後,cpu每次取指時都會先在icaches中檢視是否能找到所用指令,而不管ctt是0還是1。如果找到成為cache命中,找不到稱為cache丟失,icaches被開啟後,cpu的取指有如下三種情況:cache命中且ctt為1時,從icaches中取指,返回cpu;cache丟失且ctt為1時,cpu從主存中取指,並且把指令快取到cache中;ctt為0時,cpu從主存中取指。②(dcaches,資料cache)---與icaches相似,系統剛上電或復位時,dcaches中的內容無效,並且dcaches功能關閉,write buffer中的內容也是被廢棄不用的。往ccr位(cp15協處理器 中暫存器1的第二位)寫1啟動dcaches,寫0停止dcaches。write buffer和dcaches緊密結合,額公尺有專門的控制來開啟和停止它。與icaches不同,dcaches功能必須在mmu開啟之後才能被使用。dcaches被關閉時,cpu每次都去內訪問資料。dcaches被開啟後,cpu每次讀寫資料時都會先在dcaches中檢視是否能找到所要的資料,不管ctt是0還是1,找到了稱為cache命中,找不到稱為cache丟失。

★使用cache時需要保證cache、write buffer的內容和主存內容一致,保證下面兩個原則:①清空dcaches,使主存資料得到更新。②使無效icaches,使cpu取指時重新讀取主存。

在實際編寫程式時,要注意如下幾點:①開啟mmu前,使無效icaches,dcaches和write buffer。②關閉mmu前,清空icaches、dcaches,即將「髒」資料寫到主存上。③如果**有變,使無效icaches,這樣cpu取指時會從新讀取主存。④使用dma操作可以被cache的記憶體時:將記憶體的資料傳送出去時,要清空cache;將記憶體的資料讀入時,要使無效cache。⑤改變頁表中位址對映關係時也要慎重考慮。⑥開啟icaches或dcaches時,要考慮icaches或dcaches中的內容是否與主存保持一致。⑦對於i/o位址空間,不使用cache和write buffer。

四、mmu、tlb及cache的控制指令

s3c2410除了arm920t的cpu核心外,還有若干個協處理器,用來幫助主cpu完成一些特殊功能,對mmu、tlb及cache等的操作就涉及到協處理器。格式如下:

協處理器編碼,協處理器操作碼1,目的暫存器,源暫存器1,源暫存器2,協處理器操作碼2

p#,,rd,cn,cm

mrc  //從協處理器獲得資料,傳給arm920t cpu核心暫存器

mcr  //資料從arm920t cpu核心暫存器傳給協處理器

//執行條件,省略時表示無條件執行

p#  //協處理器序號

//乙個常數

rd  //arm920t cpu核心的暫存器

cn和cm  //協處理器中的暫存器

//乙個常數

其中,、cn、cm、僅供協處理器使用,它們的作用如何取決於具體的協處理器。

示例**解析:

開啟mmu,並將虛擬位址0xa0000000~0xa0100000對映到實體地址0x56000000~0x56100000(gpfcon實體地址為0x56000050,gpfdat實體地址為0x56000054);將虛擬位址0xb0000000~0xb3ffffff對映到實體地址0x30000000~0x33ffffff。本示例以段的方式進行位址對映,只使用一級頁表,通過上面內容可知一級頁表使用4096個描述符來表示4g空間(每個描述符對應1mb),每個描述符佔4位元組,所以一級頁表佔16kb。使用sdram的開始16kb存放一級頁表,所以剩下的記憶體開始位址就為0x30004000,這個位址最終會對應虛擬位址0xb0004000(所以**執行位址為0xb0004000)。

★程式執行主要流程的示例**。

.text

.global _start

_start:

bl  disable_watch_dog                   @ 關閉watchdog,否則cpu會不斷重啟

bl  mem_control_setup                  @ 設定儲存控制器以使用sdram

ldr sp, =4096                                    @ 設定棧指標,以下是c函式呼叫前需要設好棧

bl  copy_2th_to_sdram                   @ 將第二部分**複製到sdram

bl  create_page_table                     @ 設定頁表

bl  mmu_init                                      @ 啟動mmu,啟動以後下面**都用虛擬位址

ldr sp, =0xb4000000                       @ 重設棧指標,指向sdram頂端(使用虛擬位址)

ldr pc, =0xb0004000                        @ 跳到sdram中繼續執行第二部分**

halt_loop:

b   halt_loop

★設定頁表。

void create_page_table(void)

}★ 啟動mmu。

void mmu_init(void)

linux頁表建立與更新

頁表結構示意圖 zz 圖3.3 linux的 頁表結構 linux總是假定處理器有 頁表。每個頁表通過所包含的下級頁表的頁面框號來訪問。圖3.3給出了虛擬位址是如何分割成多個域的,每個域提供了 某個指定頁表的偏移。為了將虛擬位址轉換成實體地址,處理器必須得到每個域的值。這個過程將持續三次直到對應於虛...

著手建立核心永久頁表

得到了總的頁面數 max pfn 和高階頁面數 highmem pages 之後,來到 setup arch 的947 行,呼叫 函式來建立系統初始化階段的臨時分頁體系,傳入的引數意義代表從 0 max low pfn 對應的32 位實體地址 低 12位全為 0,也就是頁面對齊 在函式 函式中先後呼...

核心頁表和程序頁表

初學核心時,經常被 核心頁表 和 程序頁表 搞暈,不知道這到底是個啥東東,跟我們平時理解的頁表有和關係 核心頁表 程序頁表 每個程序自己的頁表,放在程序自身的頁目錄task struct.pgd中。在保護模式下,從硬體角度看,其執行的基本物件為 程序 或執行緒 而定址則依賴於 程序頁表 在程序排程而...