1. 程式人生 > >程序上下文 VS 中斷上下文

程序上下文 VS 中斷上下文

       linux核心方面的書籍經常提及程序上下文,中斷上下文,一直沒有徹底搞明白。通俗地說,前者就是程序執行的環境引數,如CPU狀態引數(PC,SP,函式返回地址...),記憶體、檔案fd,網路fd,其他IO操作資訊等等,核心裡有一個數據結構tcb(task control bloc)專門來儲存這些資訊,有的作業系統稱之為為pcb(process control block),以便該程序被掛起時(如被中斷打斷)再次被排程時,能恢復到程式執行前的狀態,或者說現場。

      而中斷處理函式的上下文,跟任何程序無關,好像沒有那本書籍提及icb(interrupt control block)或者類似的術語,運行於中斷上下文環境。因此在非巢狀式中斷系統裡,中斷是不允許被打斷的,除非有更高優先順序的中斷。其實,原因也很簡單,如果這個中斷被“中斷”了,作業系統如何再次來排程它呢,如何恢復其上下文,現場?但是中斷處理時間不宜過長,因為它遮蔽了同等優先順序的中斷,核心很巧妙,將中斷處理函式分為中斷上半部和中斷下半部(tasklet),中斷上半部處理緊急的事情,耗時較少,中斷下半部處理耗時較多的事情,workqueue則用來處理耗時較多工並不緊急的事情。因此中斷處理函式不能sleep,切記。

      而ARM cortex-M3系列CPU,則將二者的區別更是顯著的標識,異常的處理函式使用MSP(main stack pointer),而程式的SP則使用PSP(process stack pointer),這樣當CPU的SP是使用哪個SP,你就容易顯而易見的知道是異常還是程式在跑。