当前位置: 技术问答>linux和unix
关于中断处理程序的一点疑惑?
来源: 互联网 发布时间:2015-12-19
本文导语: 书上说到:一个中断处理程序以异步的方式执行,并且,它有可能打断其他重要的代码(甚至包括其他中断处理程序)。 又有:中断处理程序不是在“进程上下文”中运行,当执行一个中断处理程序时内核处于“中...
书上说到:一个中断处理程序以异步的方式执行,并且,它有可能打断其他重要的代码(甚至包括其他中断处理程序)。
又有:中断处理程序不是在“进程上下文”中运行,当执行一个中断处理程序时内核处于“中断上下文”,中断上下文和内核上下文没有瓜葛,因为没有进程背景,所以中断上下文不可以睡眠。
现在问题是:一个中断处理程序可以打断另外一个中断处理程序。但是,中断处理程序又不可以睡眠,此时被打断的中断处理程序到底处于什么状态呢?
又有:中断处理程序不是在“进程上下文”中运行,当执行一个中断处理程序时内核处于“中断上下文”,中断上下文和内核上下文没有瓜葛,因为没有进程背景,所以中断上下文不可以睡眠。
现在问题是:一个中断处理程序可以打断另外一个中断处理程序。但是,中断处理程序又不可以睡眠,此时被打断的中断处理程序到底处于什么状态呢?
|
中断可以发生在任何进程正在执行的过程中,如果此时进程A在运行,发生中断,如果在中断休眠的话,那么就会让进程A不运行,你有什么权利让进程A休眠呢??也有可能这个中断发生在进程B中,同样的道理,你有什么权利让进程B休眠呢???这就是不合逻辑的地方,再者,如果你休眠完成之后,再次调度这个进程时,这个进程如果退出了咋个办??????你总不能强制要求一个进程非得等待你的中断休眠完成之后再退出吧??再者,还有设备的问题,中断肯定不能占用太长的时间,你却要求进程休眠,这岂不是背道而驰吗?中断时间过长,会丢失中断的.
中断是发生在任何一个进程运行的过程中,如果一个进程在运行,中断发生,那么中断就处在这个进程的上下文中,占用的是这个进程的页表,使用的是这个进程的地址空间,所谓中断不属于进程上下文,是指中断不发生在一个指定的进程上下文中.中断可以嵌套,是指高优先级可以打断低优先级的运行,比如进程A在运行,中断1发生,处于进程A的上下文中,执行了一小段时间后,又一高优先级的中断2到来,打断A,这个中断还是处于进程A的上下文中,直到两个中断退出,才会执行进程调度
当然,你也可以在中断到来之时进行调度或者休眠,不过系统将会处于未知状态,你可以写一个这样的驱动来测试
中断是发生在任何一个进程运行的过程中,如果一个进程在运行,中断发生,那么中断就处在这个进程的上下文中,占用的是这个进程的页表,使用的是这个进程的地址空间,所谓中断不属于进程上下文,是指中断不发生在一个指定的进程上下文中.中断可以嵌套,是指高优先级可以打断低优先级的运行,比如进程A在运行,中断1发生,处于进程A的上下文中,执行了一小段时间后,又一高优先级的中断2到来,打断A,这个中断还是处于进程A的上下文中,直到两个中断退出,才会执行进程调度
当然,你也可以在中断到来之时进行调度或者休眠,不过系统将会处于未知状态,你可以写一个这样的驱动来测试
|
不确定“中断上下文”是个什么意思,楼上第二段解释的很清楚。
|
"中断上下文"实际上是cpu作中断处理时的寄存器内容,这些内容保存在每个进程的TASK_STRUCT结构所在的8k内存;
上下文只是某个特定时刻对这些寄存器的通称概念,感觉"tb01412"把上下文当成一种内存概念,我承认这些中断上下文是保存在进程的"内核堆栈里面",但不同意说"中断就处在这个进程的上下文中"
还有进程调度只能是在中断返回前夕作这个工作,如果在中断处理时作这个事情就是一个错误!
上下文只是某个特定时刻对这些寄存器的通称概念,感觉"tb01412"把上下文当成一种内存概念,我承认这些中断上下文是保存在进程的"内核堆栈里面",但不同意说"中断就处在这个进程的上下文中"
还有进程调度只能是在中断返回前夕作这个工作,如果在中断处理时作这个事情就是一个错误!
|
tb01412(tb)
中断是发生在任何一个进程运行的过程中,如果一个进程在运行,中断发生,那么中断就处在这个进程的上下文中,占用的是这个进程的页表,使用的是这个进程的地址空间,所谓中断不属于进程上下文,是指中断不发生在一个指定的进程上下文中.
-----------------------------------------------------------------------
不同意这段解释,至少在VxWorks下面中断的堆栈是独立的,而不是使用进程的。
中断是发生在任何一个进程运行的过程中,如果一个进程在运行,中断发生,那么中断就处在这个进程的上下文中,占用的是这个进程的页表,使用的是这个进程的地址空间,所谓中断不属于进程上下文,是指中断不发生在一个指定的进程上下文中.
-----------------------------------------------------------------------
不同意这段解释,至少在VxWorks下面中断的堆栈是独立的,而不是使用进程的。
|
LZ的上下文是指寄存器环境吧,2楼的解释比较清楚了已经。