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