“int 3” 的真正作用是什么?

4
根据这篇文章,用户空间使用int 3可生成SIGTRAP信号。
但是当处于用户空间下的特权模式时,这个操作应该做什么呢?
是否还有其他可以从用户空间生成此类SIGTRAP信号的方法?
1个回答

11
int 3 操作码并不了解UNIX约定,例如SIGTRAP。int 3会生成异常,该异常通过索引3进行矢量处理。它通常被认为是调试异常,实际上,调试寄存器也将通过相同的索引生成异常。
int 3有点特殊,因为它是一个单字节操作码;与需要2个字节的其他int $ n指令不同。由于它是一个单字节,因此它可以通过使用它来重新编写现有操作码的第一个字节,在程序中放置断点。 尽管从技术上讲,您可以使用多字节操作码来做到这一点,但可能紧接着程序文本的下一个字节是重要的数据或跳转标签,您可能会破坏它们。
按照惯例,衍生自UNIX的操作系统遇到此操作码时将引发信号(SIGTRAP)。这为调试器(或内核中的调试模块)提供了机会,以查找冒犯地址,看看它是否先前在该地址处设置了断点(或监视点)。如果有,则执行通常的调试器操作。如果没有,就可能将SIGTRAP传播到冒犯进程。
如果在特权(内核)代码中遇到断点,处理过程并没有太大的区别,但是期望有一个内核调试器处于活动状态,并且它会遵循与上述类似的处理过程,只是在没有挂起断点的情况下,可能会在控制台上停止系统并显示一堆有趣的数字。

那么这仍然是内核级别的黑客吗?Int 3生成一个异常,该异常通过索引3进行向量化。<-但汇编语言不知道异常,对吧?你是指中断吗?如果是这样,在ia32和amd64上是哪个中断?其他架构呢? - 1737973
机器架构定义了异常;因此,虽然汇编语言不知道它们,但实现它的机器非常了解它们。这并不是一个黑客行为,而是一个明确定义的架构组件,并且精确地实现以适应其目的。它的用途比调试更广泛,例如许多跟踪工具依赖于断点来检测已执行和未执行的内容。 - mevets
机器异常和C++异常是不同的东西,不要混淆。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接