# 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

* [第十講：中斷處理和現代架構考量](https://hackmd.io/@Jaychao2099/Linux-kernel-10)
* [Day28 softirq, tasklet, workqueue](https://ithelp.ithome.com.tw/m/articles/10281380)
* [TASKQUEUE(9)](https://man.freebsd.org/cgi/man.cgi?query=taskqueue)
* [中断上半部和下半部](https://zhuanlan.zhihu.com/p/686890291)

