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

Operating system 从给定页表的逻辑地址中查找物理地址,operating-system,page-tables,Operating System,Page Tables,下面是一个页面表- 假设页面大小为16000字节。如何计算逻辑地址1000的物理地址。 以下是我已经得出的结论。 逻辑内存=8页 逻辑内存大小=8 x 16000字节 物理内存=8帧 物理内存大小=8 x 16000字节 现在给定1000的逻辑地址,它将映射到第3帧中的第一页 所以考虑到frame0,frame1,frame2都是16000 x 3字节。 1000将位于16000 x 3+1000位置 因此,物理地址将为=49000字节 这是正确的方法吗 这是正确的方法吗 对。澄清: 给定一个

下面是一个页面表-

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

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

现在给定1000的逻辑地址,它将映射到第3帧中的第一页 所以考虑到frame0,frame1,frame2都是16000 x 3字节。 1000将位于16000 x 3+1000位置 因此,物理地址将为=49000字节

这是正确的方法吗

这是正确的方法吗

对。澄清:

给定一个逻辑地址;将其拆分为以下几部分:

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就可以在页面=逻辑地址&0x3FFF;和
    页面表格索引=逻辑地址>>14;
    )中进行偏移。出于类似的原因,页表条目通常通过使用页的物理地址或将页的物理地址与其他标志(存在/未预设、可写/只读等)合并来构造,并将用于从页表条目中提取物理地址(如
    physical\u address\u of\u page=page\u table[page\u table\u index]&0xFFFFC000;
    )而且在任何计算中都不会涉及任何“帧号”

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

  • 对于实际系统,几乎总是有多个级别的页表。在这种情况下,方法基本相同-您将逻辑地址分成更多的部分(例如,
    page\u-code>和
    page\u-table\u-index
    page\u-directory\u-index
    ),并进行更多的表查找(例如,
    page\u-table=page\u-directory[page\u-index].physical\u address;
    然后
    physical\u address\u of\u page=page\u table[page\u table\u index]。physical\u address;