Page table

Page table

页表

页表是可以简化的,原来的页表:

可以观察出,若当页面号连续时,可以将页表简化为一个数组,数组元素中存放数组下标(即页面号)所对应的页框号

页面大小

  • 若逻辑地址长度为 m bits,页面大小:2^n Bytes
    • 页内位移占n bits
    • 页号占m-n bits
1
2
3
4
5
6
7
#:~$uname -m     //查看CPU架构
x86_64
#:~$getconf PAGESIZE //获取当前页面大小
4096

# 由于 4096Byte = 2 ^ 12 n=12 , 系统为 64 位 故 m=64 (理论上)
# 但由于 64 位地址太大了,实际上我们只使用了 48位用来表示逻辑地址

define

  • The operating system maintains(维护) a copy(副本) of the page table for each process.
  • This copy is used to translate(转化) logical addresses to physical addresses.
  • It is also used by the CPU dispatcher(派遣器) to define the hardware page table when a process is to be allocated the CPU.:当一个进程要被分配到CPU时,它也被CPU调度器用来定义硬件页表。
  • Paging therefore increases the context-switch(上下文切换) time

快表

HARDWARE PAGE TABLE(硬件页表)

  • The page table is kept in main memory, and a pagetable base register (PTBR) points to the page table.
  • Changing(切换) page tables requires changing only this one register, substantially(大幅的) reducing(减少) context-switch time.
  • With this scheme(方案), two memory accesses are needed to access a byte (one for the page-table entry, one for the byte).:在这种方案下,访问一个字节需要两次内存访问(一次为页表条目(寻找对应页面),一次为字节)。

TLB

  • TLB(Translation(转换) Look-aside(旁路) Buffer(缓冲区)) is a kind of small, fast-lookup(快速查找) hardware cache. It is used with page tables in the following way(以下方式).
    • The TLB contains only a few of (少数)the page-table entries(条目).这些条目的总称为快表
    • When a logical address is generated by(被生成) the CPU, its page number is presented(提交) to the TLB.
    • If the page number is found, its frame number is immediately available(可用的) and is used to access memory.
    • If TLB miss(没有命中), a memory reference to the page table must be made.

  • The percentage(百分比) of times that the page number of interest is found in the TLB is called the hit ratio(命中率).

基于页的保护与共享

保护

  • 为了防止地址转换时出现异常,可在页表每个条目 设置一个“valid-invalid”比特位,用于表示该页 的有效性。
  • 这个方法可以被轻松扩 展以提供更好的保护级别,如两个bit可实现 “只读”、“读 写”、“可执行”等。

共享

如图,进程P1 P2 P3 对应的页表中均含有 3 4 6 号页面,这意味着3 4 6 号页面被三个进程所共享,只有特定的内容才可以被共享,一般具有只读属性

多级页表

页表大小

  • 假设CPU是32bits,采用的逻辑地址是32bits,那么 进程的逻辑地址空间大小为2 32Bytes,即4G Bytes。
    • 若页面大小是4K Bytes,则一个进程最多被分成 4G/4K = 1M个页 面,也就是说进程的页表最多有1M个页表项;
    • 若每个页表项占用4Bytes,则每个页表最多占用 1M B* 4B = 4MBytes ,由于页大小为4k,故需要 4M/4K 1K个连续页框。

问题来了,1k个连续的页框应该如何解决?
这里采用的方法时将页表也拆散

页表页

我们将进程分为(p#0 p#1 p#2 …… p#7),将其存放在页表中,根据页表可以查询到对应的页框,但是由于页表较大需要连续分配2个页框,但我们希望将页表分开存储以达到内存灵活,因此设计了页表页。首先将页表按照页框大小分若个个并标号,将页表离散的存储到页框中,页表页中记录了页表对应的编号和存放到对应页框的对应关系,这样就实现了页表的离散存储。当然对应的逻辑地址也要发生改变。这种分页方法我们称为二级页表

多级页表

  • 上面是一个32位地址采用两级页表的例子,页面大 小是4KBytes,第一级页表页的数量是1K个,每个页 表页中包含的页面数量也是1K个。
  • 下面是x86-64架构CPU采用的四级页表方案

参考:https://www.bilibili.com/video/BV1bf4y147PZ/