Мне непонятно, как работает Thunking внутри EBC-программы. Например, если функция протокола возвращает адрес функции, то интерпретатор создаст Thunk? Или если я запрашиваю протокол, то интерпретатор создаст thunk-и для всех функций протокола? Откуда он вообще знает, сколько их там штук?

LLM: «Танк здесь — это не кусок сгенерированного кода в памяти,
а логика внутри интерпретатора, срабатывающая в момент вызова.»

То есть, я как думал - адреса у функций нативные одни, а у функций-переходников - вторые.
И вроде бы как для того, чтобы правильно вызывать, в EBC-программе надо бы использовать вторые адреса.
Но нет, они продолжают использовать первые,
и в рантайме каждый раз проверяют, если адрес выходит за границу блока с EBC-кодом, то
заменяют адрес на адрес заглушки (сделать это, кстати, непросто, надо иметь таблицу соответствий).

Либо же они вообще заглушки не создают (кроме одной, входной, ведущий на вызов интерпретатора).
А код выполняет интерпретатор непосредственно (адрес целевой у него же есть).

Или там JIT-компиляция? Т.е. вот инструкция CALL обработана, и они каждый инстанс такой инструкции патчат?

Я думаю, что всё интерпретируется. Но нужно обоснование, почему этот способ единственно возможный. Почему нельзя JIT, AOT, или с какими ограничениями и проблемами они будут.

Было бы неплохо поискать эту логику в коде EDKII.

Отредактировано Лис (2026-01-14 01:01:38)