c - linux中的signal,int 0x80是谁调用的?

标签 c linux assembly

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

最佳答案

首先,。 int 0x80 很长一段时间没有被现代 Intel CPU 上的现代操作系统使用。 sysenter 指令通常很少使用(参见:http://siyobik.info/main/reference/instruction/SYSENTER)。

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

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

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

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

关于c - linux中的signal,int 0x80是谁调用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9111039/

相关文章:

regex - 处理彩色 bash 提示符

c - 我如何将其转换为在 C 程序中工作?

c - 如何在C中打印特定文本的颜色

c - 修复 FANN 随机生成器的种子 - C

c - 如何实现生产者消费者使用流程?

c# - 在linux上使用mono运行VS编译的C#(串行连接)文件

c++ - 在 C++ 中等效的 open(file, O_NONBLOCK)

linux - 在 tcl 中,如何关闭 dp_MakeRPCClient 从 fork 子创建的套接字/ channel 而不在父级中关闭它

C 指针和 AT&T Movl 语法

assembly - SIMD 按变量旋转