嵌入式Linux开发——(三)内存管理单元MMU
一、内存管理单元mmu(Memory Management Unit)
1)作用:
负责虚拟地址到物理地址的映射,并提取硬件机制的内存访问权限检查。
2)S3C2410 / S3C2440的特征:
①4种映射长度:段(1MB)、大页(64KB)、小页(4KB)、极小页(1KB)
3)地址转换:
为何需要虚拟地址映射到物理地址?
①实际程序可能很大,需要的内存空间超过了内存总容量
②系统中多程序同时执行,它们所需的内存空间超过总内存空间
③VA--->MVA:
④MVA--->PA:
A、只有一级页表的地址转换:
B、具有两级页表的地址转换:
4)内存的访问权限检查
①作用:决定一块内存是否读/写
②CP15寄存器C3(域访问控制)、描述符的域(Domain)、CP15寄存器C1的R/S/A位、描述符的AP位等联合作用。
③S3C2440有16个域,CP15寄存器C3中每两位对应一个域
每个域中两位数据
00 |
无权限访问 |
任何的访问都会导致“Domain Fault”异常 |
01 |
客户模式 |
使用段描述符、页描述符进行权限检查 |
10 |
保留 |
相当于“无权限访问” |
11 |
管理模式 |
不进行权限检查,允许任何访问 |
5)TLB(Translation Lookaside Buffers转译查找缓存)的作用
①MVA--->PA:
A、使用一级页表进行地址转换时,每次读/写数据,需要访问两次内存,第一次访问一级页表获得物理地址,第二次访问才真正进行读/写。
B、使用二级页表进行地址转换时,每次读/写数据,需要访问三次内存,前两次访问一级页表、二级页表获得物理地址,第三次访问才真正进行读/写。
②利用TLB来缓存近期用到的页表条目,避免每一次都到主内存中查找,提高CPU性能。
6)Cache(高速缓冲存储器)的作用
①基于程序访问的局部性,在主内存和CPU通用寄存器之间设置一个高速的、容量相对较小的存储器,把正在执行的指令地址附近的一部分指令或数据从主内存调入这个存储器中,供CPU在一段时间内的使用。
②启用Cache后,CPU写数据有两种方式
A、写穿式(Write Through)
CPU发出的写信号送到Cache时,也写入主内存。
B、写回式(Write Back)
数据一般只写到Cache,在Cache中设置一标志地址及数据陈旧信息,只有Cache中数据换出或强制进行“清空”时,才将原更新数据写入主内存的相应单元中。
7)MMU使用实例:地址映射
①开发板SDRAM物理地址:0x30000000---0x33FFFFFF
②S3C2440的寄存器物理地址:0x48000000---0x5FFFFFFF
③本章开启MMU将虚拟地址空间:0xA0000000---0xA0100000-----》物理地址空间:0x56000000---0x5610000
虚拟地址空间:0xB0000000---0xB3FFFFFF-----》物理地址空间:0x30000000---0x33FFFFFF
④本章只用一级页表,以段方式进行地址映射
32位CPU-------------4GB
由4096个描述符来表示,每个描述符对应1MB空间
每个描述符占用4字节
所以一级页表占:4 X 4096 = 16KB
所以使用SDRAM开始的16KB来存放一级页表,剩下的内存的开始物理地址为0x30004000