что на самом деле делает инструкция endbr64? - PullRequest
3 голосов
/ 05 июля 2019

Я пытался понять код на ассемблере, сгенерированный GCC, и часто сталкивался с этой инструкцией при запуске многих функций, включая _start (), но не смог найти никакого руководства, объясняющего его назначение

31-0000000000001040 <_start>:
32:    1040:    f3 0f 1e fa             endbr64 
33-    1044:    31 ed                   xor    ebp,ebp

1 Ответ

4 голосов
/ 06 июля 2019

Это означает «Конечная ветвь 64 бита», или, точнее, «Завершить косвенную ветвь в 64 бита»

У Intel есть документ об этой инструкции .

Вот операция:

IF EndbranchEnabled(CPL) & EFER.LMA = 1 & CS.L = 1
  IF CPL = 3
  THEN
    IA32_U_CET.TRACKER = IDLE
    IA32_U_CET.SUPPRESS = 0
  ELSE
    IA32_S_CET.TRACKER = IDLE
    IA32_S_CET.SUPPRESS = 0
  FI
FI;

В противном случае инструкция считается NOP.

Функция CET используется для того, чтобы убедиться, что ваши непрямые ветви действительно идут в правильное местоположение.,Это обеспечивает дополнительную безопасность.Вот параграф от Intel об этом:

ENDBRANCH (подробности см. В разделе 73) - это новая инструкция, которая используется для маркировки действительных целевых адресов перехода косвенных вызовов и переходов в программе.Этот код операции команды выбран как код NOP на устаревших машинах, так что программы, скомпилированные с новой командой ENDBRANCH, продолжают работать на старых машинах без применения CET.На процессорах, которые поддерживают CET, ENDBRANCH по-прежнему является NOP и в основном используется конвейерным процессором в качестве команды маркера для обнаружения нарушений потока управления.Процессор реализует конечный автомат, который отслеживает косвенные команды jmp и call.Когда одна из этих инструкций замечена, конечный автомат переходит из состояния IDLE в состояние WAIT_FOR_ENDBRANCH.В состоянии WAIT_FOR_ENDBRANCH следующая инструкция в потоке программы должна быть ENDBRANCH.Если ENDBRANCH не виден, процессор вызывает исключение защиты управления (#CP), иначе конечный автомат возвращается в состояние IDLE.

...