1

我正在做这样的研究,试图在 Linux 内核中找到实现中断处理的代码;特别是,我试图找到负责处理系统计时器的代码。

根据http://www.linux-tutorial.info/modules.php?name=MContent&pageid=86

内核处理中断的方式与处理异常的方式非常相似:所有通用 > 用途寄存器都被压入系统堆栈并调用一个公共中断处理程序。>保存当前中断优先级并加载新的优先级。这可以防止较低优先级的 >interrupts 在内核处理此 >interrupt 时中断内核。然后调用真正的中断处理程序。

我正在寻找将所有通用寄存器推送到堆栈上的代码,以及常见的中断处理代码。

至少将通用寄存器推入堆栈是独立于体系结构的,因此我正在寻找与 x86 体系结构相关的代码。目前我正在查看内核源代码的 3.0.4 版本,但任何版本都可能没问题。我已经开始查看 kernel/irq/handle.c,但我没有看到任何看起来像保存寄存器的东西;看起来它正在调用注册的中断处理程序。

4

2 回答 2

1

32 位版本在 中arch/i386/kernel/entry_32.S,64 位版本在entry_64.S. 搜索ENTRY标记内核入口点的各种宏。

于 2012-01-24T23:20:49.170 回答
-1

我正在寻找将所有通用寄存器推入堆栈的代码

硬件在执行中断处理程序之前存储当前状态(包括寄存器)。不涉及代码。并且当中断退出时,硬件从它存储的位置读回状态。

现在,中断处理程序中的代码可以读取和写入保存的寄存器副本,导致在中断退出时恢复不同的值。这就是上下文切换的工作原理。


在 x86 上,硬件仅保存在中断处理程序开始运行之前更改的那些寄存器。在大多数嵌入式架构上,硬件保存所有寄存器。造成差异的原因是x86有大量的寄存器,保存和恢复任何未被中断处理程序修改的都是浪费。所以中断处理程序负责保存和恢复它自愿使用的任何寄存器。

请参阅英特尔® 64 和 IA-32 架构软件开发人员手册,从第 6-15 页开始。

于 2012-01-25T00:22:09.807 回答