2011-12-13 130 views
2

從一個沒有被移除的圖片中,有人可以更詳細地闡述Linux的系統調用(如read()和write()等)之間的區別。並使用x86 INT操作碼將它們寫入程序集,並設置指定的寄存器?Linux系統調用和INT 80軟件中斷之間的巨大差異

+1

詢問「系統調用」和「在彙編中編寫系統調用」之間的區別就像是問「書」和「寫作書」之間的區別。一個是實體,另一個是過程。 –

回答

6

實際功能read()是一個名爲「系統調用門」的C庫封裝器。 C庫封裝器主要負責設置失敗的設置errno,以及用戶空間中使用的結構與低級別系統調用使用的結構之間的映射。

系統調用門實際上是從用戶模式切換到內核模式的。這取決於CPU架構 - 在x86上,您有兩種選擇 - 一種是在使用syscall編號和參數設置寄存器後使用INT 080h;另一種方法是調用映射到每個可執行文件地址空間的庫提供的符號,並使用相同的寄存器設置。這個庫然後在用戶 - >內核轉換的幾個潛在選項之間進行選擇,包括SYSENTER,SYSCALL或回退到INT 080h。其他架構使用不同的方法。在任何情況下,CPU都會移入內核空間,系統調用編號用於在大表中查找適當的處理程序。

0

中斷不是調用系統調用的唯一方法,您可以使用特殊指令(如sysenter,syscall或簡單跳轉到受保護模式下的特定地址)。