如果在64位代码中使用32位INT0x80LinuxABI怎么办?

如果在64位代码中使用32位INT0x80LinuxABI怎么办?

int 0x80在linux上,无论从哪个模式调用:args,都总是调用32位abi。ebxecx.。和SysCall的数字/usr/include/asm/unistd_32.h。(或在未编译的64位内核上崩溃CONFIG_IA32_EMULATION).

64位代码应该使用syscall的电话号码/usr/include/asm/unistd_64.h,和ARGS在rdirsi等看见i 386和x86-64上UNIX&Linux系统调用的调用约定是什么?。如果你的问题是重复的,有关您的详细信息,请参阅该链接。用32位或64位代码进行系统调用.如果你想知道到底发生了什么,继续阅读。


syscall系统调用比int 0x80系统调用,所以使用本机64位。syscall除非您正在编写在32位或64位执行时运行相同的Polyglot机器代码。(sysenter总是以32位模式返回,因此它在64位用户空间中并不有用,尽管它是一个有效的x86-64指令。)

有关:Linux系统调用的最终指南(关于x86)如何使int 0x80sysenter32位系统调用,或syscall64位系统调用,或调用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 0x8064位码,或者是不小心构建64位二进制文件从为32位编写的源代码中,我想知道什么一点儿没错是否发生在当前的Linux上?

是吗?int 0x80保存/恢复所有64位寄存器?它是否将任何寄存器截断为32位?如果你通过具有非零上半部的指针args,会发生什么情况?

如果你把32位指针传递给它,它会起作用吗?


30秒到达战场
浏览 1120回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP