1. 程式人生 > >Linux核心——cli()和sti()——標誌暫存器的中斷標誌

Linux核心——cli()和sti()——標誌暫存器的中斷標誌

cli()和sti()有點類似於彙編指令中的CLI和STL,當某個任務在執行的過程中不想被中斷,則可以在任務的開始出執行cli(),在任務的結束處執行sti(),恢復中斷的執行。

為了避免競爭條件和中斷對臨界程式碼區的干擾,在Linux 0.12核心程式碼中許多地方使用了cli和sti指令。cli指令用來複位CPU標誌暫存器中的中斷標誌,使得系統在執行cli指令後不會響應外部中斷。 sti指令用來設定標誌暫存器中的中斷標誌,以允許CPU能識別並響應外部裝置發出的中斷。當進入可能引起競爭條件的程式碼區時,核心中就會使用cli指令來關閉對外部中斷的響應,而在執行完競爭程式碼區時核心就會執行sti指令以重新允許CPU響應外部中斷。

例如,在修改檔案超級塊的鎖定標誌和任務進入/退出等待佇列操作時都需要首先使用cli指令關閉CPU對外部中斷的響應,在操作完成之後再使用sti指令開啟對外部中斷的響應。如果不使用cli、sti 指令對,即在需要修改一個檔案超級塊時不使用cli來關閉對外部中斷的響應,那麼在修改之前判斷出該超級塊鎖定標誌沒有置位而想設定這個標誌時,若此時正好發生系統時鐘中斷而切換到其他任務去執行,並且碰巧其他任務也需要修改這個超級塊,那麼此時這個其他任務會先設定超級塊的鎖定標誌並且對超級塊進行修改操作。當系統又切換回原來的任務時,此時該任務不再判斷鎖定標誌就繼續執行設定超級塊的鎖定標誌,從而造成兩個任務對臨界程式碼區的同時操作,引起超級塊資料不一致,嚴重時會導致核心系統崩潰。