什么是进程分支陷阱?
What is process branch trap?
首先介绍一些背景知识:I'm writing a debugger 现在我正在尝试区分不同类型的进程断点。 ptrace()
的PTRACE_GETSIGINFO
请求可以帮助获取tracee信号的详细信息。对于SIGTRAP
信号,有几种类型的si_code
包括TRAP_BRKPT
、TRAP_TRACE
、TRAP_BRANCH
、TRAP_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_TRACE
比 TRAP_BRANCH
的使用频率更高,架构也更多。更具体地说,TRAP_BRANCH
仅用于 2 个架构(ia64
和 parisc
),而 TRAP_TRACE
用于 10 个架构(avr32
、blackfin
、frv
、ia64
、m68k
、mn10300
、openrisc
、parisc
、powerpc
和 x86
).
然而,我发现仅注意句法差异还不够令人满意。我也想了解语义差异。
检查代码
从 grep 输出中,我看到了一种模式,其中在 ./arch/*/kernel/traps.c
个文件中找到最一致的匹配项。
然后查看 ./arch/parisc/kernel/traps.c
,其中使用了两个陷阱,我发现它们都在 handle_interruption
函数的上下文中使用。 TRAP_TRACE
表示 3 的整数 code
,TRAP_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 架构)...
- 进程分支陷阱 与
TRAP_BRANCH
linux 代码相关联,并且在某些体系结构上可用,用于检测何时采取代码分支.
- "process trap"和"process branch trap"的区别,假设"process trap"是指
TRAP_TRACE
linux 代码,前者用于中断处理的调试,后者用于分支的调试。
我怀疑这些答案对于其他架构来说并不算太远,但我会把检查其他架构留给其他人去做。
希望对您有所帮助。
首先介绍一些背景知识:I'm writing a debugger 现在我正在尝试区分不同类型的进程断点。 ptrace()
的PTRACE_GETSIGINFO
请求可以帮助获取tracee信号的详细信息。对于SIGTRAP
信号,有几种类型的si_code
包括TRAP_BRKPT
、TRAP_TRACE
、TRAP_BRANCH
、TRAP_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_TRACE
比 TRAP_BRANCH
的使用频率更高,架构也更多。更具体地说,TRAP_BRANCH
仅用于 2 个架构(ia64
和 parisc
),而 TRAP_TRACE
用于 10 个架构(avr32
、blackfin
、frv
、ia64
、m68k
、mn10300
、openrisc
、parisc
、powerpc
和 x86
).
然而,我发现仅注意句法差异还不够令人满意。我也想了解语义差异。
检查代码
从 grep 输出中,我看到了一种模式,其中在 ./arch/*/kernel/traps.c
个文件中找到最一致的匹配项。
然后查看 ./arch/parisc/kernel/traps.c
,其中使用了两个陷阱,我发现它们都在 handle_interruption
函数的上下文中使用。 TRAP_TRACE
表示 3 的整数 code
,TRAP_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 架构)...
- 进程分支陷阱 与
TRAP_BRANCH
linux 代码相关联,并且在某些体系结构上可用,用于检测何时采取代码分支. - "process trap"和"process branch trap"的区别,假设"process trap"是指
TRAP_TRACE
linux 代码,前者用于中断处理的调试,后者用于分支的调试。
我怀疑这些答案对于其他架构来说并不算太远,但我会把检查其他架构留给其他人去做。
希望对您有所帮助。