Как в UEFI запускать код по определённым адресам в памяти? Как работает адресация в x64 режиме?

В UEFI можно запускать код по определенным адресам в памяти с помощью указателей на функции. В x64 режиме адресация осуществляется с использованием 64-битных адресов.

В UEFI, каждый загружаемый модуль представляет собой исполняемый файл в формате PE32+ или TE (UEFI нативный формат). При загрузке модуля, UEFI загрузчик прочитывает информацию о сегментах кода и данных из заголовка файла и использует эту информацию для образования «образа» модуля в памяти. В этом образе располагается исполняемый код модуля, данные, экспортируемые из модуля, импортируемые из других модулей, и таблицу переходов, которая описывает все импорты и экспорты.

UEFI дает возможность вызывать функции, экспортируемые из других модулей, с помощью указателя на функцию. Указатель на функцию представляет собой 64-битное значение, содержащее адрес функции в памяти. Чтобы вызвать функцию, достаточно загрузить в регистр реализующий вызов (например, RAX или RCX) адрес функции и использовать соответствующую инструкцию вызова (например, CALL).

Адресация в x64 режиме осуществляется с помощью 64-битных адресов. В x64 режиме, регистры общего назначения такие, как RAX, RBX, RCX и т.д., резервируются для хранения 64-битных адресов. При адресации памяти, эти регистры используются для хранения и передачи адресов областей памяти.

В x64 режиме, адресная пространство адресует до 2^64 байт памяти, что фактически позволяет адресовать до 18.4 миллиона терабайт памяти. В адресации используется линейный адресный пространство, которое включает физическое адресное пространство и виртуальное адресное пространство.

В общем, для запуска кода по определенным адресам в памяти в UEFI, необходимо использовать указатели на функции, а в x64 режиме адресация происходит с помощью 64-битных адресов, хранящихся в регистрах общего назначения.