从给定页表的逻辑地址中查找物理地址



下面是一个页面表-在此处输入图像描述

假设一个页面的大小为16000字节。我如何计算物理地址,比如说逻辑地址1000。以下是我已经算出的。逻辑内存=8页逻辑内存大小=8 x 16000字节

物理内存=8帧物理内存大小=8 x 16000字节

现在给定1000的逻辑地址,它将映射到第3帧中的第一页因此,考虑到帧0、帧1、帧2全部为16000 x 3字节。1000将位于16000 x 3+1000的位置因此物理地址将为=4900字节

这是一个正确的方法吗?

这是一种正确的方法吗?

是。澄清:

给定一个逻辑地址;将其拆分为多个部分,如:

offset_in_page = logical_address % page_size;
page_table_index = logical_address / page_size;

然后从页面表中获取页面的物理地址:

physical_address_of_page = page_table[page_table_index].physical_address = page_table[page_table_index].frame * page_size;

然后在页面内添加偏移量以获得最终物理地址:

physical_address = physical_address_of_page + offset_in_page;

注:

  • CPU(或MMU(将使用页面表条目中的其他信息进行各种检查(例如,检查页面是否存在,检查您是否正在写入"只读"页面,等等(。当手动进行转换时,您也必须进行这些检查(例如,当将逻辑地址转换为物理地址时,正确的答案可能是"没有物理地址,因为页面不存在"(。

  • 模和除法(以及乘法(是昂贵的。在实际硬件中,页面大小总是2的幂,因此模和除法可以用掩码和移位来代替。页面大小永远不会是16000字节(但可以是16384字节或0x4000字节或"2的14次方"字节,使得CPU可以执行offset_in_page = logical_address & 0x3FFF;page_table_index = logical_address >> 14;(。出于类似的原因,页表条目通常通过使用OR将页的物理地址与其他标志(存在/不预设、可写/只读等(合并来构造,并且将使用and从页表条目(如physical_address_of_page = page_table[page_table_index] & 0xFFFFC000;(中提取物理地址;帧编号";参与任何计算。

  • 对于真实的系统(以及现实的理论示例(,使用十六进制来表示地址要容易得多(以便更容易在头脑中进行掩码和移位=例如0x1234567 & 0x03FFFF = 0x0034567很容易(。出于这个原因(以及类似的原因,如确定缓存中的位置、物理地址路由和总线中的解码等(,逻辑和物理地址永远不应该使用十进制。

  • 对于真实的系统,几乎总是存在多个级别的页表。在这种情况下,方法基本相同——您将逻辑地址拆分为更多的部分(例如,可能是offset_in_pagepage_table_indexpage_directory_index(,并进行更多的表查找(例如,可以是page_table = page_directory[page_directory_index].physical_address;,然后是physical_address_of_page = page_table[page_table_index].physical_address;(。

最新更新