Linux 是否可以通过模式切换在64位进程中执行32位代码?

Linux 是否可以通过模式切换在64位进程中执行32位代码?,linux,jvm,32bit-64bit,x86-64,Linux,Jvm,32bit 64bit,X86 64,在本页中, 他说有一种方法可以在应用程序中混合使用32位代码和64位代码。他假设应用程序是32位的(在兼容模式下),然后切换到64位模式以执行64位代码,反之亦然 假设我的操作系统是64位linux,而我的应用程序是64位的。我跳转到兼容模式并执行32位代码。当我进行系统调用或函数调用时,它是否可以正常工作 兼容模式和64位模式之间的模式切换是否有任何开销?我认为其中一个开销是我需要单独的32位和64位堆栈 我是否可以将这个想法集成到JVM中,也许我可以在64位JVM中动态生成32位代码,并通过

在本页中, 他说有一种方法可以在应用程序中混合使用32位代码和64位代码。他假设应用程序是32位的(在兼容模式下),然后切换到64位模式以执行64位代码,反之亦然

假设我的操作系统是64位linux,而我的应用程序是64位的。我跳转到兼容模式并执行32位代码。当我进行系统调用或函数调用时,它是否可以正常工作

兼容模式和64位模式之间的模式切换是否有任何开销?我认为其中一个开销是我需要单独的32位和64位堆栈


我是否可以将这个想法集成到JVM中,也许我可以在64位JVM中动态生成32位代码,并通过模式切换执行它?

开放编码系统调用应该可以,因为您的32位代码将使用32位内核入口点

当然,函数调用只能对其他32位代码进行。这包括
libc
——因此您的32位代码必须是自包含的,或者必须为它所需的库函数提供thunk。请记住,通常不会直接调用系统调用-您通常通过32位代码无法使用的
libc
包装器进行调用


在模式之间切换肯定会有开销。您应该查阅处理器文档以了解它是什么。

如果您使用的是64位JVM,为什么要生成32位代码?您可以用64位代码(几乎)完成所有需要的32位操作;即使在64位模式下,大多数指令也默认为32位操作数。因为我想比较32位代码和64位代码之间的差异。也许我可以在某些情况下得到不同,比如长类型的大小,或者每种情况的执行时间。再次阅读文章,它建议修改CS——这将调用自定义
ld。所以
之类的东西。请确保您对此做好了准备。您认为,我必须准备两个不同版本的libc(32位和64位),但是否可以使用dlopen将32位和64位库加载到可执行文件中,甚至是动态加载?我觉得不可能。@萧惠秋:不,一般来说是不可能的,反正你也不想这么做。两个不同的
libc
意味着两组冲突的stdio缓冲区和类似的问题。相反,您需要编写32位thunk,将其切换回long模式,然后调用到64位libc中,包括必要的参数和结果洗牌。