【问题标题】:Where base and limit registers are located?基址和极限寄存器在哪里?
【发布时间】:2016-01-26 23:46:09
【问题描述】:

基址和极限寄存器在哪里?

  1. 是在CPU还是其他地方?

  2. 每个进程的基地址和限制地址不同。那么,CPU如何知道每个进程的这些寄存器的值呢?

编辑: 每个进程在内存中都有一个位置,起始地址(基址)和结束地址(基址+限制)。通过查看这些地址,cpu 不会对这些地址范围执行任何操作,以免影响其他进程的内存。因此,每个进程都有一个起始地址(基址)。我的问题是,cpu 如何获得这个因进程而异的地址

【问题讨论】:

  • 这些是 CPU 寄存器,不清楚您想具体询问位置。所有进程只使用一组这些寄存器。
  • 每个进程在内存中都有一个位置,起始地址(base)和结束地址(base+limit)。通过查看这些地址,cpu 不会对这些地址范围执行任何操作,以免影响其他进程的内存。因此,每个进程都有一个起始地址(基址)。我的问题是,cpu 如何获得这个地址因进程而异
  • 在每个进程的进程控制块中

标签: memory memory-management operating-system cpu-registers main-memory-database


【解决方案1】:

您可能指的是一种称为 segmentation 的技术,例如用于 x86 兼容 CPU。过去,这已被用于将内存中的多个进程相互分离,尽管如今这已不再常见,甚至在较新的处理器中,对分段的硬件支持也已被删除。

内存引用(代码和数据)以所谓的段选择器为“前缀”。在 x86 上,这些是寄存器 CS(用于指令加载)、DS(数据访问,例如 mov)、SS(堆栈访问)、ES(例如 movs 的目标)、 FSGS

根据段选择器,CPU 将使用 段描述符(由操作系统提供)之一将该段基地址添加到内存地址,并检查地址是否在规定的限度。 (还有其他检查,比如权限级别、执行权限……)

physical address = logical address + segment base

得到的地址是实际用于从主内存中获取数据的地址。

这些段描述符是全局描述符表或某些本地描述符表的一部分,分别由操作系统或用户进程设置。这些表存储在主内存中的某个位置(CPU 使用lgdtlldt 指令获取它们的地址)。

为了避免每次访问都必须执行两次内存访问(一次查找段描述符加上预期的一次),当前使用的段描述符缓存在一些 CPU 内部寄存器中。这在切换时变得很明显,例如全局描述符表,因为要使其生效,需要重置每个段选择器。

因此...

是在 CPU 中还是其他地方?

...答案是“在主内存中,但在 CPU 内部缓存”。

每个进程的基地址和限制地址都不同。那么,CPU如何知道每个进程的这些寄存器的值呢?

在任务切换时,操作系统(用于软件多任务处理)或 CPU 本身(使用硬件多任务处理时,通过另一个称为任务状态段的描述符结构)会更改 CSDS、 中的段选择器。 .. 注册。这会更改使用的段描述符,从而更改使用的基地址和限制地址。

【讨论】:

    猜你喜欢
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 2020-02-01
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多