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

我回答了它很荣幸,但显然不是!怎么会这样?

我发现用户通过使用系统调用与寄存器/内存进行交互,从而从用户模式系统呼叫到内核模式例程的意义上更改。因此,将一个寄存器值添加到另一个寄存器值可以由非特权用户调用,但最终内核正在执行工作,并且处于内核,特权模式。因此,它具有特权?用户不能自己做。我错了吗?为什么?!

  • 谢谢!
有帮助吗?

解决方案

我不确定为什么您会认为更改寄存器需要内核干预。某些特殊寄存器可能具有特权(那些控制描述符表或保护级别的内容,用户模式代码可以绕过系统模式保护措施),但是可以自由更改通用寄存器,而无需涉及内核。

当您的代码运行时, 广阔的 大多数说明将是:

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

顺便说一句,我只是想像我的代码需要每次汇总计数器或调用函数的系统调用系统呼叫的速度会慢一点:-)

我唯一能想到的是,如果您认为不允许执行线程任意更改寄存器,因为这可能会影响其他线程的寄存器。但是,当切换线程时,内核会考虑到这一点 - 您的所有寄存器都会在以后的某个地方包装,并且下一个线程的寄存器将被加载。


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

但是,如果你 将其用作访问内存的地址,并且该内存以某种方式(在地址空间之外或换到磁盘之外)无效,内核将在此时介入以纠正情况(将您的应用程序放在其耳朵上,或带来交换的记忆)。

但是,甚至 不是特权指令,而只是CPU处理页面故障。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top