页表基址寄存器 (PTBR) 如何使用页码定位正确的帧?

问题描述

我正在阅读 OS 中的分页,我看到的其中一件事是页表基址寄存器 (PTBR)。

如果 cpu 生成逻辑地址(由页号 + 偏移量组成),则需要映射到物理地址(由帧号 + 偏移量组成)。

在映射过程中,首先要在该过程的Page表中查找,得到那个页面对应的Frame。

现在要访问页表,我们需要获取该进程的页表在主内存中的位置。

页表的起始位置存储在称为页表基址寄存器(PTBR)的寄存器中。

现在逻辑地址的页码部分加上PTBR中的值,在表中找到对应的帧如下:

PTBR

由于 PTBR 将页表的物理基地址存储在内存中(例如 14000),而逻辑地址包含 cpu 要从中读取数据的页码,现在我的问题是:

逻辑地址的页码部分是页的起始地址吗?

例如:虚拟地址为 16 位,每页大小为 1KB

页面 0 --->从虚拟地址 0 开始

第 1 页 --->从虚拟地址 1024 开始

第 2 页 --->从虚拟地址 2048 开始

等等......

所以如果 cpu 想从第 1 页读取数据,那么页码是“1024”,然后将该值与 PTBR 中的值相加?

添加页码本身例如:如果cpu要从“第1页”读取数据,那么数字“1”代表页码值,何时添加到PTBR值? cpu 是否以其他方式处理页码或起始地址?

我知道这对你们中的很多人来说很愚蠢,但它真的让我感到困惑,因为我找不到任何关于它的真实例子。

问候

解决方法

页码从 0 开始,到 N 结束。

所以这是错误的:

所以如果 CPU 想从第 1 页读取数据,那么页码是“1024”,然后将该值与 PTBR 中的值相加?

让我们以你的例子为例。

虚拟地址为16位,每页大小为1KB

如果页面大小为 1KB,则意味着要访问其中的任何数据,我们需要 10 位。因为 2^10 = 1024。

如果CPU想访问进程逻辑地址空间的地址1024,CPU会要求MMU(Memory Management Unit)给他这个地址处的值。

二进制的 1024 是 1 0000 0000 00。

然后 MMU 将划分地址,所以

6 + 10 = 16 位

其中前 6 (16 - 10) 位代表页码。

最后 10 位是偏移量。

因此,我们的偏移量为 0,页码为 1(五个 0 和一个 1(构成 1024 的那个))。

如果页表由一个表表示:

unsigned int page_table[MAX_PAGES];

该表的地址将是 PTBR。

所以MMU会看到这个地址中的帧号:

PTBR + page_number (e.g. 1) * entry_size (e.g. sizeof(unsigned int))

如果我犯了错误,请随时纠正我。