为啥要有多级页表
假设系统用单页表,现有32位地址空间、大小为4k的页面、PTE(页表条目)的大小为4B
那内存可以分为2^20 个页,即需要2^20 个PTE,那内存中需要一直存在一个2^20*4B(4MB)的页表
那如果是64位机呢?(因为64位机虚拟地址空间远远大于物理内存大小,所以目前一般只用2^48位或更少的地址空间)
即2^52*4B(16777216G)的页表常驻内存中???
其实页表大小就是内存(可寻址字节数)大小除以页面大小,因为用一个4B的PTE指向了4K的页面,所以页表大小就是虚拟内存大小/2^10 ,即虚拟地址空间越大,页表也随之变大,两者只差2^10倍。
由此可见,单页表在计算机位数较大时是不合适的
- PTE为啥大小为4B呢?
因为地址空间为32位,即32位可以指向虚拟地址空间的任一字节,也就是4B的PTE可以指向任一地址
多级页表
因为单页表大小会随着虚拟地址空间的增加而增加,而为了快速查找页表地址连续,一个页表一次会得到被分配的连续内存(即页表就是页表项数组),所以一个页表如果有一个条目(PTE)在使用,整个页表都会加载在内存中
多级页表其实就是对页表实施分页管理,即内存中只常驻一级页表,一级页表的每个PTE指向一个二级页表的基地址,以此类推,最后一级页表存储物理块号和块内偏移量,因为页和块的大小相等,所以页偏移量和块偏移量相等,只块号不同,即虚拟地址通过查页表就是完成了页号到块号的转换
页表分级后,使用到的虚拟地址空间对应的一系列页表加载到内存中,其他没用到的页表就可以不占用内存,若内存紧张,还可将虽有映射关系但不常用的页表调换到磁盘上,等到需要时再通过缺页中断调回内存中
访问多级页表看起来要花费更多的时间去查表,但实际上因为有TLB(快表)的存在,多级页表的地址翻译并不比单页表慢很多
上面在总结多级页表的查询速度时提到了快表(TLB),正因为有快表的存在才使得多级页表模式下页的查询不会非常慢,因为快表如果缓存了该页的页表项(PTE),MMU会根据快表缓存的物理页号(PPN)计算出物理地址。得到物理地址后,去查高速缓存,若命中则得到数据。在这个过程中:
- 通过快表得到PPN避免了至少一次内存访问
- 通过高速缓存得到数据避免一次内存访问
这就大大加快了计算机获取数据的速度,弥补了多级页表查询速度上的不足
快表
集成在cpu内部的一个独立的硬件缓冲区,是cpu的缓存。快表中存储的是页表中最常用的一些页表项(PTE)中的物理页号(PPN)。当cpu访问一个VA(虚拟地址)时,首先通过VA中的VPN(虚拟页号)分为两部分在TLB中查找,若命中,则获得物理页号,否则就得去页表逐级查找。
此处应有图->快表->va划分
找不到好的画图工具,图见csapp第九章,574页
高速缓存
位于cpu内部,分为很多组,每组又分为多块,块中存储页内给定偏移量的数据(1B)
高速缓存图,574页
其实地址翻译就是将虚拟页号转换成物理页号,因为页的大小和块的大小相同,所以其偏移量也相同。在查快表时,VA中的偏移量部分发送至高速缓存去定位目标值,所以当快表命中时,得到的PPN直接可以和高速缓存中查到的块的标志位进行比较,如果相同,则高速缓存命中,否则通过PPN和PPO合成的PA去访问内存获取数据
高速缓存的标志位就是PPN(物理页号),用来判断是不是要找的物理页,因为高速缓存通过偏移量(VPO)定位,即找到的数据只能确定是这个偏移量的数据,但不知道是哪个块的,只有等到快表中查出的PPN和高速缓存中查到的标志位比对后,才能判断是否缓存命中
未解决的问题
为啥。。。哦明白了突然想通啊哈哈哈
[已解决 ] 原问题:VPN和VPO都是一串二进制为啥不都用VPN找快表和高速缓存
一个VPN对应很多VPO,即VPN相同VPO不同,
- 大部分书和博客的页表项都含有页块号(vpn,ppn),但是他俩就是对应位置的数组下标,还有必要存吗?csapp的意思好像是不用存。?