嵌入式Linux学习笔记(四)-内存管理单元mmu
一、内存管理单元MMU介绍内存管理单元简称MMU,它负责虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查。MMU使得每个用户进程拥有自己独立的地址空间,并通过内存访问权限的检查保护每个进程所用的内存不被其他进程破坏。
重点就在于地址映射:页表的结构与建立、映射的过程。
嵌入式Linux学习笔记(四)-内存管理单元mmu
一、内存管理单元MMU介绍内存管理单元简称MMU,它负责虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查。MMU使得每个用户进程拥有自己独立的地址空间,并通过内存访问权限的检查保护每个进程所用的内存不被其他进程破坏。
重点就在于地址映射:页表的结构与建立、映射的过程。
1、S3C2440 MMU地址变换过程
1)地址的分类
一个程序在运行之前,没有必要全部装入内存,仅需要将那些要运行的部分先装入内存,其余部分在用到时从磁盘载入,当内存不足时,再将暂时不用的部分调出到磁盘。
这使得大程序可以在较小的内存空间中运行,也使得内存中可以同时装入更多的程序并发执行,这样的存储器一般称为虚拟存储器。
虚拟地址最终需要转换为物理地址才能读写实际的数据,通过将虚拟地址空间和物理空间划分为同样大小的空间(段或页),然后两个空间建立映射关系。
由于虚拟地址空间远大于物理地址,可能多块虚拟地址空间映射到同一块物理地址空间,或者有些虚拟地址空间没有映射到具体的物理地址空间上去(使用到时再映射)。
ARM cpu地址转换涉及三种地址:虚拟地址(VA,Virtual Address)、变换后的虚拟地址(MVA,Modified Virtual Address)、物理地址(PA,Physical Address)
没有启动MMU时,CPU核心,cache,MMU,外设等所有部件使用的都是物理地址。
启动MMU后,CPU核心对外发出虚拟地址VA;VA被转换为MVA供cache,MMU使用,在这里MVA被转换成PA;最后使用PA读取实际设备
①CPU核心看到和用到的只是虚拟地址VA,至于VA如果去对应物理地址PA,CPU核心不理会 ②caches和MMU看不到VA,他们利用MVA转换得到PA
③实际设备看不到VA、MVA,读写它们使用的是物理地址PA
MVA是除CPU核心外的其他部分看到的虚拟地址,VA与MVA的变化关系
如果VA<32M,需要使用进程标识号PID(通过读CP15的C13获得)来转换为MVA
if (VA < 32M) then
MVA = VA | (PID << 25)
else
MVA = VA
使用MVA,而不使用VA的目的是,当有重叠的VA时,转换为MVA地址并不重叠,减小转换为PA的代价
比如两个进程1、2,VA都是0-(32M-1),则MVA分别为0x02000000-0x03ffffff,0x04000000-0x05ffffff。 下文说到虚拟地址,如果没有特别指出,就是指MVA
2)虚拟地址到物理地址的转换过程
arm cpu使用页表来进行转换,页表由一个个条目组成,每个条目存储一段虚拟地址对应的物理地址及访问权限,或者下一级页表的地址