mmu記憶體管理單元主要負責虛擬位址到實體地址的對映。在沒有使用虛擬儲存器的機器上,虛擬位址被直接送到記憶體匯流排上,使具有相同位址的物理儲存器被讀寫。而在使用了虛擬儲存器的情況下,虛擬位址不是被直接送到記憶體位址匯流排上,而是送到記憶體管理單元—mmu,再由mmu對映到物理記憶體中。
如上圖所示,使用了mmu的叫做虛擬位址,沒有使用的就是實體地址。
虛擬位址與實體地址之間是如何轉換的了?下面這一篇個人覺得講的挺透徹的
對於arm架構,常用的為**-頁表,常用的有段對映,乙個**大小為1m,
大多數使用虛擬儲存器的系統都使用一種稱為分頁(paging)。虛擬位址空間劃分成稱為頁(page)的單位,而相應的實體地址空間也被進行劃分,單位是頁框(frame).頁和頁框的大小必須相同。
二.程式
1.makefile
objs := head.o init.o leds.o
mmu.bin : $(objs)
arm-linux-ld -tmmu.lds -o mmu_elf $^
arm-linux-objcopy -o binary -s mmu_elf $@
arm-linux-objdump -d -m arm mmu_elf > mmu.dis
%.o:%.c
arm-linux-gcc -wall -o2 -c -o $@ $<
%.o:%.s
arm-linux-gcc -wall -o2 -c -o $@ $<
clean:
rm -f mmu.bin mmu_elf mmu.dis *.o
2.mmu.lds
sections
second 0xb0004000 : at(2048)
}3.head.s
.text
.global _start
_start:
ldr sp, =4096 @ 設定棧指標,以下都是c函式,呼叫前需要設好棧
bl disable_watch_dog @ 關閉watchdog,否則cpu會不斷重啟
bl memsetup @ 設定儲存控制器以使用sdram
bl copy_2th_to_sdram @ 將第二部分**複製到sdram
bl create_page_table @ 設定頁表
bl mmu_init @ 啟動mmu
ldr sp, =0xb4000000 @ 重設棧指標,指向sdram頂端(使用虛擬位址)
ldr pc, =0xb0004000 @ 跳到sdram中繼續執行第二部分**
@ ldr pc, =main
halt_loop:
b halt_loop
4.init.c
/** init.c: 進行一些初始化,在steppingstone中執行
* 它和head.s同屬第一部分程式,此時mmu未開啟,使用實體地址
*/ /* watchdog暫存器 */
#define wtcon (*(volatile unsigned long *)0x53000000)
/* 儲存控制器的暫存器起始位址 */
#define mem_ctl_base 0x48000000
/** 關閉watchdog,否則cpu會不斷重啟
*/void disable_watch_dog(void)
/** 設定儲存控制器以使用sdram
*/void memsetup(void)
;int i = 0;
volatile unsigned long *p = (volatile unsigned long *)mem_ctl_base;
for(; i < 13; i++)
p[i] = mem_cfg_val[i];}/*
* 將第二部分**複製到sdram
*/void copy_2th_to_sdram(void)}/*
*設定頁表
*/void create_page_table(void)
}/** 啟動mmu
*/void mmu_init(void)
4.main.c
與第一張所用的led.c一樣
本次程式在前面的基礎上實現了兩個功能
1.使虛擬位址0xa0000000對映為0x56000000(暫存器位址)
2.0xb0000000對映為0x30000000
MMU記憶體管理單元介紹
本篇文章簡要闡述mmu的概念,以及以段位址的轉換過程為例,簡單說明mmu將虛擬位址轉換成實體地址的過程。更多詳細內容請檢視 arm mmu 中文手冊 pdf mmu的實現過程,實際上就是乙個查表對映的過程。建立頁表 translate table 是實現mmu功能不可缺少的一步。頁表是位於系統的記憶...
記憶體管理單元MMU實驗
mmu介紹 許可權管理 當我們使用windows時,有時候會彈出位址訪問錯誤,但這不影響整個作業系統的執行。假設a b程式的時序圖如下 因為a b程式的位址空間各不相同。許可權管理就使得a程式無法訪問b程式的位址。如果a程式寫的非常糟糕,a程式並不能破壞核心。假如有兩個hello.c檔案,如圖 這兩...
MMU記憶體管理單元簡介
mmu 全稱叫做 memory manage unit,也就是記憶體管理單元。在老版本的 linux 中要求處理器必須有 mmu,但是現在 linux 核心已經支援無 mmu 的處理器了。mmu 主要完成的功能如下 虛擬位址 va,virtual address 實體地址 pa,physcicala...