Глава 26: Основы обработчика байт-кода

Добро пожаловать в другие главы Давайте разберемся с Chrome V8

1. Введение

За что отвечает обработчик байт-кода? В V8 сам интерпретатор состоит из набора фрагментов кода обработчика, каждый из которых обрабатывает определенный байт-код. Итак, обработчик — это инструкция, реализующая байт-код.

В C++ вы знаете, что V8 написан с использованием C++, обработчик — это функция, реализующая байт-код, а интерпретатор, выполняющий байт-код, просто вызывает соответствующую функцию. Давайте подумаем над вопросом, дайте байткод, как найти нужный обработчик? Возможно, есть сопоставление между байт-кодом и обработчиком. Да, именно массив dispatch_table сопоставляет байт-коды с правильными обработчиками, в которых байт-коды являются индексами, а адреса обработчиков — значениями. Все обработчики реализованы в файлеterpreter-generator.cc.

Позвольте мне дать вам представление об обработчике и просто дать вам общий обзор без дополнительных подробностей.

Приведенный выше код представляет собой два обработчика, один из которых — Star, а другой — Mov. Dispatch() просматривает таблицу dispatch_table для перехода к следующему байт-коду, который вы можете рассматривать как отправку как машинный регистр ПК.

2. Инициализация

Когда V8 создает Isolate, он загружает обработчик из файла моментального снимка. Все обработчики уже собраны и записаны в бинарный файл snapshot.bin до сборки V8. Для V8 обработчики — это просто внешние функции импорта. Следующий код является обработчиком загрузки, а именно встроенными настройками.

Я говорил об этих макросах, таких как BUILD_BCH и BUILTIN_LIST, в прошлой главе. Ниже приведен GenerateBytecodeHandler.

В приведенном выше коде Builtins::name знает все имена байт-кода. Я имею в виду, что вы можете посмотреть имена прямо здесь. Я печатал имена с тех пор, как был новичком. Следующий код — это Builtins::name.

Как я уже сказал, встроенные_метаданные содержат все встроенные имена, в которых есть не только имена байт-кода, но и другие встроенные имена. На рис. 1 показан номер 1075, имя DebugBreakHandler и тип BCH.

Следующий код представляет собой интерпретатор::GenerateBytecodeHandler(), который вызывается в коде GenerateBytecodeHandler().

В приведенном выше коде переключатель строки 14 и макрос BYTECODE_LIST работают вместе для инициализации всех обработчиков байт-кода. Следующий код — BYTECODE_LIST.

В приведенном выше коде я расширяю kmide и kLdaSmi, чтобы продемонстрировать, как работает коммутатор, а на рис. 2 показан стек вызовов.

Следующий код представляет собой LdaSmi, инициализирующий расширение связанного макроса. Если вы углубитесь в это, вы обнаружите, что базовый класс байт-кода исходит от TurboFan. В будущем я продемонстрирую, как турбовентилятор генерирует байт-код.

См. приведенный выше код, строка 19 получает операнд smi и сохраняет его в аккумуляторе в строке 20. Если бы вы написали код на ассемблере, вы бы обнаружили, что байт-код очень похож на ассемблер.
Что касается байт-кода, необходимо обратить внимание на три важных класса: InterpreterAssembler, CodeAssembler и CodeAssembler. Если вы занимаетесь реверс-инжинирингом, вам следует изучить байт-код немного глубже, поскольку средства защиты на основе байт-кода широко используются на веб-сайтах.

Хорошо, на этом мы закончили. Увидимся в следующий раз, берегите себя!

Пожалуйста, свяжитесь со мной, если у вас есть какие-либо проблемы. WeChat: qq9123013 Электронная почта: [email protected]

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord . Заинтересованы в хакинге роста? Ознакомьтесь с разделом Схема.