1

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

  1. CPU里有还是别的地方?

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

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

4

1 回答 1

2

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

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

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

physical address = logical address + segment base

结果地址是实际用于从主存储器获取数据的地址。

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

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

因此 ...

CPU里有还是别的地方?

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

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

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

于 2015-10-27T18:50:06.407 回答