下面是一个页面表-在此处输入图像描述
假设一个页面的大小为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_page
、page_table_index
和page_directory_index
(,并进行更多的表查找(例如,可以是page_table = page_directory[page_directory_index].physical_address;
,然后是physical_address_of_page = page_table[page_table_index].physical_address;
(。