我完成了操作系统研究生课程的作业。我得到了很高的分数,我只错过了一个问题的一个小问题。它询问哪些是特权指示,哪些不是。我正确回答了除了一个:将一个寄存器值添加到另一个
我回答说这是特权,但显然不是!怎么会这样?
我认为用户通过使用系统调用与寄存器/内存交互,这在某种意义上从用户模式系统调用变为内核模式例程。因此,可以由非特权用户调用向另一个寄存器值添加一个寄存器值,但最终内核正在执行工作并处于内核特权模式。它有特权吗?用户不能自己做。我错了吗?为什么?!
答案 0 :(得分:2)
我不确定为什么你会认为更改寄存器需要内核干预。某些特殊寄存器可能具有特权(控制描述符表或保护级别,用户模式代码可以绕过系统模式保护),但通用寄存器可以自由更改而不会涉及内核。
当您的代码运行时,浩大的大多数指令都会是这样的:
inc %eax
movl $7,%ebx
addl %eax,%ebx
顺便说一句,我只是想象一下,如果每当我增加一个计数器或调用一个函数时需要对内核进行系统调用,我的代码运行速度有多慢: - )
我唯一能想到的就是你认为你的执行线程不允许随意更改寄存器,因为这可能会影响其他线程的寄存器。但是在切换线程时内核会处理这个问题 - 你的所有寄存器都会在某个地方被打包出来以供下一个线程使用,而下一个线程的寄存器将被加载。
根据您的评论,您似乎认为添加的时间是CPU保护机制应该介入的时间。实际上,它不能在那时因为它不知道您将使用什么为.....注册。您可能只是将它用作计数器。
但是,如果您执行将其用作访问内存的地址,并且该内存在某种程度上无效(在地址空间之外,或交换到磁盘),内核将介入指出要纠正这种情况(把你的应用程序扔到耳边,或带上换掉的内存)。
然而,即使 也不是特权指令,它只是CPU处理页面错误。
特权指令是您根本不允许执行的操作,例如更改中断描述符表位置寄存器或停用中断。