Kernel
系統呼叫是否真的像硬體中斷一樣“中斷”CPU?
我試圖更深入地了解系統呼叫和硬體中斷是如何實現的,而讓我感到困惑的是它們在處理方式方面的不同之處。例如,我知道啟動系統呼叫(至少曾經是)的一種方式是通過 x86
INT 0x80
指令。
- 處理器是否以與硬體外圍設備中斷 CPU 的方式完全相同的方式處理此問題?如果不是,它們在什麼點上有所不同?我的理解是它們都索引 IDT,只是在向量中有不同的索引。
- 在同樣的意義上,我的理解是有一種
softirq
處理“下半部分”處理的想法,但我只看到這種形式的“軟體中斷”是指被物理硬體中斷排隊執行。系統呼叫“軟體中斷”是否也會觸發softirq
s進行處理?這個術語也讓我有點困惑,因為我看到人們將系統呼叫稱為“軟體中斷”,但softirq
也稱為“軟體中斷”。
INT 0x80h
是呼叫核心服務(系統函式)的一種老方法。目前,syscalls
用於呼叫這些服務,因為它們比呼叫中斷更快。您可以在核心的中斷描述符表idt.c和irq_vectors.h文件的第 50 行中檢查此映射。我相信回答您問題的重要一點是最後一個文件的標題,您可以在其中看到中斷請求 (IRQ) 的組織方式。
This is the general layout of the IDT entries: Vectors 0 ... 31 : system traps and exceptions - hardcoded events Vectors 32 ... 127 : device interrupts Vector 128 : legacy int80 syscall interface Vectors 129 ... INVALIDATE_TLB_VECTOR_START-1 except 204 : device interrupts Vectors INVALIDATE_TLB_VECTOR_START ... 255 : special interrupts
無論是通過電子方式還是軟體方式,都無關緊要。每當觸發中斷時,核心都會在 IDT 中查找其 ID 並執行(在核心模式下)相關的中斷處理程序。由於它們必須非常快,它們通常會設置一些資訊稍後由 a
softirq
或 a處理tasklet
。閱讀Unreliable Guide To Hacking The Linux Kernel的第 2 章(快速閱讀…)讓我推薦在 stackoverflow 上閱讀這個非常好的和徹底的答案,以英特爾 x86 與 x64 系統呼叫問題,在哪裡
INT 0x80h
,sysenter
並syscall
放在上下文中……我寫了自己的(非常謙虛,仍在建設中)關於中斷和信號的自學頁面,以幫助我理解信號和陷阱與中斷的關係(例如 SIGFPE - 除以零)。