【问题标题】:How are base registers, limit registers and relocation registers used?如何使用基址寄存器、限制寄存器和重定位寄存器?
【发布时间】:2012-03-23 15:22:25
【问题描述】:

我对MMU(内存管理单元)地址转换过程的理解

-> 逻辑地址:由 cpu.programmer 生成,关注这个地址。

-> 虚拟地址:驻留在硬盘中,作为一个页面。

-> 物理地址:驻留在 RAM 中。这是实际地址。

1:cpu生成逻辑地址并发送给MMU。

2:MMU将逻辑地址转换为虚拟地址,然后将其转换为物理地址,并将物理地址发送到RAM。

3:当RAM满时,将没有快速使用的页面返回到硬盘,为其他页面(进程)分配内存。

我的问题是: 1)Relocation寄存器的值加在哪里? 2)谁来决定搬迁寄存器的价值? 3) Base register 和 Limit register 有什么用,怎么用? 4) 逻辑地址在哪里发生?

如果有人能回答它,那将不胜感激。 请求,让我知道在这个话题上的任何误解。 -谢谢

【问题讨论】:

    标签: memory-management operating-system


    【解决方案1】:

    我可以告诉你这在 x86 上是如何工作的。

    所有非 64 位模式的程序都使用由以下两项组合而成的地址:segment selector(为简洁起见,“选择器”通常在文本中被省略,这可能会造成混淆)和offset。这对selector:offset 称为logical address。

    选择器部分并不总是在代码中明确指定或操作,因为 CPU 具有段寄存器的“默认”关联,其中包含具有特定指令或特定指令编码的选择器。在 32 位模式下操作选择器也不常见,但在 16 位代码中却经常需要。

    virtual address 由“直接”(real 或 8086 virtual 模式)或“间接”(protected 模式)逻辑地址构成。

    "Direct" virtual address = selector * 16 + offset。

    "Indirect" virtual address = SegmentDescriptorTable[selector].Base + offset。

    SegmentDescriptorTable 是 Global Descriptor Table (AKA GDT) 或本地描述符表 (AKA LDT)。它由操作系统设置,描述了各个内存段的位置和大小。 selector 用于在表格中选择一个段。表的Base 条目告诉段的开始(虚拟地址)。 Limit 条目告诉分段大小(通常;细节稍微复杂一些)。

    当程序尝试使用偏移量访问内存时,导致访问超出段末尾(CPU 比较 offset 和 Limit),CPU 生成一个 exception 并且操作系统通过通常终止来处理它程序。

    顺便说一句,在real/v86 模式下,即使虚拟地址是直接从selector:offset 形成的,仍然有一个16 位Limit 施加在偏移量上,这就是为什么您需要使用不同的选择器来访问更多超过 64KB 的内存。

    段描述符中的Base 条目可用于将段与内存的其余部分隔离(Limit 在此处提供帮助)或将整个段放置或移动到任意虚拟地址而无需修改它所属的程序中的任何东西(或很多东西)(如果我们正在移动一个段,显然必须在内存中移动数据)。基本上,它可以用于重定位目的。在 real/v86 模式下,为了重定位,selector 已更改。

    如果 CPU 在protected mode 中运行并已设置page tables,则virtual address 可以进一步转换为physical address。如果没有页表,则物理地址与虚拟地址相同。转换是在称为pages(通常为 4KB)的物理内存块和地址范围中完成的。

    x86 CPU 上没有专用的重定位寄存器。搬迁可以通过调整来实现:

    1. CPU 寄存器或程序代码中的段选择器
    2. GDT/LDT 中的段基地址
    3. 程序代码中的偏移量
    4. 页表中的物理地址

    至于virtual address : reside in the hard disk , as a pages,我不确定你到底想说什么,但仅仅因为有虚拟到物理地址的转换,并不意味着也有虚拟磁盘内存。除了虚拟磁盘内存之外,翻译还有其他用途。这些地址驻留在 CPU 中以及您(和操作系统)代码将它们写入的任何位置,不一定在磁盘上。

    【讨论】:

      【解决方案2】:

      您的描述有许多错误,其中大部分可能是由于文档不精确和常用用法造成的。

      首先,真的没有虚拟地址这样的东西。有物理地址和逻辑地址。遗憾的是,当 逻辑地址 是什么意思时,经常(甚至在硬件文档中)使用术语 虚拟地址..

      CPU 指令流总是对逻辑地址(值可能指物理地址)进行操作。

      当 CPU 需要访问逻辑地址时,MMU 会尝试将其转换为物理地址。它通过在页表中查找地址来做到这一点。

      此时可能会发生几件事:

      1. 地址可能没有页表条目 => 访问冲突。
      2. 页表项被标记为无效 => 访问冲突。
      3. 页表条目表明没有物理内存映射到它 => 页面错误。 (我省略了模式访问检查)。 正是这最后一步是虚拟内存发挥作用的最后一步。此时,操作系统的缺页处理程序需要找到相应页面在磁盘中的存储位置,加载它,更新页表,然后重新启动指令。

      当对物理内存的需求很高时,操作系统通过将可写内存(已更改)分页到磁盘(只读数据不必写回)来管理可用的物理内存。

      我以前从未听说过“搬迁登记册”。但是通过 GOOGLE 搜索,我可以看到一些学术材料将其用作令人困惑的教学概念(即与现实无关)。

      一些系统使用基址和限制寄存器定义页表。基址寄存器指示页表在内存中的起始位置(可以是物理地址或逻辑地址),限制寄存器指示页表的一侧。

      寄存器通常不直接加载。它们的值通常被写入硬件进程上下文块 (PCB)。加载进程上下文时,会自动加载页表基础和限制。

      在某些系统上,有多个页表。如果有系统页表和用户页表,则用户页表可以引用系统空间的逻辑地址,系统页表可以引用物理地址。

      【讨论】:

      • 1) “虚拟”和“逻辑”地址都是行话,几乎总是意味着相同的东西。我的两本操作系统教科书都将这两个术语用于同一事物(由进程生成的地址)。 2)分页是内存管理的现代标准,但各种旧系统使用重定位寄存器或该概念的某些变体。有时这种方案被称为“基础和边界”或“基础和限制”。分页需要付出很多努力,而 base 和 bounds 只需要两个寄存器(如果不进行边界检查,则只需一个)。
      • 现在虚拟地址和逻辑地址已经不是一回事了。见证安卓。物理/逻辑/虚拟的区别是理解操作系统的关键。
      • 您在回答或评论中没有明确说明虚拟地址和逻辑地址之间的区别。传统上,虚拟地址和逻辑地址之间没有区别。有一些特定的系统(例如分段系统)可能需要在虚拟地址和物理地址之间进行额外的转换,但这些是例外而不是常态,它们不代表第三种类型的地址。这个答案说明了这一点,并获得了更多的支持:stackoverflow.com/questions/15851225/…
      • 传统上,在小内存时代,没有区别,但现在计算机系统实现逻辑地址转换而不是虚拟转换有区别。 (参见安卓)。
      • 您必须提供“See Android”之外的参考或引用,因为您说了两件事听起来不对。 Android 实现了分页,这几乎总是被认为是具有虚拟地址的虚拟内存方案。 Android ISA 不使用分段寻址,这是我所知道的唯一一个系统,其中在将线性地址转换为物理地址之前有一个额外的步骤将分段地址转换为线性地址。如果有的话,Android 实现了虚拟内存,但没有实现分段到线性地址的转换。
      猜你喜欢
      • 1970-01-01
      • 2014-11-18
      • 2017-07-15
      • 1970-01-01
      • 2016-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-02
      相关资源
      最近更新 更多