我不确定为什么你会认为更改寄存器需要内核干预。一些特殊的寄存器可能是特权的(那些控制诸如描述符表或保护级别之类的东西,用户模式代码可以绕过系统模式保护),但是通用寄存器可以在没有内核参与的情况下自由更改。
当你的代码运行时,广大大多数指令都将是一样的东西:
inc %eax
movl $7,%ebx
addl %eax,%ebx
顺便说一句,我只是想象,如果需要一个系统调用是我的代码将如何运行缓慢每当我增加一个计数器或称为函数时,都会向内核提交:-)
我唯一能想到的是如果您认为您的执行线程不允许随意更改寄存器,因为这可能会影响这些寄存器其他线程。但是线程切换时,内核会照顾的是 - 所有的寄存器将某处以后可以打包带走,并为下一个线程的人会在加载
根据您的意见,你似乎认为。添加的时间是CPU保护机制应该介入的时间。事实上,它不可能在这一点上,因为它不知道你要使用寄存器。您可能只是将其用作计数器。
但是,如果您使用做将其用作访问内存的地址,并且该内存以某种方式无效(在您的地址空间之外或交换到磁盘),内核将在该点进入以纠正(把你的应用程序丢在耳边,或者把换出来的内存)。
然而,即使那不是一个特权指令,它只是CPU处理页面错误。
特权指令是您根本不允许执行的操作,例如更改中断描述符表位置寄存器或禁用中断。
所以,让我明白这一点。有特殊目的的寄存器需要特权指令,但通用寄存器不需要特权指令。这是否意味着如果你添加两个地址,它没有任何系统调用呢?这是如何发生的? – 2010-09-07 04:49:15
我确实认为内核必须设置某种保护措施,例如说如果进程A的寄存器值试图增加进程B的寄存器值。我想这会导致陷阱,例行处理程序会照顾它? – 2010-09-07 04:51:16
您可以添加它们。就是这样。你执行一条指令,如'add%eax,%ebx'。 CPU采用'%eax'中的值并将其添加到'%ebx'中。地址保护是在解引用时完成的。如果您使用修改后的'%ebx'来尝试访问您的地址空间之外的内存,那么这是保护机制进入的时间。直到此时,CPU并不知道您将要使用'%ebx'来访问内存。澄清答案。 – paxdiablo 2010-09-07 04:53:27