1. 程式人生 > >Linux核心——cli()和sti()

Linux核心——cli()和sti()

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

       個人理解,CLI/STI和cli()/sti()工作的機制是相同的,都是對標誌暫存器中的中斷標誌進行操作。一般在彙編指令中,CLI 和STL往往是成對出現的;但是cli()和sti()不一定是成對出現的。下面的例子或許可以說明一定的問題。

save_flags(..);
 cli();
.............
restore_flags(..);

       有時候我們會看到上述的情況,只有cli()沒有sti(),這裡採取的操作是先儲存標誌暫存器中的值,然後在禁止中斷,在執行完相應的任務後再恢復標誌暫存器中的值,這裡之所以沒有用sti(),可能是因為在任務的執行過程中會執行cli()和sti(),造成cli()和sti()的巢狀,這樣可能會造成混亂,可能致使原來的任務沒發順利執行。

       Linux核心中的例子是/linux/fs/inode.c中的一段程式碼,這裡採用了cli()和sti()成對出現,可能就是因為在cli()和sti()之間沒有再出現cli()和sti()。當然這只是我個人的理解。

 static inline void wait_on_inode(struct m_inode *inode)

{

cli();

while(inode->i_lock)

           sleep_on(&inode->i_wait);//若指定的i節點上鎖,進入睡眠等待狀態

sti();

}

這個函式的作用是等待指定的i節點可用。