64位CPU(amd64)在兼容模式下支持32位Intel指令。另外,如果ELF标头说它是32位可执行文件,则64位Linux安装允许运行包含32位指令的ELF。
我想知道是否可以在ELF内放入一些汇编指令,从而在程序中间将CPU切换为32位兼容模式(然后再返回)。如果内核不允许这些汇编指令,也许有什么方法可以使内核将已经运行的进程切换为32位?
出于好奇,这主要是一个问题,因为我真的看不到任何用例。
通过更改CS在长模式和兼容模式之间切换。用户模式代码无法修改描述符表,但是可以对描述符表中已经存在的代码段执行远跳转或远调用。我认为,例如在Linux中,存在所需的兼容模式描述符。
这是Linux(Ubuntu)的示例代码。建立
$ gcc -no-pie switch_mode.c switch_cs.s
switch_mode.c:
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
extern bool switch_cs(int cs, bool (*f)());
extern bool check_mode();
int main(int argc, char **argv)
{
int cs = 0x23;
if (argc > 1)
cs = strtoull(argv[1], 0, 16);
printf("switch to CS=%02x\n", cs);
bool r = switch_cs(cs, check_mode);
if (r)
printf("cs=%02x: 64-bit mode\n", cs);
else
printf("cs=%02x: 32-bit mode\n", cs);
return 0;
}
switch_cs.s:
.intel_syntax noprefix
.code64
.text
.globl switch_cs
switch_cs:
push rbx
push rbp
mov rbp, rsp
sub rsp, 0x18
mov rbx, rsp
movq [rbx], offset .L1
mov [rbx+4], edi
// Before the lcall, switch to a stack below 4GB.
// This assumes that the data segment is below 4GB.
mov rsp, offset stack+0xf0
lcall [rbx]
// restore rsp to the original stack
leave
pop rbx
ret
.code32
.L1:
call esi
lret
.code64
.globl check_mode
// returns false for 32-bit mode; true for 64-bit mode
check_mode:
xor eax, eax
// In 32-bit mode, this instruction is executed as
// inc eax; test eax, eax
test rax, rax
setz al
ret
.data
.align 16
stack: .space 0x100
问题内容: 是否可以在Windows 7上同时安装32位和64位Java? 我有一些应用程序可以在64位下运行,但是有些应用程序只能在32位下运行。 问题答案: 是的,绝对没有问题。您甚至可以同时在同一台计算机上安装32位和64位Java的多个版本。 实际上,我本人也有这样的设置。
问题内容: 我有一台新的64位Windows计算机,并且将python用于各种用途,因此希望安装64位python。 但是,我的一个python项目创建了一个Windows可执行文件,然后在32位Windows计算机(使用py2exe创建)上运行。 如何使用64位python和py2exe创建32位可执行文件? 如果我做不到,我想我的选择是: 在包括我的所有机器上使用32位python;要么 在3
问题内容: 我想知道x86和x64中的64位长吗? 问题答案: 是。Java 在任何JVM上都是64位,无一例外。所有Java原语类型都是完全可移植的,并且在所有实现中都具有固定的大小。
问题内容: 当我使用CDLL在32位python中调用32位dll时,它运行良好。但是不幸的是,在我的64位win7操作系统中,它只能安装64位python,调用时会变成:这不是有效的win32应用程序! 我可以在64位python中使用32位dll或exe吗?还是我必须安装32位python? 问题答案: 64位EXE无法加载32位DLL。(反之亦然:32位EXE无法加载64位DLL。)毕竟,它
问题内容: 我已经使用Java一段时间了,而我典型的设置新开发机的习惯要求从Oracle站点下载并安装最新的JDK。 今天这引发了一个不寻常的问题, 回想起来,我已经安装了之前的两个版本,并且很高兴将普通的工具链插入(Eclipse)。在我的日常编程中,我不会回想起曾经因为使用64位JRE(或为此目的而针对64位JRE)而不得不以其他方式进行更改或思考的事情。 根据我对64位和32位的理解- 确实
问题内容: 我的电脑正在使用Windows 7 64位。但是将要部署我的jsp Web应用程序的服务器是32位。 我需要在PC上安装32位JDK / JRE才能进行开发吗?我正在使用Eclipse。 非常感谢你。 问题答案: 您绝对不需要安装32位JRE即可进行开发。您构建的Java代码不会跟踪您的64位。(我假设您没有使用JNI,这会使事情变得有些复杂。) 不过,您 可能 需要安装32位JRE进