FreeBSD Interupt 介紹
目錄
基礎分類
- Hardware interrupt: 非同步的產生,像是硬體鍵盤,收到封包等
- Hardware trap/Exception: 由 CPU 指令產生的事件,像是 Page Fault/除與 0/無效指令,同步的事件
- Software trap: 軟體故意觸發的 Exception
上半部下半部
- Top half(硬中斷 context)
- ISR(interrupt service routine)
- 很短
- 不能 sleep
- 會關閉中斷
- 下半部,可以把 interrupt handler 轉成 kernel thread 來跑
- ithread = interrupt handling thread
所以 FreeBSD 會用一個 kernel thread 放入 task queue 來作下半部的事情,有點類似 Linux workqueue。
而在 Linux bottom half 不是用 ithread,而是使用 softirq,還有 tasklet = softirq 的「簡化 + 單執行版本」,但現在 task_let 被 workqeueu 代替了。
- softirq 雖然是 bottom half 但不能被 sleep
- tasklet 也不能 sleep
- workqueue sleep
Syscall
直接 trap into kernel,會有對應的 syscall handler,會驗證 & 複製參數,在呼叫真正 syscall implementation。
回應 user 的方式要馬是 return value or errno 機制,並且有可能會被 signal 中斷,被中斷的時候:
- syscall 可能會失敗,就是 return EINTR
- restart syscall
kenrel 離開的時候,就會檢查有沒有
- pending signal: 因為有些信號要暫停 process,所以會先處理 signal handler
- scheduling: 先看有沒有更優先的程式先作,做了之後在等排程回來,回到這邊才真正從 syscall 回去
- profiling time,計算時間
- 最後再回到 user
Trap/Interrupt
- CPU 進 kernel mode
- save process state
- 進 trap handler,判斷原因:
- syscall → 做 system call
- page fault → 可能去 disk 讀 page(page-in)
- error → signal / kill process
- 回到 process
硬體 Interrupt 則是讓 interrupt handler 做最小工作,並且 interrupt handler 有自己的 context / stack,不是像是 syscall handler 用 process 自己的 kenrel stack。
Interrupt 也可以搶佔 software interrupt or any user process。
Clock Interrupt
FreeBSD 不是每次 clock 都 interrupt,太快了,系統會預測「下一個需要處理的事件時間」,直接 schedule 下一次 clock interrupt。
其中 clock 分成
- hardclock,計算時間,更新 prcoess timer
- softclock,把「不緊急的 timer work」全部丟到 softclock,有一個 ring buffer,每個 bucket 存要在某個 tick 執行的 events
所以每次 hardclock 結束,會看 ring buffer,然後 scheduler 也是每秒會跑一次排序優先次序。