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来关闭对外部中断的响应,那么在修改之前判断出该超级块锁定标志没有置位而想设置这个标志时,若此时正好发生系统时钟中断而切换到其他任务去运行,并且碰巧其他任务也需要修改这个超级块,那么此时这个其他任务会先设置超级块的锁定标志并且对超级块进行修改操作。当系统又切换回原来的任务时,此时该任务不再判断锁定标志就继续执行设置超级块的锁定标志,从而造成两个任务对临界代码区的同时操作,引起超级块数据不一致,严重时会导致内核系统崩溃。

http://www.startos.com/zhuanti/zt02/2010/1108/8799.html


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值