当前位置: 首页 > 面试题库 >

在64位Linux中,是否可以在同一可执行文件中同时使用64位和32位指令?

公西兴业
2023-03-14
问题内容

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进