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

来源:互联网 发布:自然文化遗产知乎 编辑:程序博客网 时间:2024/04/29 18:28

 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节点可用。

0 0
原创粉丝点击