在Linux中调度相同调度程序的硬件中断和系统调用/异常?如果您看到Linux源代码,您会注意到它们的中断向量上的硬件中断(在x86 arch上)不包含更多的指令,即PUSH中断堆栈中的向量编号,JUMP中断为common_interrupt。在Linux中调度中断和系统调用
我的问题: 在Linux中每一个中断(例外情况(包括系统调用),中断),以同样的方式派出直到到达某一点分支? (在他们的类型的原因)
对不起,我的英语。
在Linux中调度相同调度程序的硬件中断和系统调用/异常?如果您看到Linux源代码,您会注意到它们的中断向量上的硬件中断(在x86 arch上)不包含更多的指令,即PUSH中断堆栈中的向量编号,JUMP中断为common_interrupt。在Linux中调度中断和系统调用
我的问题: 在Linux中每一个中断(例外情况(包括系统调用),中断),以同样的方式派出直到到达某一点分支? (在他们的类型的原因)
对不起,我的英语。
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
谢谢您的回答。如何达到我们在x86上分别分配这三个位置的目的? (SysCalls,异常,硬件中断)如果我知道正确,每个中断(由于SYSENTER和SYSEXIT指令,SysCalls已经不存在)处于硬件级别,指向它的向量号地址。 –