如何使用基址寄存器,限制寄存器和重定位寄存器?

时间:2012-03-06 06:10:00

标签: memory-management operating-system

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

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

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

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

1:cpu生成逻辑地址并将其发送到MMU。

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

3:当RAM已满时,未快速使用的页面将返回到硬盘,以便将内存分配给其他页面(进程)。

我的问题是:                     1)添加了重定位寄存器的值?                     2)谁决定搬迁登记册的价值?                     3)如何处理Base寄存器和Limit寄存器,如何使用它?                     4)逻辑地址何时消失?

如果有人能回答,我会很感激。 请让我知道这个主题的任何误解。 -thanks

2 个答案:

答案 0 :(得分:4)

我可以告诉你它是如何在x86上运行的。

非64位模式下的所有程序都使用两个项目的地址进行操作:segment selector(为简洁起见,“选择器”通常在文本中省略,可能会引起混淆)和offset。此selector:offset对称为logical address

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

virtual address由逻辑地址“直接”(real8086 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比较offsetLimit),CPU会生成exception和操作系统通过终止程序来处理它。

顺便说一下,在real/v86模式下,即使虚拟地址直接来自selector:offset,仍然会对偏移量施加16位Limit,这就是您需要使用的原因一个不同的选择器来访问超过64KB的内存。

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

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

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

  1. CPU寄存器中的段选择器或程序代码
  2. GDT / LDT中的段基地址
  3. 程序代码中的偏移量
  4. 页表中的物理地址
  5. 至于virtual address : reside in the hard disk , as a pages,我不确定你想用它做什么,但仅仅因为有虚拟到物理地址转换,这并不意味着还有虚拟磁盘内存。除了虚拟磁盘存储器之外,还有其他用于翻译的用途。地址驻留在CPU中以及您(和OS)代码将其写入的位置,不一定在磁盘上。

答案 1 :(得分:1)

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

首先,确实没有虚拟地址这样的东西。有物理和逻辑地址。遗憾的是,虚拟地址这个术语经常(甚至在硬件文档中)在逻辑地址的含义时使用。

CPU指令流始终在逻辑地址上运行(值可能指的是物理地址)。

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

此时可能会发生以下几件事:

  1. 地址=>可能没有页表条目访问冲突。
  2. 页面表条目标记为无效=>访问冲突。
  3. 页表条目表示没有物理内存映射到它=>页面错误。 (我省略模式访问检查)。 这是虚拟内存发挥作用的最后一步。此时,操作系统的页面错误处理程序需要找到相应页面已存储到磁盘的位置,加载它,更新页面表,然后重新启动指令。
  4. 当对物理内存有很高的需求时,操作系统通过将可写内存(已更改)分页到磁盘(只读数据不必回写)来管理可用的物理内存。

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

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

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

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