Возможно ли выполнить 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-битный код должен либо быть автономным, либо вам нужно будет предоставить thunks для функций библиотеки, которые ему нужны. Помните, что обычно syscalls не вызывается напрямую - вы обычно проходите через обертку libc, которая будет недоступна для вашего 32-битного кода.

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