【发布时间】:2018-07-29 00:04:44
【问题描述】:
64 位 CPU (amd64) 在兼容模式下支持 32 位 Intel 指令。此外,如果 ELF 标头显示它是 32 位可执行文件,则 64 位 Linux 安装允许运行包含 32 位指令的 ELF。
我想知道是否可以在 ELF 中放入一些汇编指令,在程序中间将 CPU 切换到 32 位兼容模式(然后再返回)?如果内核不允许这些汇编指令,是否有某种方法可以让内核将已经运行的进程切换到 32 位?
这主要是出于好奇,因为我看不到任何用例。
【问题讨论】:
-
您实际上可以在 64 位程序集中使用所有 32 位指令而无需做任何事情,因为所有 64 位指令都需要有一个 rex 前缀。您必须记住的唯一棘手的事情是地址和它们自身的 rex 前缀,因为它们是有效的 32 位指令。应该没有问题,只要你控制了32bit.code。在 ›real‹ 32 位和 64 位之间切换是 afaik ring0-stuff,所以这取决于操作系统。但是将 32 位代码转换为 64 位代码并没有那么困难,并且可能是一种选择?
-
@sivizius : 您可以使用 LDT 中现有的描述符 FAR Jmp 在兼容模式和长模式之间跳转。
-
虽然不是完全重复,但这些 SO 答案是相关的:stackoverflow.com/questions/34467092/…
-
不是每个 64b 的 linux 都包含 32b 兼容性回退,例如 Win10 中的 Ubuntu 是纯 64b。这意味着仅支持 64b
syscall。在 64b 模式下使用 32b 寄存器编码的指令是有效的,但是你不能运行 elf32 二进制,比如只在 32 位模式下运行一些代码。 -
@sivizius 这完全错了!以
push eax为例,它存在于保护模式但不存在于长模式。
标签: linux assembly x86 x86-64 32bit-64bit