2013-01-23 46 views
4

在x86架构中,有一些段寄存器,如SS,CS,DS,FS,GS。我知道这些16位寄存器指示LDT,GDT条目(作为段选择器)和MMU引用 这个(GDT,LDT)来计算段基址+偏移量值。并检查权限 等。什么时候由操作系统修改段寄存器?

我很好奇的是:谁填写了基于段的寄存器内容?内核调度程序?

当应用程序更改段寄存器值本身时会发生什么? 我知道只有CS不能被更改,因为它具有当前CPU的CPL。 ,但其他寄存器(SS,DS ...)可以更改。

回答

5

谁的依据是什么?(内核调度??)段寄存器的内容填充

引导程序一样。 ISR和异常处理程序。系统调用处理程序。调度器的确如此。其他部分可能需要。寄存器被认为是私有的,并且在各种上下文切换期间必须被保存和恢复。而且,当然,他们也需要在某个先前的位置进行初始化。

基于这些寄存器需要什么。它们的价值观不是在操作系统的不同部分之间以及不同的程序之间普遍共享的。

当应用程序更改自己的段寄存器值时会发生什么?我知道只有CS不能被更改,因为它具有当前CPU的CPL。但其他寄存器(SS,DS ...)可以更改。

会发生什么情况?它要么成功地改变它,要么导致一个异常(通常是#GP),然后发生任何异常处理程序,或者如果没有或者有问题,则会发生三重故障,CPU重置以及可能重新启动整个计算机。

如果您知道还能在当前特权级别加载哪些内容,则可以更改任何段寄存器。如果您的程序处于第3级,并且操作系统为其设置了DPL = 3的两个代码段,则程序可以将其中的任何一个用于CS寄存器。如果你不知道这一点,那么你很可能会使程序崩溃。

我想知道x86段寄存器的细节。

让自己的副本,并阅读:

英特尔®64和IA-32架构软件开发人员手册卷组合:1,2A,2B,3A和3B。您可以通过相关章节(内存管理,中断/异常处理,任务切换)或搜索特定的寄存器(例如CS或SS或DS)或查看特定指令的描述和伪代码。

你不会对这个模糊的问题得到更准确的答案。

+0

谢谢!它仍然非常有帮助 – daehee

相关问题