基本页表和二级页表的思路和比较
基本页表
默认块号大小为4KB。
(页表项由 页号 和 块号 组成)
块号是内存的。
块号 -> 物理地址
内存的块号是唯一的,通过它能得到内存内的物理地址。
块号为0,它的物理地址为0。
比如块号为3,它的物理地址是4KB*3 = 12288。
页表:通过页表知道进程的4KB数据块,存放在内存的哪个4KB的空间内;
逻辑地址转换:一个逻辑地址通过计算后,得到在内存中的物理地址。
计算机为32位,按字节编址。逻辑地址也为32位。
页内偏移量为12位,是因为每个页面固定大小为4KB = 212B。
页号有20位,可以认为系统最多有220个页面(内存大小最大为220*4KB = 4GB)。
我们得到一个逻辑地址如何算出真实的物理地址?
前面的20位的页号就是内存的块号,通过前面的方法(块号 -> 物理地址)。
比如块号为n,偏移量为w,物理地址为n*4KB+w
。
这个n有很多种算法
我们可以使用除法,逻辑地址 / 页面大小。(除法相当于二进制移位)
或者我们可以和计算机硬件的处理方式,前面的20位就是页号(块号)
一级页表需要扩充成二级页表的原因:
页表是连续存放的。(页表在存储时,只存块号,前面的页号是不存的(比如C语言的数组是不存下标的,所以需要连续存放,从而可以快速算出某个元素存放的地址))
页表的优点是,页表的块可以分散存放,但是页表又需要连续存放,这就体现不出它的优点了,所以我们引进了二级页表。
二级页表
我们前面说过了一级页表,是只存储内存块号的。
假设内存块号大小是220,我们用4B = 32位 来存放内存块号。不用3B存的原因是 为了一个页面正好能装下整数个页表项(如取成4B,一页正好能装下1K个页表项)。
以一个40MB的进程为例,页表项共40KB(40MB/4KB*4B)大小,如果按照一级页表的存法,我们需要10个连续的页框(40KB/4KB)。
我们思考二级页表如何使得这10个页面不需要连续了?
思路:
顶级页表最多只能有一个页面。(这是规定)
一个页面可以存放1K个页表项4KB/4B = 1K。
所以顶级页表虽然只有一个页面但是可以存放1K个页表项,其中每一个页表项对应的是下一级的1K个页表项。所以可以存放的最大空间是1K* 1K *4KB = 4GB内存。
我们知道在一级页表中页号有20位。二级页表我们不需要连续存放了,所以这就是一级页号和二级页号只有10位(1K)的原因。
参考资料:
- (视频)https://www.bilibili.com/video/BV1YE411D7nH
- (书籍)2021操作系统考研复习指导-王道论坛