内存管理的必要性
- 很早之前计算机只能运行单个进程,就算运行批处理程序,也是棑好对,一个一个的进行处理,不存在多个进程并发运行,这时候内核对于内存管理相对比较简单,直接把物理内存地址拿过来是使用即可。
- 随着计算机演进,支持多进程的OS,多个进程都都使用同一个物理地址空间,很容易多个进程之间相互干扰而引起进程的不可预期的行为。为了解决这个问题,CPU中的MMU(内存管理单元)引入了虚拟地址空间。以32位操作系统经为例,每个进程都可以拥有4G的寻址空间,当进程需要内存时候,通过转换技术和虚拟地址进行关联。MMU通过分页的机制,提供进程的虚拟地址到物理地址的映射方法。段页机制是MMU机制提供,Linux内核是使用者。
MMU的内存管理机制
- 在x86体系结构下CPU对内存寻址都是通过分段和分页方式进行,在保护模式下,一个段的可以理解为
基地址 段的界线 类型
。进程的虚拟地址就是在段中的偏移量;线性地址就是在某个段中基地址 偏移地址
得出的地址;在x86中MMU提供了分页机制,如果未开启,那么线性地址就是物理地址;反之需要经过分页机制换算后,线性地址才能转为物理地址。MMU对于内存的管理主要是分段和分页,CPU把生成的逻辑地址交给MMU内的分段单元,分段单元为每个逻辑地址生成一个线性地址,然后再将线性地址交给MMU的分页单元,最终生成物理内存的地址。
分段和分页机制
- 每个逻辑地址由两部份组成,段标识符: 段内偏移量。段标识符是由一个16位长的字段组成,称为段选择符。其中前13位是一个索引号。后面3位包含一些硬件细节,段的起始地址,段的长度,段的访问权限等,都会保存在段描述表中。
- 在x86体系结构中,MMU支持多级分页模型,一般分为三种情况;第一种,32位系统中则是两级分页模型;如果在32位系统中开启了PAE(物理地址扩展模式),则为三级分页模型;在64位系统中则为四级分页模型。80x86的分页机制是由CR0寄存器中的PG位开启,如果PG=1则开启分页机制,把线性地址转为物理地址;如果PG=0,禁用分页机制,直接把分段单元产生的线性地址当做物理地址使用。
- 32位或者64位系统的逻辑地址中,经过分段单元,把逻辑地址转换为线性地址,在由分页单元,根据这个地址去查找对应多级页目录,根据页目录查找页表,最终得到物理地址。
- 页表
- 虚拟地址和物理地址映射关系