Что такое ловушка ветвления процесса?

Сначала немного предыстории: я пишу отладчик, а сейчас пытаюсь различить разные типы точек останова процесса. 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)...

  1. Ловушка ветви процесса связана с TRAP_BRANCH код Linux, и доступен на некоторых архитектурах для обнаружения, когда ветвь кода была взята.
  2. Разница между "ловушкой процесса" и "ловушкой ветви процесса", предполагая, что под "ловушкой процесса" вы подразумеваете TRAP_TRACE Linux-код заключается в том, что первый используется для отладки обработки прерываний, а второй - для отладки принимаемых веток.

Я подозреваю, что эти ответы не слишком далеки от других архитектур, но я оставлю проверку других архитектур на усмотрение других.

Надеюсь это поможет.

Другие вопросы по тегам