Linux中的中断和系统调用调度

时间:2016-01-13 16:04:28

标签: linux interrupt system-calls interrupt-handling

是否在Linux中由同一个调度程序调度了硬件中断和系统调用/异常?如果您看到Linux源代码,您会注意到它们的中断向量上的硬件中断(在x86 arch上)并不包含更多指令,PUSH中断堆栈上的向量编号,JUMP到common_interrupt。

我的问题: Linux中的每个中断(例外(包括SysCall),中断)都以相同的方式调度,直到达到某个分支点为止? (由于他们的类型)

抱歉我的英文。

1 个答案:

答案 0 :(得分:3)

  

是否在Linux中由同一个调度程序调度了硬件中断和系统调用/异常?

没有。异常,系统调用和硬件中断以不同的方式分派。如果您查看arch/x86/entry/entry_64.S,您会发现所有这些内容。首先是idtentry宏:

.macro idtentry sym do_sym has_error_code:req paranoid=0 shift_ist=-1
ENTRY(\sym)
...
...
...
END(\sym)
.endm

为异常处理提供准备(存储寄存器,调用异常处理程序等等)。还使用idtentry宏定义了异常处理程序:

idtentry divide_error           do_divide_error         has_error_code=0
idtentry overflow           do_overflow         has_error_code=0
idtentry bounds             do_bounds           has_error_code=0

大多数异常处理程序都在arch/x86/kernel/trap.c

硬件中断的入口点为irq_entries_start。系统调用处理从entry_SYSCALL_64开始。

  

我的问题:Linux中是否存在每个中断(例外(包括   SysCall),中断)以相同的方式发送,直到达到一些   指向分支? (由于他们的类型)

没有。它们相似,但不一样。例如,系统调用准备例程(entry_SYSCALL_64)检查系统调用的类型(64位或32位仿真),每次执行前都有相同的寄存器状态(取决于ABI)等。 。,但是例如异常处理程序首先检查异常类型以从IST等选择正确的堆栈。

您可以在Intel® 64 and IA-32 Architectures Software Developer’s Manual 3A

中找到更多信息