linux中断的几点困惑,麻烦大家帮忙答疑一下。
1.好多资料上说,包括ldd 3 , 上半部中断是禁止的,但没有说什么时候禁止的,请问是什么时候禁止中断的?
有的人说,是在irq_enter里调用add_preempt_count(HARDIRQ_OFFSET),来禁止中断的。
但感觉不像,add_preempt_count(HARDIRQ_OFFSET)是增加其中硬中断的计数, 主要是为了后面可以用宏preempt_count来判断当前程序是否在中断上下文中。
例如, irq_exit()里就调用了in_interrupt() 来判断当前进程是否处于中断上下文,而in_interrupt里就调用了宏preempt_count。看《Linux PowerPC详解 —核心篇》里说,当处理器进入外部中断处理时,处理器自动屏蔽外部中断,以防止中断嵌套。感觉这种说法比较正确,但没有从相应的datasheet里找到证据。
为什么感觉这种说法比较正确呢?如果是在irq_enter里才禁止中断,那么在irq_enter之前又产生了同样的中断了,就会有中断嵌套了。
不知道这种解释是否正确?
2. 在中断处理时,又来一个同样的中断,中断会丢失吗?还是被挂起?
个人的理解是,中断不会丢失,会被挂起(pending),保存在IPR(Interrupt Pending Register)中,等到中断允许位打开后再执行相应的中断处理程序。
但没有找到证据。不知道是不是这样的?
麻烦大家帮忙答疑一下,希望有比较权威的论据,比如从datasheet里,或是linux源代码里?或是从比较权威的英文书里,比如《Understanding the Linux Kernel 》(Third Edition), 《Linux Kernel Development》(Third Edition)。
------解决方案--------------------
1,在什么时候禁止?
一般是硬件禁止再次产生中断的,当然硬件中断在理论上是可以嵌套的,我见过有资料讲到过,有些系统就实现了这种功能。CORTEX-A8关于中断的章节中有讲到过,中断产生后,硬件会禁止相应中断的再次产生,但软件可以再次使能相应的中断。
在linux下是不支持的,这是因为Linux设计之初为了处理的简单,系统的性能着想,而设计成不支持中断嵌套的。
所以说这个问题是:硬件上是支持中断嵌套的,但linux并未实现。
2. 在中断处理时,又来一个同样的中断,中断会丢失吗?还是被挂起?
这个问题并没有一定的答案,他有可能丢失,有也可能被挂起。
在我目前使用的系统中,由一个函数负责判断此次时钟中断处理之前,是否有产生的时钟中断而没有进行中断处理的情况,并找回丢失的时钟中断。
以上只是个人观点