【CPU】页,帧,页表,页表项,三级页表
目录
页和帧
页表
页偏移
页表项
页面属性
RISC-V SV39标准
三级页表
索引方式
物理地址
玄铁C906内存管理流程(参考)
页和帧
虚拟内存采用一种分页机制,即将虚拟内存空间以一定的大小分割成一个一个的内存块,并且将物理内存空间以同样的大小分块。虚拟内存块称为页(page),物理内存块称为帧(frame),两者大小相同,内存块的大小也被称为页偏移(page offset),需要运行的程序就被划分为一个一个页,当需要用到某页的代码或数据时,操作系统通知硬件将该页从外存中读入内存,并占用物理内存中的一个页帧。这样,每一个程序都能够根据需要合理地分配在物理内存中。每个虚拟页有自己的虚拟页号VPN(Virtual Page Number),代表该虚拟页处在虚拟内存中哪一个内存块,对于物理页也一样。
页表
页表(Page Table)是由操作系统维护的数据结构,页表记录了虚拟页与物理页(即页帧)之间的映射关系,以及该页的属性(可读、可执行等等),通常页表是一个很大的数据结构,所以也放在内存中
页偏移
指示虚拟内存被分割成的块大小,一般为4KB
页表项
每个页表项占用64 bits的空间,每个页表项由物理页号PPN和页面属性两部分组成。
页表中的一个条目就对应着一个页表项(页表由页表项组成)
页面属性
RISC-V SV39标准
标准规定了虚拟地址通过三级页表转换为物理地址。支持39位虚拟内存空间与40位物理地址空间。
39 位的虚拟地址空间决定了如何索引三级页表。具体来说,39 位虚拟地址被划分为三个 9 位的部分(VPN[2]、VPN[1] 和 VPN[0]),分别用于索引顶级页表、二级页表和三级页表。
三级页表
多级页表类似于将一个大的页表分割为了很多小的页表,将虚拟页号按高位分类,以虚拟页号的高9位、中间9位以及低9位对页进行划分,将不同的页放在页表中,不同的页表放在页目录中,由页指针指向这些页目录的首地址。
- VPN[2](9 位):用于索引顶级页表/页目录指针(PDPTR:page directory PTR)。
- VPN[1](9 位):用于索引二级页表/页目录(PD:page directory)。
- VPN[0](9 位):用于索引三级页表/页表(PT:page table)。
在三级页表中,每一级页表都有可能存在叶子页表项(PTE)。但也包含着非叶子页表项,非叶子页表项中储存的物理地址为指向下一级页表的指针。
页目录指针的索引由SATP寄存器中提供的物理页号与虚拟页号的高9位拼接而成,由于页表项为64位,所以处于所有级页表的页表项低三位为0(八字节对齐)。也即一级页表访存地址为 {SATP.PPN, VPN[2], 3’b0},使用该地址去访问顶级页表/页目录指针,得到页表项,通过页表项中的属性判断是否为叶子页表项,如是,则访问页表结束,虚拟地址与物理地址之间的转换完成;如果不是,当页面属性的X、W、R均为0时表明该表项为指向下一级页表的指针,将表项中的物理地址与虚拟地址的中间9位拼接作为下一级页表的索引。
玄铁C910支持4KB,2MB,1GB三种页面大小,虚拟页号(VPN)低9位加上虚拟地址低12位作为大小为2MB页面的页偏移,VPN低18位加上虚拟地址低12位作为大小为1GB页面的页偏移。
在三级页表中,每一级页表都有可能存在叶子页表项,在页目录指针中可能存在1GB页的叶子页表项,在页目录中可能存在2MB页的叶子页表项。
索引方式
软件提供39bit的物理地址,39位的虚拟地址空间指示了三级页表中的索引方式,通过 VPN 找到页表中的目标叶子表项,而页内偏移用于确定页内的具体位置。得到页表项后,通过它包含的物理帧号以及判断页面属性是否正确,来获取最终转换过后的物理地址。
- 39 位虚拟地址空间 决定了如何索引三级页表。虚拟地址被划分为三个 9 位的 虚拟页面号(VPN),分别用于索引顶级页表、二级页表和三级页表。
- VPN 用于逐级查找页表,最终找到 叶子表项,而 页内偏移(Offset) 只用于确定页内的具体位置。
- 叶子表项 包含 物理帧号(PFN) 和 页面属性。MMU 会检查页面属性,确保访问权限正确,然后将 PFN 与 Offset 组合,生成最终的 物理地址。
物理地址
最终的物理地址 = 叶子页表项中的物理页号PPN + 虚拟地址中的12bit偏移量
玄铁C906内存管理流程(参考)
要看不懂页字了……
参考链接:玄铁C910微架构学习(13)——内存管理单元 - 知乎