目录
一.相关概念(页帧、页框、缺页中断)
二.页表分页机制
(一).为什么采用两级页表
(二).两级页表分页机制
①原理:
②映射原理计算
一.相关概念(页帧、页框、缺页中断)
在linux中,创建进程时会同时创建一个mm_struct代表虚拟地址空间,再通过页表和MMU映射到内存(即物理内存)中。
首先,我们需要知道的是,linux的磁盘是以4KB为一个基本存储单元,即页帧。内存也是以4KB为基本存储单元,即页框。linux通过struct Pages结构体管理页框,页框总数是内存大小/4,因此linux中使用Pages结构体数组管理内存。
CPU运行进程前会将程序加载进内存。即磁盘数据写入内存中对应的页框,struct Pages数组对应下标位置的Pages结构体进行记录,页表再填充相关映射关系,也就是缺页中断。一切准备工作做好之后才会运行进程。
二.页表分页机制
(一).为什么采用两级页表
linux的页表分页采用两级页表分页机制。
而没有采用单级页表直接映射到物理内存是基于空间大小的考虑。
以32位机器为例,页框的个数为4GB / 4KB也就是2^20次方个,假设一个表项占有4Byte,总共有4MB的连续空间需要使用,也就是说,每次调度进程时,这4MB的空间都要被使用。
而两级分页因为存在第二级映射,虽然两级页表加起来依旧是4MB,但这是一级页表 + 所有二级页表的和。而调度进程只需使用一级页表 + 特定的一个二级页表,因此,使用的空间要比单级页表少。
(二).两级页表分页机制
①原理:
linux将虚拟地址的32位分为前10位、中间10位、后置12位。
前置10位作为一级页表的索引映射中间10位,中间10位作为二级页表的索引映射到内存中的页框的起始地址,再根据后置12位找到特定页框中具体地址。后置12位即页内偏移。
本质上页表只是映射到具体的页框,再根据偏移量找到物理地址。
即物理地址 = 页框起始地址 + 页内偏移量。
原理图如下:
②映射原理计算
虚拟地址前20位是两级页表的索引,共能索引出2^20次方个页框,内存共4GB即2^20次方个页框,因此正好与之一一对应。
每个页框4KB,共有4x1024个地址,即2^12次方,页内偏移即虚拟地址后12位,也是2^12次方,正好可以偏移出一个页框中全部地址。
如有错误,敬请斧正