Можно ли выполнить 32-битный код в 64-битном процессе, переключив режим?

На этой странице http://www.x86-64.org/pipermail/discuss/2004-August/005020.html Он сказал, что существует способ смешать 32-битный код и 64-битный код в приложении. Он предположил, что приложение является 32-битным (в режиме совместимости), а затем переключается в 64-битный режим для выполнения 64-битного кода и наоборот.

Предположим, что моя ОС 64-битная Linux, а мое приложение 64-битное. Я делаю дальний прыжок, чтобы перейти в режим совместимости и выполнить 32-битный код. Может ли он работать правильно, когда я делаю системный вызов или вызов функции?

Есть ли издержки переключения режимов между режимом совместимости и 64-битным режимом? Я думаю, что одна из накладных расходов - мне нужен отдельный стек для 32-битных и 64-битных.

Могу ли я интегрировать эту идею в JVM, может быть, я могу динамически генерировать 32-битный код в 64-битной JVM и выполнять его путем переключения режимов?

1 ответ

Системные вызовы с открытым кодом должны быть в порядке, так как ваш 32-битный код будет использовать 32-битную точку входа в ядро.

Разумеется, вызовы функций могут выполняться только для другого 32-битного кода. Это включает libc - так что ваш 32-битный код должен быть либо автономным, либо вы должны будете предоставить блоки для функций библиотеки, которые ему нужны. Помните, что обычно системные вызовы не вызываются напрямую - вы обычно проходите через libc обертка, которая будет недоступна для вашего 32-битного кода.

Конечно, есть издержки для переключения между режимами. Вам следует обратиться к документации вашего процессора, чтобы узнать, что это такое.

Другие вопросы по тегам