2010-05-24 68 views

回答

2

從這裏開始Interrupt Descriptor Table。基本上,當一箇中斷髮生時,流量控制跳轉到這個表,然後跳轉到這個表中的任何內容。另外,我相信所有的寄存器都會在中斷髮生時立即被觸發,但是我不是100%確定的,因爲我已經處理了很長時間。

+1

在中斷髮生之前,所有的寄存器和標誌都被壓入中斷處理代碼結束後彈出。 – nc3b 2010-05-24 15:05:55

+0

是的,還挺我的想法。在我所做的一些事情上,你必須做自己的推動和彈出。很確定x86是爲你做的。 – 2010-05-24 15:09:46

+5

處理器標誌被自動推送,但其他寄存器不是;當它被派遣時,ISR應明確地保存它打算改變的任何/所有寄存器。 – ChrisW 2010-05-24 15:16:59

8

當一箇中斷髮生時,CPU將執行以下操作:

  • 推當前地址(指令指針的內容)壓入堆棧;也可以按處理器標誌(但不是所有其他處理器寄存器)
  • 跳轉到中斷描述符表中指定的ISR(中斷服務程序)的地址。

的ISR應該做到以下幾點:

  • 推它打算改變(或,推動所有寄存器)
  • 處理中斷
  • 重新啓用中斷
  • 彈出任何任何寄存器它推動的寄存器
  • 使用IRET指令,它從堆棧中彈出CPU標誌和指令指針值(並因此返回到whateve當中斷髮生時r正在執行)。
+1

它發生在用戶空間程序的堆棧上還是發生在某些內部內核堆棧上? – 2016-09-19 05:53:28