庖丁解牛式剖析详解linux内核内存管理子系统-MMU介绍

MMU是什么?

MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是SOC内部的一个硬件模块

MMU有什么作用?

MMU的作用是把虚拟地址转换为物理地址,之前篇章咱们捋过,CPU依照PC寄存器的指示不断地取指、译码、执行。我们可以使用objdump -d a.out命令读取下ELF文件的内容
在这里插入图片描述
一个ELF可执行文件里边存的是一条条机器指令,每条指令有一个地址位置,PC寄存器的值就是某个指令的位置值,当依据PC寄存器值去取指令时,这个值是个虚拟的值,它不是真实物理内存的地址值,这个需要虚拟值需要经过MMU硬件模块的转换,转换成真实值,也就是常说内存条中的位置,进过MMU转换才能把真实物理内存的地址内保存的指令返送给CPU。MMU转换的依据是什么?就是页表,跟进页表查询到虚拟地址对应的物理地址。
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0cfbd0b2770849a181ff96f556906a18.png

为什么要有MMU?

假如CPU有两个程序要同时运行,如果没有MMU的话,PC的值就是真实的物理地址了,如果其中一个程序先占用了0x0000-0x2000的内存地址,这个程序还没执行完的话,另外一个程序要执行的话它就不能再使用0x0000-0x2000空间的内存了,假如你的程序编写时用的也是0x0000-0x2000空间的内存,那你就得手动改为其他地址空间了,这岂不是非常麻烦。有了MMU部件的转换作用,我们不同的程序的编译器给的虚拟地址空间都一样,只是在程序运行时由操作系统操控MMU进行虚拟地址到物理地址的映射转换,不需要程序员手动的设置,这样方便多了。其实这就是软件工程思想解耦 重要体现

MMU是怎么工作的?

在这里插入图片描述
假设我们虚拟地址就32位,2级页表,比如虚拟地址是0x1812078,如上图所示,高10位为一级页表的索引,高10位值为12,次高10位值是32,最低12位值是78,如上图所示CR3寄存器存放的是一级页表的基址,首先从CR3寄存器取出一级页表的基址,也可以理解为一个数组的地址,我们取虚拟地址最高10位值也就是12,取出一级页表的基址的index为12的元素,这个元素存的值是二级页表的基址,然后取虚拟地址次高10位值也就是32,再取其第32个元素中的值,这个值就是转换后的物理地址基址,在使用取虚拟地址低12位78(是物理页内的偏移量)加上刚才得到的物理地址基址,最后算得的这个物理地址值就是对应的虚拟地址,这就是MMU转换的简略过程。不同程序的一级页表的基址是不一样的,因此链接时虚拟地址相同的程序,在运行的时候因为一级页表基地址不同,通过MMU转化后物理地址是不一样的。我们在这里只是给你理解下虚拟地址到物理地址大致的转换过程是什么,详细的可以参看下边的链接,
https://www.jianshu.com/p/646cc463789f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值