Interrupt
為什麼系統呼叫表存在而不只是附加到中斷向量表?
為什麼系統呼叫表存在而不只是附加到中斷向量表?我不明白這裡的設計選擇。如果它提高了區分事件的性能,那為什麼不使用系統呼叫呢?
我沒有研究在 i386 上使用單個中斷 (0x80) 進行系統呼叫背後的歷史背景,有幾個原因不為單個系統呼叫使用單獨的軟體中斷。
- 軟體中斷的數量是有限的,這限制了系統呼叫的數量(並且在 x86 上,需要將許多中斷描述符表條目用於其他目的)。現在,系統呼叫的數量超過了大多數使用軟體中斷的架構所能支持的數量。
- 相當多的架構具有專用的系統呼叫指令,它們不使用軟體中斷(或等效的)。這包括 x86-64,其中專用
SYSCALL
指令提供比軟體中斷更快的系統呼叫訪問。man 2 syscall
提供每個架構的系統呼叫約定的詳細資訊。如果您查看 ARM/OABI 體系結構的細節,您可能會覺得那裡使用了中斷表,因為系統呼叫號是在指令中編碼的;但相應的指令執行固定的軟體中斷,忽略編碼的數字,系統呼叫處理程序從指令本身檢索數字。EABI 放棄了這種方法,因為它會導致記憶體污染(最近的 ARM CPU 具有單獨的指令和數據記憶體)。