Что такое ловушка ветвления процесса?
Сначала немного предыстории: я пишу отладчик, а сейчас пытаюсь различить разные типы точек останова процесса. PTRACE_GETSIGINFO
запрос ptrace()
может помочь получить подробную информацию о сигнале трассировки. для SIGTRAP
Сигнал, существует несколько типов si_code
в том числе TRAP_BRKPT
, TRAP_TRACE
, TRAP_BRANCH
, TRAP_HWBKPT
,
В руководстве sigaction
(man sigaction) в Linux есть si_code
постоянная TRAP_BRANCH
в структуре siginfo_t
и в руководстве сказано, что эта константа обозначает ловушку ветки процесса, поэтому:
1. что такое ловушка ветвления процесса?
Я также заметил, что есть константа TRAP_TRACE, и в руководстве сказано, что эта константа обозначает ловушку процесса, поэтому:
2. в чем разница между ловушкой процесса и ловушкой ветви процесса?
1 ответ
Использовать источник
Способ ответить на ваши вопросы, которые мне нравятся, это посмотреть на источники. Вы не говорите, какое конкретно ядро Linux, поэтому взгляните на источники 3.17.2, по-видимому, по крайней мере, для ознакомления с этой техникой.
Давайте начнем с рекурсивных операций для каждой ловушки...
Grepping для 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 */
Grepping для 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
для целого числа code
из 3, и TRAP_BRANCH
для целого числа code
из 25. Поиск призывов handle_interruption
Я вижу это только из ./arch/parisc/kernel/entry.S
что эта функция называется.
Итак, теперь мы находимся на аппаратном уровне (IMO), и пришло время перейти от исходного кода.
Просмотр технического руководства (й)
Быстрый Google для pa risc code for TRAP_BRANCH
предоставляет PA-RISC 1.1 Архитектура и набор инструкций... - PA-RISC Linux как лучший хит.
Внутри этого PDF-файла поиск кода прерывания 25 раскрывает раздел " Прерывания " руководства, в котором отображаются оба кода. Код 3 появляется в "Группе 2" категорий прерываний на основе их приоритетов, где он указан как "ловушка счетчика восстановления", а код 25 появляется в "Группе 4" и называется "ловушка захваченной ветви".
В поисках следующей "Taken branch" я обнаружил, что есть поле T битов отключения / включения PSW, а также следующие обозначения:
Захваченная ветка ловушек включена. Когда 1, любая взятая ветвь заканчивается ловушкой взятой ветки.
А потом:
Ловушки, связанные с ветвями
Команды ветвления могут вызывать различные прерывания на основе значения битов PSW. Если T-бит PSW равен 1, и ветвление занято, происходит захваченная ловушка ветвления. Эта ловушка может использоваться для целей отладки. Если H-бит PSW равен 1, и инструкция перехода повышает уровень привилегий, возникает ловушка передачи с более высокими привилегиями. Если L-бит PSW равен 1, а команда ветвления понижает уровень привилегий, возникает ловушка передачи с более низкими привилегиями.
Между тем текст для "Восстановление счетчика", говорит:
Счетчик восстановления
Счетчик восстановления (CR 0) - это 32-разрядный счетчик, который может использоваться для программного восстановления аппаратных средств в отказоустойчивых системах, а также для целей отладки.
Позже в документе есть примечание, в котором говорится:
Счетчик восстановления может использоваться для регистрации прерываний во время нормальной работы и для моделирования прерываний во время восстановления после сбоя.
В итоге
Из того, что я могу сказать тогда (по крайней мере для архитектуры PA RISC)...
- Ловушка ветви процесса связана с
TRAP_BRANCH
код Linux, и доступен на некоторых архитектурах для обнаружения, когда ветвь кода была взята. - Разница между "ловушкой процесса" и "ловушкой ветви процесса", предполагая, что под "ловушкой процесса" вы подразумеваете
TRAP_TRACE
Linux-код заключается в том, что первый используется для отладки обработки прерываний, а второй - для отладки принимаемых веток.
Я подозреваю, что эти ответы не слишком далеки от других архитектур, но я оставлю проверку других архитектур на усмотрение других.
Надеюсь это поможет.