我不確定爲什麼你會認爲更改寄存器需要內核干預。一些特殊的寄存器可能是特權的(那些控制諸如描述符表或保護級別之類的東西,用戶模式代碼可以繞過系統模式保護),但是通用寄存器可以在沒有內核參與的情況下自由更改。
當你的代碼運行時,廣大大多數指令都將是一樣的東西:
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