您好、欢迎来到现金彩票网!
当前位置:彩之网 > 中断屏蔽 >

关于Linux中禁用中断和锁定的关系问题

发布时间:2019-07-25 07:16 来源:未知 编辑:admin

  百度知道电脑/网络操作系统/系统故障Linux

  据说在linux下,某些操作(如原子操作的内部实现)通过禁用CPU硬中断实现锁定。不知道为什么禁用中断就能实现锁定?其实我不明白的是,什么叫CPU硬中断。我知道CPU都带有中断控制器,...

  据说在linux下,某些操作(如原子操作的内部实现)通过禁用CPU硬中断实现锁定。不知道为什么禁用中断就能实现锁定?

  其实我不明白的是,什么叫CPU硬中断。我知道CPU都带有中断控制器,是说把这个中断控制器的功能都禁止了么?这样外设什么的确实不能来打扰CPU了,可是这又如何?不同线程还是可以同时访问临界区的代码嘛。难道说禁用了CPU硬中断后,CPU不能被新线程抢占了?不会吧... 我想。

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  首先原子操作是通过local_irq_enable()这个宏来实现,这个宏实现了硬件中断和软件中断的屏蔽。这样CPU就不能被软件中断,如线程抢占。而当硬件中断产生时,会将其结果保存到中断控制器的SRCPND(resource-pend)寄存器中,然后将SRCPND的内容送去做中断屏蔽检测,这一工作由设置MASK寄存器相应的位完成,如果全部屏蔽,硬件中断就不会产生了。当然了,每种处理器都有自己的中断处理方法,通常的流程是这样。

  CPU判断当前CPL级别如果等于3,则导致堆栈切换3-0,堆栈切换过程:

  b. CPU将当前的【SS:ESP】寄存器内容临时保存起来,假设为SSt和ESPt;

  如果当前是异常,则CPU将异常码error code压入当前的堆栈【SS:ESP】中,否则会省略该步骤;

  对于中断,CPU清零当前EFLAGS-IF位,即关闭CPU中断使能,对于异常,CPU则不会清零该位;

  注:对中断/异常处理程序的要求,为了正常的从中断/异常处理程序中返回,中断/异常处理程序必须使用IRET指令返回,该指令会依次出栈EIP、CS和EFLAGS,比RET多一个EFLAGS,当EFLAGS恢复后,由于原来保存时IF位为1,因此这里相当于CPU中断使能又打开了;

  SAVE_ALL保存所有CPU没有保存的寄存器,由于do_IRQ是函数,这里直接调用jmp,(一般用call来调用函数,call会导致pushEIP,但jmp不会)这样当do_IRQ返回调用ret(ret相当于popEIP)时,会弹出栈中最后一个元素到EIP,很显然这里就是ret_from_intr,也就是说,从do_IRQ中返回后,会跳转到ret_from_intr处继续执行;

  b. 如果当前设备中断处理函数可以在中断打开的情况下运行,则调用sti将EFLAGS.IF置位,打开硬中断使能;

  f. 如果此时有软中断需要运行(如在前面的硬中断处理函数中调用__cpu_raise_softirq),则进入do_softirq中处理软中断,关于do_softirq中的处理步骤见3;

  a. 首先判断当前是否还有没有处理完毕的硬中断处理程序或软中断处理程序,如果有,则直接退出该函数。判断方法见附注【文(6)】。

  c. 无论EFLAGS.IF是否为0,都调用cli将EFLAGS.IF清零,将硬中断使能关闭,处理些软中断标志位的问题,随后调用sti将EFLAGS.IF置位,打开硬中断使能;

  e. 调用cli将EFLAGS.IF清零,将硬中断使能关闭,处理些软中断标志位的问题;

  在这段代码中,通过testl $(VM_MASK 3),%eax检测中断前夕寄存器EFLAGS的高6位和代码段寄存器CS的内容,来判断中断前夕CPU是否运行于VM86模式、用户空间还是系统空间,对VM86这里不讲了,但是我们知道CS最低两位代表着中断发生时CPU的运行级别CPL,我们知道Linux只采用两种运行级别,系统为0,用户为3,所以,如果CS的最低两位为非0,那就说明中断发生于用户空间。如果中断发生于系统空间,控制就直接转移到restore_all,而如果发生于用户空间,则转移到ret_with_reschedule。在restore_all中恢复1中保存的寄存器,随后调用iret恢复EIP、CS、EFLAGS返回到中断发生时的状态。

  说明:能够走到ret_with_reschedule处,从4中可知,该中断前一定位于用户层,而且不可能有可中断的硬中断或软中断没有执行,也就是说到达这里in_interrupt必然为0。为什么这里要说不可能有可中断的硬中断或软中断没有执行呢?可中断的硬中断或软中断必然是被中断或者异常所打断的,当后者处理完毕后,从4中可知,由于后者发生前位于内核态(也就是可中断的硬中断或软中断处理过程中的那个点),故控制就直接转移到restore_all,即返回到了可中断的硬中断或软中断被打断时的那个点,继续处理完毕,可见,到达这里,必然不存在可中断的硬中断或软中断未被执行。

http://ando2.com/zhongduanpingbi/271.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有