看linux 1.2.13看到这个了,
转:http://blog.163.com/njut_wangjian/blog/static/165796425201242010718848/
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节点可用。