目錄

FreeBSD Interupt 介紹

基礎分類

  • Hardware interrupt: 非同步的產生,像是硬體鍵盤,收到封包等
  • Hardware trap/Exception: 由 CPU 指令產生的事件,像是 Page Fault/除與 0/無效指令,同步的事件
  • Software trap: 軟體故意觸發的 Exception

上半部下半部

  1. Top half(硬中斷 context)
    1. ISR(interrupt service routine)
    2. 很短
    3. 不能 sleep
    4. 會關閉中斷
  2. 下半部,可以把 interrupt handler 轉成 kernel thread 來跑
    1. 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 離開的時候,就會檢查有沒有

  1. pending signal: 因為有些信號要暫停 process,所以會先處理 signal handler
  2. scheduling: 先看有沒有更優先的程式先作,做了之後在等排程回來,回到這邊才真正從 syscall 回去
  3. profiling time,計算時間
  4. 最後再回到 user

Trap/Interrupt

  1. CPU 進 kernel mode
  2. save process state
  3. 進 trap handler,判斷原因:
    1. syscall → 做 system call
    2. page fault → 可能去 disk 讀 page(page-in)
    3. error → signal / kill process
  4. 回到 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 分成

  1. hardclock,計算時間,更新 prcoess timer
  2. softclock,把「不緊急的 timer work」全部丟到 softclock,有一個 ring buffer,每個 bucket 存要在某個 tick 執行的 events

所以每次 hardclock 結束,會看 ring buffer,然後 scheduler 也是每秒會跑一次排序優先次序。

Reference