Driver: 中斷時期 vs 一般行程
作業系統負責打理程式的大小事,
其中很重要的一件工作就是行程管理。
然而行程除了按照設計的執行流程進行之外,
也有可能被其他工作打斷,其中大致可分兩類:硬體中斷與軟體中斷。
硬體中斷:來自硬體裝置發出的中斷訊號。
軟體中斷:計時器、SIGNAL或者PRE-EMPTY都屬於這類訊號。
對應到Driver層,也可把核心函示劃分回一般核心函示與中斷時期函示。
中斷時期函示:中斷處理函示跟計時器call back
一般核心函示:不屬於上列函示的都是一般核心函示。
為什麼要區分這兩者呢?
因為很多核心API像是:
schedule, wait_event, bottom_half, task_list等
是只能在一般核心函示中執行!而不能中斷正在高優先權等級的中斷時期函示執行。
要是一個沒注意,一執行到相對區段,就馬上oops或者panic給你看。
如果不知道這兩者的分別,DEBUG到死都不知道發生什麼事 ...
以上就是今天發生在本人身上的事情,冏rz....
那要是無法確定到底是不是屬於中斷時期的函示呢?
核心有提供兩個API供檢查用,一是in_interrupt(),一是in_atomic(),
下次遇到oops時,可以拿來檢查一下。
分享完畢。
其中很重要的一件工作就是行程管理。
然而行程除了按照設計的執行流程進行之外,
也有可能被其他工作打斷,其中大致可分兩類:硬體中斷與軟體中斷。
硬體中斷:來自硬體裝置發出的中斷訊號。
軟體中斷:計時器、SIGNAL或者PRE-EMPTY都屬於這類訊號。
對應到Driver層,也可把核心函示劃分回一般核心函示與中斷時期函示。
中斷時期函示:中斷處理函示跟計時器call back
一般核心函示:不屬於上列函示的都是一般核心函示。
為什麼要區分這兩者呢?
因為很多核心API像是:
schedule, wait_event, bottom_half, task_list等
是只能在一般核心函示中執行!而不能中斷正在高優先權等級的中斷時期函示執行。
要是一個沒注意,一執行到相對區段,就馬上oops或者panic給你看。
如果不知道這兩者的分別,DEBUG到死都不知道發生什麼事 ...
以上就是今天發生在本人身上的事情,冏rz....
那要是無法確定到底是不是屬於中斷時期的函示呢?
核心有提供兩個API供檢查用,一是in_interrupt(),一是in_atomic(),
下次遇到oops時,可以拿來檢查一下。
分享完畢。
留言