【问题标题】:Use of offset in virtual addresses在虚拟地址中使用偏移量
【发布时间】:2017-04-12 11:26:13
【问题描述】:

据我了解,CPU 总是生成一个由两部分组成的虚拟地址——页码和页偏移量。页号用于索引页表(对应的映射给出了帧在 RAM 中的起始地址)。现在,请考虑以下问题。考虑机器的字长为4字节,页面大小等于帧大小=4096字节。

  1. 假设页码为4,偏移量为3,则逻辑内存中的第4页映射到虚拟内存中的第8帧。这意味着帧的起始地址是 8。
  2. 现在,每帧将包含 4096/4= 1024 个字。偏移量是否意味着框架内的一个词,因为机器总是一次取一个词?我的意思是这是否意味着第 8 帧中的第三个单词?
  3. 是给 CPU 的特定字还是整个帧?如果是前者,那为什么大家都在讲框架和页面而不是文字?
  4. 假设发生页面错误。这意味着特定页面不在内存中。这是否意味着映射的物理地址包含其他页面?在无效位为 1 的情况下,映射是否存在。

有人可以帮我清理一下吗?前一刻我似乎明白了,下一刻,我进入了迷宫。

【问题讨论】:

    标签: memory-management operating-system cpu-architecture


    【解决方案1】:

    分页的关键在于它处理“块”内存。
    它是一个映射,一个函数,将虚拟地址转换为物理地址,但不是基于地址的地址。相反,连续虚拟地址的“块”被一起翻译成另一个连续“块”,现在是物理地址。
    您可以将其视为对“块”内存的“翻译”或“洗牌”。

    “块”的正确术语是页面
    如果尝试进行示例映射,您会看到每个页面都包含一组地址,这些地址都具有特殊性:它们的低位 在从虚拟到物理传递时不会改变。相反,高位是任意的。
    地址值的这种二分法定义了偏移量页/帧号
    偏移量是地址值中不经过任何转换的部分。 在一个 4KiB 的页面中,有 4096 个地址,每个地址都有自己的偏移量,因此偏移量的大小为 log2(4096) = log2(212) = 12 * log2(2) = 12 位。
    简而言之,页面大小决定了偏移量大小。

    有必要将内存分成页面而不是单词或字节,或者在另一种观点中,有必要将地址分组以转换为页面。
    如果没有页面,用于翻译的元数据,用行话来说就是各个级别的页表,会比被翻译的要占用更多的内存!

    由于它们的定义方式,偏移量相对于它们的页面/帧:第 8 帧中的偏移量 1024(十六进制 400h)表示地址 8000h + 400h = 8400h;如果页面映射到第 12 帧,则偏移量 1024 在帧开始之后仍然是 1024 字节,0c000h + 400h = 0c400h。

    作为一个地址,偏移量通常表示一个字节,在架构中字节不可寻址的事件。但是,这不是标准约定,要知道偏移量是表示一个字还是一个字节(例如,如果帧 0 的偏移量 10 是字节 40 还是字节 10),请查看架构手册。第一部分通常专门用于建立一个贯穿全书的术语。

    分页发生在 CPU 访问内存之前,您可以将其视为高级进程。访问内存/总线的单元大多不知道它,因此 CPU 读取指令告诉它读取的数据(一个字、一个字节等)。
    人们谈论移动页面是因为页面是可以表征的最小单位
    您可以将页面标记为不存在,但不能标记单词。您可以将页面设为只读,但不能设为单词。
    如果你需要映射,比如说 16 个字节,你仍然需要映射整个页面,因为 16 个字节是不可表征的。所以我们不妨读一整页。

    当发生页面错误时,意味着访问的页面在页表中的任何级别都不存在。
    这可能意味着很多事情,从简单地切换当前位(页面仍然存在)到页面已保存到磁盘并在内存中归零的事实。
    由于映射函数是 total,这意味着每个值都是有效值,因此 CPU 需要一种方法来知道值何时无效。
    Present 位执行此操作:告诉 CPU 不得执行转换,而必须引发异常。
    操作系统使用此异常来通知何时需要页面,它不需要将映射重新分配到另一个页面或将内存归零。
    当人们说页面被删除时,他们的意思是它已从映射中删除,所有现代操作系统也会将该页面归零,以防止信息泄露给其他进程。

    因此,如果一个物理帧没有被映射,并不意味着另一个进程中的另一个页面正在映射它,它只是意味着该地址范围不能被访问。
    如上所述,操作系统这样做有很多原因,包括保护。

    【讨论】:

      【解决方案2】:

      你的事情有点倒退。操作系统为每个进程定义了一个逻辑地址空间。逻辑地址空间被划分为称为 PAGES 的内存单元。

      操作系统将地址的页面逻辑映射到物理页框或辅助存储如果操作系统将页面映射到辅助存储,则使用虚拟内存。

      在过去,所有进行逻辑内存转换的系统总是将虚拟内存映射到辅助存储。这就是为什么虚拟记忆翻译和逻辑记忆翻译这两个术语经常混为一谈的原因。如今,在没有虚拟内存的情况下进行逻辑翻译变得越来越普遍。

      通过一个进程的所有地址访问都是对逻辑地址的。处理器将逻辑地址转换为页框。如果逻辑页面存在但映射到辅助存储,则访问该页面会触发页面错误。操作系统必须处理故障,将逻辑/虚拟页重新映射到物理页框;将数据从二级存储加载到页框;并重新启动说明。

      1. 假设页码为4,偏移量为3,则逻辑内存中的第4页映射到虚拟内存中的第8帧。这意味着帧的起始地址是 8。

      这毫无意义。逻辑页面在映射到辅助存储时是虚拟的。如果页码为 4,则第 4 个逻辑页可以:

      a) 根本没有映射(访问冲突)

      b) 映射到物理页框

      c) 映射到辅助存储(虚拟内存)

      1. 现在,每帧将包含 4096/4= 1024 个字。偏移量是否意味着框架内的一个词,因为机器总是一次取一个词?我的意思是这是否意味着第 8 帧中的第三个单词?

      在几乎所有(如果不是全部)当前的处理器中,都没有内存字;只有字节。系统总线获取内存,总线的“字长”可能(而且经常)不同于处理器的“字长”。

      1. 是给 CPU 的特定字还是整个帧?如果是前者,那为什么大家都在用框架和页面而不是文字来谈论迁移?

      进程看到与正在执行的指令相关的大小传输。操作数大小可以大于或小于机器字。总线将数据传输到内存,并且内存大小经常与机器的字长不同。

      假设发生页面错误。这意味着特定页面不在内存中。这是否意味着映射的物理地址包含其他页面?在无效位为1的情况下,映射是否存在。

      我在上面给出了逻辑页面映射的三种可能性。如何指示这些是系统特定的。一些系统使用 2 位来表示 a、b 或 c。其他的则使用单个位来表示 (b),并要求操作系统确定是 (a) 还是 (c)。

      是否触发缺页取决于页表的状态。

      通常页面错误意味着页面框架不在内存中。但是,物理页框通常可能位于内存中但未映射到页表中(软页错误)。 (当操作系统有未映射的页框来释放一些但没有重新分配它们时,就会发生这种情况。)在这种情况下,操作系统只需更新页表以指向页框并重新启动指令(无需从辅助存储加载)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-24
        • 2020-06-19
        • 1970-01-01
        • 2011-08-20
        • 2011-01-11
        相关资源
        最近更新 更多