基址和极限寄存器在哪里?
CPU里有还是别的地方?
每个进程的基地址和限制地址都不同。那么,CPU如何知道每个进程的这些寄存器的值呢?
编辑:每个进程在内存中都有一个位置,起始地址(基址)和结束地址(基址+限制)。通过查看这些地址,cpu 不会对这些地址范围执行任何操作,以免影响其他进程的内存。因此,每个进程都有一个起始地址(基址)。我的问题是,cpu 如何获得这些地址,这些地址因进程而异
基址和极限寄存器在哪里?
CPU里有还是别的地方?
每个进程的基地址和限制地址都不同。那么,CPU如何知道每个进程的这些寄存器的值呢?
编辑:每个进程在内存中都有一个位置,起始地址(基址)和结束地址(基址+限制)。通过查看这些地址,cpu 不会对这些地址范围执行任何操作,以免影响其他进程的内存。因此,每个进程都有一个起始地址(基址)。我的问题是,cpu 如何获得这些地址,这些地址因进程而异
您可能指的是一种称为分段的技术,例如在 x86 兼容的 CPU 中使用。在过去,这已被用于将内存中的多个进程相互分离,尽管现在这已不再常见,并且在较新的处理器中甚至已经删除了对分段的硬件支持。
内存引用(用于代码和数据)以所谓的段选择器为“前缀” 。在 x86 上,这些是寄存器CS
(用于指令加载)、DS
(数据访问,例如通过mov
)、SS
(堆栈访问)、ES
(例如的目标movs
)FS
和GS
。
根据段选择器,CPU 将使用段描述符之一(由操作系统提供)将该段基地址添加到内存地址,并检查地址是否保持在指定的限制内。(还有其他检查,如特权级别、执行权限……)
physical address = logical address + segment base
结果地址是实际用于从主存储器获取数据的地址。
这些段描述符是全局描述符表或某些本地描述符表的一部分,分别由操作系统或用户进程设置。这些表存储在主存储器的某个位置(CPU 使用lgdt
或lldt
指令获取它们的地址)。
为了避免每次访问都必须执行两次内存访问(一次查找段描述符加上预期的一次),当前使用的段描述符缓存在一些 CPU 内部寄存器中。这在切换例如全局描述符表时变得很明显,因为为了使其生效,需要重置每个段选择器。
因此 ...
CPU里有还是别的地方?
...答案是“在主内存中,但在 CPU 内部缓存”。
每个进程的基地址和限制地址都不同。那么,CPU如何知道每个进程的这些寄存器的值呢?
在任务切换时,操作系统(用于软件多任务处理)或 CPU 本身(使用硬件多任务处理时,通过另一个称为任务状态段的描述符结构)更改CS
, DS
, ... 寄存器中的段选择器。这会更改使用的段描述符,从而更改使用的基地址和限制地址。