是否在Linux中由同一个调度程序调度了硬件中断和系统调用/异常?如果您看到Linux源代码,您会注意到它们的中断向量上的硬件中断(在x86 arch上)并不包含更多指令,PUSH中断堆栈上的向量编号,JUMP到common_interrupt。
我的问题: Linux中的每个中断(例外(包括SysCall),中断)都以相同的方式调度,直到达到某个分支点为止? (由于他们的类型)
抱歉我的英文。
答案 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
中找到更多信息