【问题标题】:For signal in linux, who calls int 0x80?对于linux中的信号,谁调用int 0x80?
【发布时间】:2012-02-25 00:45:07
【问题描述】:

系统调用、异常、除以 0 等它们在 linux 中都有相同的向量入口。如果在 x86 中,它是 0x80,对吗?那么信号呢?操作系统是否也使用 int 0x80 向进程发送信号?如果是,谁叫它?我们知道,如果你想在内核中捕获陷阱,你必须调用 int 0x80 或者它的包装类似系统调用,但是对于信号的情况,谁调用 0x80 ?

【问题讨论】:

  • 你可能很困惑。内核向应用程序进程发送一个信号(因此它不需要任何int 或陷阱)。阅读basepath.com/aupadvancedlinuxprogramming.comtldp.org/HOWTO/Assembly-HOWTO
  • int 80h 用于产生中断(CPU 将停止执行当前代码并跳转到由 int 编号索引的向量)。 “除以零”是另一种产生中断的方式(当DIV 的第二个参数为零时由CPU 自己生成),它的处理方式类似于int 0h。向量元素指向特定的中断处理程序,它是操作系统内核的一部分。处理程序将检查要做什么,每个 int 数的行为都不同。例如。对于 80 小时,处理程序将启动选定的系统调用(从用户模式切换到内核模式); 0h 它会产生一个信号。

标签: c linux assembly


【解决方案1】:

首先,。 int 0x80 很长时间没有被现代英特尔 CPU 上的现代操作系统使用。现在通常使用 sysenter 指令(请参阅:http://siyobik.info/main/reference/instruction/SYSENTER)。

至于信号,你有两种情况 -

如果在发送信号时信号的目标没有在 CPU 上运行,那么发送信号只不过是在内核数据结构中标记一个位,该位向内核指示当它调度该进程返回到CPU 将程序计数器放入信号处理例程而不是原始 PC。

但是,如果发送信号时您发送信号的程序正在 CPU 上运行,则信号将作为中断触发 - 如果信号是同步的(例如除以零异常),则中断是异常CPU 内核产生的中断。如果信号是异步的(例如在另一个内核上运行的另一个进程发送信号),则中断是从另一个内核发送的处理器间中断。

那么,任何地方都没有 int 0x80 :-)

【讨论】:

    【解决方案2】:

    基本上,信号不像中断。用户级进程被内核定期中断。当它要向用户级进程发送信号时,内核只是让用户级进程的指令指针指向信号处理程序代码,然后再对其进行调度。它还相应地设置堆栈和其他寄存器。

    【讨论】:

    • 同意,只是从长远来看,从概念上(但不是细节)异步信号有点像中断......(即使它们当然不是中断)
    • 请阅读问题。 “除以零”是一个中断(同步的,软件生成的,检查pdos.csail.mit.edu/6.828/2005/lec/lec8-slides.pdf)。它将由内核中的中断处理程序处理(这里是处理程序lxr.linux.no/#linux+v2.6.33/arch/x86/kernel/traps.c#L891的设置)。它将(在 do_trap 函数中)设置挂起信号的“标志”,并强制使用force_sig_info 立即传递信号
    【解决方案3】:

    当您调用syscall 时,您使用int 0x80

    但是,当您收到来自另一个进程或SIGSEGVSIGFPE 的信号时,您不必调用int 0x80 来获取它。

    处理调用sched_tick 的定时器中断也会在将控制权返回给用户空间进程之前检查是否有信号未决,如果存在(并且信号掩码允许),则调用相应的信号处理程序。

    【讨论】:

    • 另外,当接收到信号时,内核会设置调用堆栈,以便在从用户的信号处理程序返回后立即调用 sigreturn 系统调用...
    • 最好的面向回报的编程 =D
    猜你喜欢
    • 1970-01-01
    • 2015-06-09
    • 2013-04-29
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2019-06-10
    相关资源
    最近更新 更多