如果在64位代码中使用32位INT0x80LinuxABI怎么办?
int 0x80
在linux上,无论从哪个模式调用:args,都总是调用32位abi。ebx
, ecx
.。和SysCall的数字/usr/include/asm/unistd_32.h
。(或在未编译的64位内核上崩溃CONFIG_IA32_EMULATION
).
64位代码应该使用syscall
的电话号码/usr/include/asm/unistd_64.h
,和ARGS在rdi
, rsi
等看见i 386和x86-64上UNIX&Linux系统调用的调用约定是什么?。如果你的问题是重复的,有关您的详细信息,请参阅该链接。应用32位或64位代码进行系统调用.如果你想知道到底发生了什么,继续阅读。
syscall
系统调用比int 0x80
系统调用,所以使用本机64位。syscall
除非您正在编写在32位或64位执行时运行相同的Polyglot机器代码。(sysenter
总是以32位模式返回,因此它在64位用户空间中并不有用,尽管它是一个有效的x86-64指令。)
有关:Linux系统调用的最终指南(关于x86)如何使int 0x80
或sysenter
32位系统调用,或syscall
64位系统调用,或调用vdso进行“虚拟”系统调用,如gettimeofday
。再加上系统调用的背景信息。
使用int 0x80
这样就可以编写以32位或64位模式组装的东西,因此对于exit_group()
在微基准的末尾什么的。
当前正式的i 386和x86-64系统VpsABI文档的PDF标准化功能和SysCall调用约定是从https:/github.com/hjl-tools/x86-psABI/wiki/x86psabi.
见x86标签维基对于初学者指南、x86手册、正式文档和性能优化指南/资源。
但是,由于人们不断地用代码发布问题,int 0x80
64位码,或者是不小心构建64位二进制文件从为32位编写的源代码中,我想知道什么一点儿没错是否发生在当前的Linux上?
是吗?int 0x80
保存/恢复所有64位寄存器?它是否将任何寄存器截断为32位?如果你通过具有非零上半部的指针args,会发生什么情况?
如果你把32位指针传递给它,它会起作用吗?