2016-01-13 44 views
2

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

我的问题: 在Linux中每一个中断(例外情况(包括系统调用),中断),以同样的方式派出直到到达某一点分支? (在他们的类型的原因)

对不起,我的英语。

回答

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中每一个中断(例外情况(包括 系统调用),中断),以同样的方式派出直到达到一定 点分支? (在他们的类型的原因)

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

更多信息,你可以找到在Intel® 64 and IA-32 Architectures Software Developer’s Manual 3A

+0

谢谢您的回答。如何达到我们在x86上分别分配这三个位置的目的? (SysCalls,异常,硬件中断)如果我知道正确,每个中断(由于SYSENTER和SYSEXIT指令,SysCalls已经不存在)处于硬件级别,指向它的向量号地址。 –