MMU 全稱叫做 Memory Manage Unit,也就是內存管理單元。
在老版本的 Linux 中要求處理器必須有 MMU,但是現在 Linux 內核已經支持無 MMU 的處理器了。
MMU 主要完成的功能如下:
- ①完成虛擬空間到物理空間的映射,即地址映射。
- ②內存保護,設置存儲器的訪問權限,設置虛擬存儲空間的緩衝特性。
虛擬地址(VA,Virtual Address)、物理地址(PA,PhyscicalAddress)的概念:
對於 32 位處理器來說,虛擬地址範圍是 2^32=4GB。
主板上有 512MB 的 DDR3,即 512MB 的物理內存,經過 MMU 可以將其映射到整個 4GB 的虛擬空間。
圖解:
開啓了MMU,就不能直接往物理地址寫數據。
物理內存和虛擬內存之間的轉換,需要用到兩個函數:ioremap 和 iounmap
- ioremap 函數用於獲取指定物理地址空間對應的虛擬地址空間,定義在 arch/arm/include/asm/io.h 文件中
- iounmap 函數用於釋放掉 ioremap 函數所做的映射
ioremap 是個宏,有兩個參數:cookie 和 size,真正起作用的是函數__arm_ioremap,此函數有三個參數和一個返回值
phys_addr | 要映射的物理起始地址 |
size | 要映射的內存空間大小 |
mtype |
ioremap 的類型,可以選擇 MT_DEVICE、MT_DEVICE_NONSHARED、 MT_DEVICE_CACHED 和MT_DEVICE_WC,ioremap 函數選擇 MT_DEVICE
|
返回值 | __iomem 類型的指針,指向映射後的虛擬空間首地址 |
iounmap只有一個參數 addr,此參數就是要取消映射的虛擬地址空間首地址。