2016-07-13 43 views

回答

3

下面的所有單詞都是關於x86的。

我只會描述整個系統調用路徑,而這個答案將包含請求的信息。

首先,您需要了解什麼是interrupt descriptor table。該表存儲異常/中斷向量的地址。系統調用是一個例外。舉例異常用戶代碼執行

int x 

彙編指令。包括系統調用的每個例外都有自己的編號。在x86 linux上,這將看起來像

int 0x80 

int指令是一個複雜的多步指令。下面是對它做什麼的解釋:

1.)從IDT(存儲在特殊寄存器中的IDT地址)中提取descriptor並檢查CPL < = DPL。 CPL是目前的特權級別,可以從CS註冊表中讀取。 DPL存儲在IDT描述符中。 由於這個原因 - 您不能通過int指令直接從用戶空間生成一些異常(f.e.頁面錯誤)。如果您嘗試這樣做,您將得到general protection exception

2.)處理器切換到在TSS中定義的堆棧。 TSS早先被初始化,並且已經包含保存內核堆棧地址的ESP和SS的值。所以現在ESP指向內核堆棧。

3.)處理器推送到新切換的內核堆棧用戶空間寄存器:ss, esp, eflags, cs, eip。我們需要在系統調用服務之後返回,對嗎?

4.)下一個處理器從IDT描述符中設置CS和EIP。該地址定義異常向量入口點。

5.)這裏我們在內核的系統調用異常向量中。


有關ARM的幾句話。 ARM沒有TSS,它擁有每個模式的寄存器。所以對於SVC和USR模式你有單獨的堆棧指針。如果你有興趣,你可以看一下trap entry code

Interestring鏈接: MIT JOS lab 3XV6 manual

+0

超級有用。謝謝@ alex-hoppus – dsatish

相關問題