根据虚拟地址,如何求出页号和偏移量?

方法掌握

在这里插入图片描述
虚拟地址划分成虚拟页号虚拟页偏移量
物理地址同样可划分为物理页号物理页偏移量

如何划分,关键点在于页面的大小。

假设给你一个十进制表示的地址20000,一个页面的大小为4KB,那么如何找出地址20000的具体位置呢?

先不探讨这个问题的答案,先来看看下面的这个举例。
在这里插入图片描述

如果有12个人,头上的数字代表他的学号,按照学号低到高排序。一个组有三个人(一个组的大小为3),如何判断学号为8的人在哪一个组,又在哪一个组的第几个呢?
在这里插入图片描述
现在在回过来看假设给你一个十进制表示的地址20000,一个页面的大小为4KB,那么如何找出地址20000的具体位置呢?
和上面的原理是一样的:地址从0开始的、页号从0开始。要注意:地址是按字节编的,可以理解为一个地址就占1字节。
所以:20000 / (4 * 1024) = 4 …… 3616
即虚拟地址20000的虚拟页号为4、偏移量为3616。

根据这个原理:20000化为二进制位100111000100000
在这里插入图片描述
后12位为偏移量,前面的则代表页号。100化为十进制就是4、111000100000化为十进制就是3616。

上面的原理实际上是很简单地,如果后12位全是1,就是一个4KB页面的大小,再加1——>那么后面12全变为0,第13位+1,页面就+1——>跳到下一个页面……

按照这个点,可以知道

  • 如果页面为8KB,后13位为偏移量、前面为页号。
  • 如果页面为16KB,后14位为偏移量、前面为页号。

解题技巧

  • 如果给你十进制的,则页号 = 地址 / 页面大小(编程取整),偏移量 = 地址 % 页面大小。
  • 如果给其他方便化为二进制的,比如二进制、十六进制。按照比特位来计算,如果页面为8KB,后13位为偏移量、前面为页号。 如果页面为16KB,后14位为偏移量、前面为页号。

以上内容的基础是没有采用多级页表,只有一级页表。如果采用多级页表可以避免把所有的页表存放在内存中。对于二级页表的计算,基本都会给你划分好位数,直接按照之前的方法计算就可以了,可能偶尔需要变通,原理都差不多的。

训练题

一、【该题取自《现代操作系统》】对下面的每个十进制虚拟地址,分别使用4KB页面和8KB页面计算虚拟页号和偏移量:20000, 32768, 60000

分析:
使用4KB页面时各地址的虚拟页号和偏移量

  • 20000
    20000 / (4 * 1024) = 4 ……3616
    虚拟地址20000所在虚拟页号为4、偏移量为3616
  • 32768
    32768/(4 * 1024) = 8……0
    虚拟地址32768所在虚拟页号为8、偏移量0
  • 60000
    60000/(4 * 1024) = 14……2656
    虚拟地址60000所在虚拟页号为14、偏移量为2656

使用8KB页面时各地址的虚拟页号和偏移量

  • 20000
    20000 / (8 * 1024) = 2 ……3616
    虚拟地址20000所在虚拟页号为2、偏移量为3616
  • 32768
    32768/(8 * 1024) = 4……0
    虚拟地址32768所在虚拟页号为4、偏移量0
  • 60000
    60000/(4 * 1024) = 7……2652
    虚拟地址60000所在虚拟页号为7、偏移量为2656

二、【来源未知,取自网络】假设计算机系统的页面大小为4KB,进程P的页面变换表如下表所示。若P要访问的逻辑地址为十六进制3C20H,那么该逻辑地址经过地址变换后,其物理地址应为()

页号物理块号
02
13
25
36

A、2048H
B、3C20H
C、5C20H
D、6C20H

分析:
逻辑地址也就是虚拟地址为3C20H、地址后面的这个H是为了标注它是十六进制的表示法。化为二进制就是 011 1010 0010 0000。页面大小为4KB、则后12位表示偏移量、前面的表示虚拟页号、可知所在虚拟页号为011即虚拟页号为3。通过上面的表可知,虚拟页3映射到物理页6,偏移量在虚拟页和物理页都是一样的,所以选D

  • 2
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
根据题意,可以得到以下信息: - 虚拟地址空间大小为 $2^{48}$,即能够表示的最大地址为 $0xFFFFFFFFFFFF$。 - 采用 4 级表,每个级别用 9 个 bit 表示表项的序,因此每个表项的大小为 $2^9\times8=2^6\times2^9=512$ 字节。 - 当前 CPU 访问的内存地址为 0x000000008003。 我们需要根据这些信息来计算出 CPU 访问的内存地址对应的虚拟偏移量。 首先,将当前 CPU 访问的内存地址转化为二进制数,得到: ``` 0000 0000 0000 0000 0000 0000 1000 0000 0000 0011 ``` 接着,我们将这个二进制数按照 4 级表的结构进行划分。由于每个表项的大小为 512 字节,因此第一级表可以覆盖 $2^9\times512=2^{18}$ 字节的虚拟地址空间,第二级表可以覆盖 $2^9\times2^{18}=2^{27}$ 字节的虚拟地址空间,以此类推。因此,可以得到如下划分: ``` Level 4: 0000 0000 0000 Level 3: 0000 0000 0000 Level 2: 0000 0000 0000 Level 1: 0000 0100 0000 Offset : 0000 0000 1000 ``` 由于当前 CPU 访问的内存地址所在的表项在第一级表中,因此我们只需要关注第一级表的情况。根据题意,第一级表可以用 9 个 bit 表示表项的序,因此可以将第一级表的虚拟地址空间划分为 $2^9$ 个部分。由于当前 CPU 访问的内存地址在第 65 个部分中(即第 64 个表项),因此 CPU 访问的内存地址对应的虚拟为: ``` 0000 0100 0000 = 0x40 ``` 偏移量为: ``` 0000 0000 1000 = 0x8 ``` 因此,CPU 访问的内存地址对应的虚拟为 0x40,偏移量为 0x8。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小酥诶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值