Linux核心——cli()和sti()
阿新 • • 發佈:2019-02-05
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節點可用。