Трассировка ветвей
Дельта-трассировка инструкций, также известная как трассировки ветвей, работает путём отслеживания выполнения с известного начального адреса путём отправки информации о дельтах, принятых программой. Дельты обычно вводятся инструкциями типа перехода, вызова, возврата и ветвления, хотя прерывания и исключения также являются типами дельт.
Дельта-трассировки команд обеспечивает эффективное кодирование последовательности команд используя детерминированный способ (зависящий от конкретного исполнения риск5), используя подобный способ поведения процессора на основе выполняемой им программы.
Подход основан на автономной копии двоичного файла программы, доступной декодеру, поэтому он, как правило, не подходит для динамических (самоизменяющихся) программ, ни для тех, где доступ к двоичному файлу программы запрещён.
Хотя двоичного кода программы достаточно, доступ к сборке или исходному коду более высокого уровня улучшит способность декодера представлять декодированную трассировку в отладчике, аннотирую отслеживаемые инструкции номерами строк исходного кода и метками, именами переменных и т.д.
Этот подход может быть расширен для работы с небольшими участками детерминировано динамического кода, если декодер запросит память команд у цели. Поиск в памяти обычно приводит к недопустимому снижению производительности, хотя они подходят для изучения таблиц переходов, таких как указатели векторов исключений/прерываний операционной системы, который могут быть скорректированы при загрузке и при регистрации служб. С помощью этого подхода можно отслеживать как статические, так и динамически связанные программы. Статически связанные программы просты, поскольку они обычно работают в известном адресном пространстве, часто отображаясь непосредственно в физическую память. Динамически связанные программы требуют, чтобы отладчик отслеживал операции выделения памяти с помощью отладки в режим трассировки или остановки.
2.1 Концепции дельта-трассировки инструкций
2.1.1 Последовательные инструкции
Для архитектуры набора команд, таких как RISC-V, где все инструкции выполняются безусловно или, по крайней мере, их выполнение может быть определено на основе двоичного файла программы, предполагается, что инструкции между дельтами выполняются последовательно. Следовательно, нет необходимости сообщать о них в трассировке. Трассировка должна содержать только информацию о том, были ли взяты ветви или нет, адреса принятых косвенных переходов или другие прерывания счётчика программ.
2.1.2 Непереносимые разрывы ПК
Непереходное прерывание счётчика программ- это изменение счётчика программ, которое не может быть получено только из двоичного файла программы. В этих случаях дельта-трассировка инструкции должна включать адрес назначения: адрес следующей действительной инструкции.
Примером этого являются косвенные переходы, когда адрес следующей инструкции определяется содержимым регистра, а не константой, встроенной в двоичный файл программы. В этом случае необходимо отследить адрес инструкции, следующей за прыжком (также известной как jump-target).
Прерывания и исключения являются ещё одной формой недопустимого прерывания работы ПК; они подробно обсуждаются ниже.
2.1.3 Ветви
Ветвь-это инструкция, в которой переход зависит от значения регистра или флага. Чтобы декодер мог отслеживать поток программы, трассировка должна включать в себя, была ли взята ветвь или нет.
Для прямой ветви, где адрес назначения кодируется в двоичном файле программы (либо как константа, либо как постоянное смещение от счётчика программы), дополнительная информация не требуется. Прямые ветви-это единственный тип ветвей, который поддерживается ISA RISC-V
2.1.4 Прерывания и исключения
Прерывания-это другой тип дельты, который обычно происходит асинхронно с выполнением программы, а не намеренно в результате определённой инструкции или события. Исключения можно рассматривать таким же образом, даже если они обычно могут быть связаны с определённым адресом инструкции.
Декодер, как правило, не знает где произошло прерывание в последовательности команд, поэтому трассировка должна сообщать адрес, по которому прекратился обычный поток программ, а также указывать асинхронное назначение, которое может быть таким же простым, как сообщение о типе исключения. При возникновении прерывания или исключения необходимо отследить окончательную инструкцию, удалённую заранее, после этого необходимо отследить следующий действительный адрес инструкции (первый из обработчика ловушек (traps)).
Примечание: не все исключения и прерывания вызывают ловушки. Наиболее примечательно, что исключения с плавающей запятой и отключенные прерывания не перехватываются. Если исключение или прерывания не перехватывается, счётчик программ не изменяется. Таким образом, нет необходимости отслеживать все исключения/прерывания, просто ловушки. В этом документе прерывания и исключения отслеживаются тогда, когда они приводят к возникновении ловушек.
2.1.5 Синхронизация
Чтобы сделать трассировку надёжной, в трассировке должны быть регулярные точки синхронизации. Синхронизация выполняется путём отправки полного адреса инструкции (и возможно, идентификатора контекста). Декодеру и отладчику также может быть полезно отправить причину синхронизации. Частота синхронизации- это компромисс между надёжности и ПСП трассировки.
Кодировщик трассировки команд должен полностью синхронизироваться:
1) Для первой инструкции, отслеживаемой после сброса или возобновления с остановки;
2) Каждый раз, когда отслеживается инструкция, а предыдущая инструкция не отслеживалась;
3) Если инструкция является началом процедуры сервисного прерывания или обработчика исключения;
4) После длительного периода времени.
2.1.6 Завершение трассировки
Если трассировка останавливается по какой-либо причине, то должен быть выведен адрес последней отслеживаемой инструкции.
Вот некоторые примеры того, почему отслеживание может прекратиться:
1) Аппаратный поток (HART) может быть остановлен (введен режим отладки);
2) Аппаратный поток может быть перезагружен;
3) Кодирование может быть остановлено (например, с помощью триггера трассировки, об этом мы узнаем в 3 главе)
4) Критерии соответствия для любых возможностей фильтрации, реализованных кодировщиком, могут больше не выполняться;
5) Кодировщик может быть отключен;