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
,此参数就是要取消映射的虚拟地址空间首地址。