系统调用,异常,除以0等,它们在linux中都具有相同的向量条目。如果在x86中,它是0x80,对吗?信号怎么样?操作系统是否也使用int 0x80作为进程的信号?如果有,谁叫它?我们知道如果你想要内核中的陷阱,你必须调用int 0x80或它的包装器,如系统调用,但对于信号的情况,谁调用0x80?
答案 0 :(得分:6)
首先,现代操作系统在现代英特尔CPU上很久没有使用int 0x80了。现在通常使用sysenter指令(参见:http://siyobik.info/main/reference/instruction/SYSENTER)。
至于信号,你有两种情况 -
如果信号的目标在发送信号时没有在CPU上运行,那么发送信号只不过是在内核数据结构中标记一点,这表明内核在调度该进程时会返回到CPU将程序计数器放入信号处理程序而不是原始PC。
但是,如果发送信号时发送信号的程序在CPU上运行,则信号作为中断触发 - 如果信号是同步的(例如除零异常),则中断是例外从CPU核心生成的中断。如果信号是异步的(例如另一个进程发送信号的另一个进程),则该中断是从另一个核心发送的处理器间中断。
所以,在任何地方都没有int 0x80: - )
答案 1 :(得分:4)
基本上信号不像中断。内核会定期中断用户级进程。当它要向用户级进程发送信号时,内核只是使用户级进程的指令指针在再次调度之前指向信号处理程序代码。它还相应地设置堆栈和其他寄存器。
答案 2 :(得分:3)
当您致电syscall
时,请使用int 0x80
。
但是,当您收到来自其他流程或SIGSEGV
或SIGFPE
的信号时,您无需致电int 0x80
即可获取该信号。
处理调用sched_tick
的定时器中断还会在将控制权返回给用户空间进程之前检查是否有未决信号,如果存在(并且信号掩码允许),则调用适当的信号处理程序。