问题描述
我正在阅读 OS 中的分页,我看到的其中一件事是页表基址寄存器 (PTBR)。
如果 cpu 生成逻辑地址(由页号 + 偏移量组成),则需要映射到物理地址(由帧号 + 偏移量组成)。
在映射过程中,首先要在该过程的Page表中查找,得到那个页面对应的Frame。
现在要访问页表,我们需要获取该进程的页表在主内存中的位置。
页表的起始位置存储在称为页表基址寄存器(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))
如果我犯了错误,请随时纠正我。