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

8
在这个页面上,他说有一种方法可以在应用程序中混合32位代码和64位代码。他假设应用程序处于32位(兼容模式),然后切换到64位模式来执行64位代码,反之亦然。
假设我的操作系统是64位Linux,我的应用程序也是64位的。我通过远跳转换到兼容模式并执行32位代码。当我进行系统调用或函数调用时,它能正常工作吗?
在兼容模式和64位模式之间切换是否会有任何开销?我认为其中一个开销是我需要为32位和64位分别使用堆栈。
我能否将这个想法集成到JVM中,也许我可以在64位JVM中动态生成32位代码,并通过模式切换来执行它?

如果您正在使用64位JVM,为什么要生成32位代码?您可以在64位代码中执行所有32位操作(几乎都可以),即使在64位模式下,大多数指令默认为32位操作数。 - Jeremiah Willcock
1
因为我想比较32位代码和64位代码之间的差异。也许我能在某些情况下得到一些差异,比如long类型的大小或每个案例的执行时间。 - Hsiao-Hui Chiu
请再次阅读这篇文章,它建议修改CS - 这将调用自定义的ld.so等内容。确保你已经为此做好了准备。 - J-16 SDiZ
1个回答

1

开放式系统调用应该没问题,因为您的32位代码将使用32位内核入口点。

当然,只能对其他32位代码进行函数调用。这包括libc - 因此,您的32位代码要么必须是自包含的,要么必须为其所需的库函数提供thunks。请记住,通常不会直接调用系统调用 - 您通常会通过libc包装器进行调用,而这个包装器对于您的32位代码不可用。

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


根据您的看法,我需要准备两个不同版本的libc(32位和64位),但是是否可以将32位和64位库加载到可执行文件中,甚至使用dlopen进行动态加载? 我认为这是不可能的。 - Hsiao-Hui Chiu
1
@Hsiao-Hui Chiu:不,通常是不可能的,而且这也不是你想要做的。两个不同的libc意味着两组冲突的stdio缓冲区和类似的问题。相反,你需要编写32位的thunks,切换回长模式,然后调用64位的libc,包括必要的参数和结果的重排。 - caf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接