Interrupt handling
Bruce Rowen
browen at aoc.nrao.edu
Thu Feb 17 09:59:03 EST 2011
On Feb 16, 2011, at 9:49 PM, Darshan Ghumare wrote:
> Sir,
>
> Thank you very much for the explanation.
>
> On Wed, Feb 16, 2011 at 8:20 PM, Bruce Rowen <browen at aoc.nrao.edu>
> wrote:
> When the interrupt line is asserted by the hardware device (could be
> a peripheral, whatever) the interrupt controller decides how to pass
> this signal onto the processor. Some controllers will prioritize the
> interrupt based on the interrupt line number. For example, assume line
> #3 has interrupted. If line #4 then interrupts and #4 has higher
> priority, the service routine for interrupt line #3 will itself be
> interrupted. If a lower priority interrupt (say #2) occurs, then #3
> will continue until completion at which point #2 will be serviced.
> Note that this hardware prioritization is highly dependent on hardware
> and hardware setup. It could be such that an incoming interrupt with a
> lower priority than a currently servicing interrupt is simply ignored.
>
> If that is the case,
> 1) What happens in the case of x86?
Depends on the interrupt controller. Common systems have interrupt
controllers embedded into 'glue' chips such as a 'Southbridge' or
'Northbridge'.
To find the exact device and functionality you will need to consult
the hardware manuals for your system.
> 2) Can we configure hardware (say, I/O APIC) so that alway higher
> priority interrupt's handler runs first?
My experience with small form-factor (pc104) X86 is that much of the
setup/assignments of priority is done in the BIOS. I found it to be
complex to change the assignments after the kernel is running so your
best chance is to use the features of your BIOS.
Remember that the ISR typically exists as only a handful of lines of
code. Its job is to determine that its hardware was the one
interrupting (for when hardware shares interrupt lines), do whatever
hardware changes are required (clear interrupt flags, acknowledge DMA,
etc.), and then tell the kernel to schedule the rest of the handler
(tasklet/bottom half, etc.).
A truly prioritized interrupt would allow the higher level interrupt
to preempt the running of a lower levels ISR and tasklet. A lower
level interrupt would be held off until the higher level interrupts
ISR has completed, but it then could preempt the running of the higher
level interrupts tasklet.
Once all interrupts are scheduled to run as tasklets, it is the order
they are queued that determines their run order (last in, first run).
For example, scheduling the tasklet for a higher level interrupt with
tasklet_hi_schedule() will allow it to run before those scheduled with
tasklet_schedule().
Thus there are two places to control interrupt servicing priorities.
The hardware level which allows preemption during the microseconds
long hardware ISR code, and the software (tasklet) level that has
priorities assigned by scheduling methods and scheduling order.
-Bruce
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20110217/39c6b579/attachment.html
More information about the Kernelnewbies
mailing list