什么是进程分支陷阱?

What is process branch trap?

首先介绍一些背景知识:I'm writing a debugger 现在我正在尝试区分不同类型的进程断点。 ptrace()PTRACE_GETSIGINFO请求可以帮助获取tracee信号的详细信息。对于SIGTRAP信号,有几种类型的si_code包括TRAP_BRKPTTRAP_TRACETRAP_BRANCHTRAP_HWBKPT.

在Linux中sigaction(man sigaction)的手册中,结构siginfo_t中有一个si_code常量TRAP_BRANCH,手册说这个常量表示进程分支陷阱,所以:

1.什么是进程分支陷阱?

我还注意到有一个“TRAP_TRACE”常量,手册上说这个常量表示进程陷阱,所以:

2。进程陷阱和进程分支陷阱有什么区别?

使用来源

我喜欢回答您的问题的一种方法是查看来源。你没有具体说哪个 linux 内核,所以看一下 3.17.2 源代码似乎至少可以用来说明这种技术。

让我们从每个陷阱的递归 greps 开始...

正在搜索 TRAP_BRANCH

$ grep -r TRAP_BRANCH .
./arch/ia64/kernel/brl_emu.c:       siginfo.si_code = TRAP_BRANCH;
./arch/ia64/kernel/traps.c:           case 35: siginfo.si_code = TRAP_BRANCH; ifa = 0; break;
./arch/parisc/kernel/traps.c:           handle_gdb_break(regs, TRAP_BRANCH);
./include/uapi/asm-generic/siginfo.h:#define TRAP_BRANCH     (__SI_FAULT|3)  /* process taken branch trap */

正在搜索 TRAP_TRACE

$ grep -r TRAP_TRACE . | egrep -v HV
./arch/avr32/kernel/ptrace.c:           code = TRAP_TRACE;
./arch/avr32/kernel/ptrace.c:       code = TRAP_TRACE;
./arch/blackfin/include/uapi/asm/siginfo.h:#define TRAP_TRACEFLOW   (__SI_FAULT|2)  /* trace buffer overflow ************* */
./arch/blackfin/kernel/traps.c:     info.si_code = TRAP_TRACEFLOW;
./arch/frv/kernel/traps.c:          (__frame->__status & REG__STATUS_STEPPED) ? TRAP_TRACE : TRAP_BRKPT;
./arch/ia64/kernel/brl_emu.c:       siginfo.si_code = TRAP_TRACE;
./arch/ia64/kernel/traps.c:           case 36: siginfo.si_code = TRAP_TRACE; ifa = 0; break;
./arch/m68k/kernel/asm-offsets.c:   DEFINE(LTRAP_TRACE, TRAP_TRACE);
./arch/m68k/kernel/traps.c:     info.si_code = TRAP_TRACE;
./arch/m68k/math-emu/fp_entry.S:    pea LTRAP_TRACE
./arch/mn10300/kernel/kgdb.c:       si_code = TRAP_TRACE;
./arch/mn10300/kernel/traps.c:  [EXCEP_ISTEP >> 3]  = { SIGTRAP,    TRAP_TRACE },   /* Monitor */
./arch/openrisc/kernel/traps.c: info.si_code = TRAP_TRACE;
./arch/parisc/kernel/ptrace.c:      si.si_code = TRAP_TRACE;
./arch/parisc/kernel/traps.c:           handle_gdb_break(regs, TRAP_TRACE);
./arch/powerpc/kernel/traps.c:  info->si_code = TRAP_TRACE;
./arch/powerpc/kernel/traps.c:  _exception(SIGTRAP, regs, TRAP_TRACE, regs->nip);
./arch/powerpc/kernel/traps.c:      _exception(SIGTRAP, regs, TRAP_TRACE, regs->nip);
./arch/x86/include/asm/traps.h:#include <asm/siginfo.h>         /* TRAP_TRACE, ... */
./arch/x86/include/asm/traps.h:     return TRAP_TRACE;
./include/uapi/asm-generic/siginfo.h:#define TRAP_TRACE (__SI_FAULT|2)  /* process trace trap */

比较 grep 结果

所以至少相对而言,TRAP_TRACETRAP_BRANCH 的使用频率更高,架构也更多。更具体地说,TRAP_BRANCH 仅用于 2 个架构(ia64parisc),而 TRAP_TRACE 用于 10 个架构(avr32blackfinfrvia64m68kmn10300openriscpariscpowerpcx86 ).

然而,我发现仅注意句法差异还不够令人满意。我也想了解语义差异。

检查代码

从 grep 输出中,我看到了一种模式,其中在 ./arch/*/kernel/traps.c 个文件中找到最一致的匹配项。

然后查看 ./arch/parisc/kernel/traps.c,其中使用了两个陷阱,我发现它们都在 handle_interruption 函数的上下文中使用。 TRAP_TRACE 表示 3 的整数 codeTRAP_BRANCH 表示 25 的整数 code。搜索 handle_interruption 的调用时,我发现它仅来自 ./arch/parisc/kernel/entry.S 这个函数被调用了。

所以现在我们进入了硬件领域 (IMO),是时候从源代码继续前进了。

查看技术手册

pa risc code for TRAP_BRANCH 的快速 google 提供了 PA-RISC 1.1 Architecture and Instruction Set ... - PA-RISC Linux 作为热门。

在此 PDF 中,搜索中断代码 25,会显示手册的 Interruptions 部分,其中显示了两个代码。代码 3 根据其优先级出现在 "Group 2" 中断类别中,其中指定为 "Recovery counter trap",而代码 25 出现在 "Group 4" 中并称为 "Taken branch trap"。 =47=]

接下来搜索 "Taken branch",我发现 PSW disable/enable 位的 T 字段以及以下符号:

Taken branch trap enable. When 1, any taken branch is terminated with a taken branch trap.

然后:

Traps Associated with Branches

Branch instructions may cause various traps based on the value of PSW bits. If the PSW T-bit is 1, and a branch is taken, a taken branch trap occurs. This trap may be used for the purposes of debugging. If the PSW H-bit is 1, and a branch instruction raises the privilege level, a higher-privilege transfer trap occurs. If the PSW L-bit is 1, and a branch instruction lowers the privilege level, a lower-privilege transfer trap occurs.

同时 "Recovery Counter" 的文本说:

Recovery Counter

The Recovery Counter (CR 0) is a 32-bit counter that can be used to provide software recovery of hardware faults in fault-tolerant systems, and can also be used for debugging purposes.

稍后在文档中有一条注释说:

The recovery counter can be used to log interruptions during normal operation and to simulate interruptions during recovery from a fault.

总结

据我所知(至少对于 PA RISC 架构)...

  1. 进程分支陷阱TRAP_BRANCH linux 代码相关联,并且在某些体系结构上可用,用于检测何时采取代码分支.
  2. "process trap"和"process branch trap"的区别,假设"process trap"是指TRAP_TRACElinux 代码,前者用于中断处理的调试,后者用于分支的调试。

我怀疑这些答案对于其他架构来说并不算太远,但我会把检查其他架构留给其他人去做。

希望对您有所帮助。