一,前言
以前看过MMU,因为这是单片机OS中没有的,当时我记得理解的不是很清晰,包括MMU中哪部分是硬件的,哪部分是软件的都没有太搞清楚。由于看了一个自己写linux操作系统的视频,里面有介绍MMU,且演示了虚拟地址和物理地址的转换,此时我才深刻的理解了,所以在看qemu源码的内存管理前,我先复习下linux的内存管理,本章blog主要复习MMU。
二,分析
- 逻辑地址通过分段形成了线性地址空间(由虚拟地址构成),然后虚拟地址通过分页机制MMU转换到物理地址。
- 线性地址空间,段的base地址+offset0作为线性地址空间的start,base地址+限长度,也就是这个进程可用的最大size。这就是线性地址空间的概念,它由一个段中GDT的线性地址最大构成。
- 段Base地址+偏移=某一个虚拟地址,即可以找到某个字节。但是这个字节如何映射到物理地址中某个字节呢?就是通过分页机机制(MMU)。虚拟地址(逻辑地址)也可以叫线性地址。
- 拿x86的芯片举例GDTR寄存器保存了GDT的首地址+界限(总描述符字节长度),GDT数据结构的8字节内容。选择子是13bit,也就是2^13=8192个选择。
- 关于分页中,页目录和页表的最后12bit是属性位,主要是有效属性,可读写属性,权限属性,脏页,可访问等。
6. 有了分段为什么还要有分页?分段和分页比较大的2个区别是,分页是固定4K的,分段可以设置任意大小,分段最大仅8192项。所以可以理解为仅用分段比较浪费内存,分页就变成更小颗粒度了,后来除了伙伴算法还发明了slub技术比分页的颗粒度更小的object来分配内存。另外一个重要的原因是考虑到fork的机制包括了复制内存表,但是不同的进程缺有不同的物理空间,主要就是靠分页不同。
三,小结
本次我了解了MMU的实现方式,那么就很容易的区分了MMU技术中哪些是硬件实现的,哪些是软件实现的。软件其实就是要构建GDT表保存在内存物理地址中,然后芯片硬件中有GDTR等base地址的寄存器用来保存GDT表的首地址,按上图的段选择符也是一个寄存器,偏移量也是一个寄存器。分页中有类似的寄存器用来保存表页的首地址和offset等信息,那么芯片硬件就可以计算出物理地址了。
所以开启了MMU功能,只要填充完分段和分页表的内容到内存且写入相关寄存器后,当软件代码写入一个虚拟地址,硬件会自动写入到对应的物理地址中。而我以前没有搞清楚,导致我无法思考它是如何实现的原因是不了解这些内核寄存器。arm芯片的话主要是TTBR寄存器。
标签:分页,物理地址,MMU,虚拟地址,--,地址,寄存器,Apple From: https://blog.51cto.com/u_16247275/7615238