xupt_liangning 发表于 2014-07-29 21:44

本帖最后由 xupt_liangning 于 2014-07-29 21:45 编辑

我个人的理解,中断使用的是进程的中断栈,而异常和进程的内核态都使用的是进程的异常栈。。而进程切换的标志就是切换到了进程的异常栈,所以说,进程的在内核态或者异常处理程序中可以睡眠(可以切换到别的进程),因为它可以恢复。。而进程如果处在中断处理程序中,如果发生了进程切换,那么等下一次切换回来的时候,就只能回到异常栈,回不到中断栈了,所以上次的中断(包括所有嵌套的中断)就丢了。。。   我的qq:119353825可以联系我讨论哦

_nosay 发表于 2016-03-23 19:03

赞成“中断函数不可重入”:
linux将嵌套转换为循环,就是为了减轻写中断程序时还要考虑可重入的负担,如果允许在中断程序里面调度别的进程,就相当于从这个循环里跳出来了,从页造成“重入”这个函数,就破坏了初衷。

不赞成“回不了家”:
中断函数本身和其它普通的内核函数没区别,其它内核函数中进行调度时可以保存的“上下文”,它也可以,如果说是“回不了家了”这个原因,那所有内核函数里都不能调用shedule()才对,内核里面不能调用shedule(),难道要在用户态调度吗。

Mr__key 发表于 2018-02-09 13:57

请问各路大神,有什么资料或者code 证明异步中断执行时用的是独立的栈?

Mr__key 发表于 2018-02-09 14:47

谈谈我的理解,中断发生时不能确定当前运行的是哪一个进程,但是它寄生在当前进程的堆栈中执行。

如果不支持中断嵌套,抛开效率、硬件特性等因素,软件的角度上它是可以被切换的,因为当前内核控制路径只有唯一的进程堆栈。

但是支持中断嵌套的话,当前内核控制路径就可能存在多个进程的堆栈,切换回来后,如果嵌套最底层的堆栈和顶层的堆栈不是同一个进程的话,就会引起进程调度的紊乱。

yulihua49 发表于 2018-03-17 23:08

本帖最后由 yulihua49 于 2018-03-17 23:12 编辑

cskyrain 发表于 2009-11-24 20:36
一直认为中断处理函数不能休眠的是天经地义的,可从没认真思考过问什么不能休眠,阻塞。最近看了一下ulk中 ...
中断,是高优先级活动。它休眠,这个cpu就得不到调度这期间就等于死掉了一个cpu。
我们采用中断降级办法取代休眠。即安排好数据条件,把剩余事务转移到一个普通级别的任务继续。本次中断处理结束,返回。系统按照普通优先级调度剩余任务。
页: 1 2 [3]
查看完整版本: 中断处理程序为什么不能阻塞休眠???以前真没认真思考过!