1

我完成了操作系统研究生课程的作业。我得到了一个很好的分数,我只错过了一个小问题。它询问哪些是特权指令,哪些不是。我回答正确,除了一个:将一个寄存器值添加到另一个

我回答说这是特权,但显然不是!怎么会这样?

我认为用户通过使用系统调用与寄存器/内存进行交互,这在某种意义上从用户模式系统调用变为内核模式例程。因此,将一个寄存器值添加到另一个寄存器值可以由非特权用户调用,但最终内核正在做这项工作并且处于内核特权模式。因此它是特权?用户不能自己做。我错了吗?为什么?!

  • 谢谢!
4

1 回答 1

4

我不确定您为什么认为更改寄存器需要内核干预。一些特殊寄存器可能是特权的(那些控制诸如描述符表或保护级别之类的东西,用户模式代码可以绕过系统模式保护),但通用寄存器可以自由更改而无需内核参与。

当您的代码运行时,绝大多数指令将是这样的:

inc  %eax
movl $7,%ebx
addl %eax,%ebx

顺便说一句,我只是想象如果每次我增加计数器或调用函数时都需要对内核进行系统调用,我的代码会运行多慢:-)

我唯一能想到的是,如果您认为不允许您的执行线程任意更改寄存器,因为这可能会影响其他线程的这些寄存器。但是内核会在切换线程时处理这个问题——你所有的寄存器都会被打包到某个地方以备后用,而下一个线程的寄存器会被加载进去。


根据您的评论,您似乎认为添加的时间是CPU保护机制应该介入的时间。实际上,它不能在这一点上,因为它不知道您将使用寄存器做什么。您可能只是将其用作计数器。

但是,如果您确实使用它作为访问内存的地址,并且该内存在某种程度上是无效的(在您的地址空间之外,或者交换到磁盘),那么内核将在此时介入以纠正这种情况(将您的应用程序扔掉在它的耳朵上,或带入已换出的内存)。

但是,即使不是特权指令,也只是 CPU 处理页面错误。

特权指令是您根本不允许做的事情,例如更改中断描述符表位置寄存器或停用中断。

于 2010-09-07T04:45:00.460 回答