相关疑难解决方法(0)

如果在64位代码中使用32位int 0x80 Linux ABI会发生什么?

int 0x80在Linux上总是调用32位ABI,不管是什么模式,这就是所谓的:在args ebx,ecx...和系统调用号的/usr/include/asm/unistd_32.h.(或者在没有编译的64位内核上崩溃CONFIG_IA32_EMULATION).

64位代码应该使用syscall,从呼叫号码/usr/include/asm/unistd_64.h,并在args rdi,rsi等见什么调用约定UNIX和Linux系统上的i386和x86-64调用.如果您的问题被打上这样一个重复的,看你怎么说链接,细节应当使32位或64位代码的系统调用. 如果你想了解到底发生了什么,请继续阅读.


sys_write系统调用比syscall系统调用快,所以使用本机64位,int 0x80除非你正在编写多格式机器代码,当执行32或64位时运行相同的机器代码.(syscall始终以32位模式返回,因此它在64位用户空间中没有用,尽管它是有效的x86-64指令.)

相关:Linux系统的权威指南(在x86上)调用如何进行sysenterint 0x8032位系统调用,或sysenter64位系统调用,或调用vDSO进行"虚拟"系统调用syscall.加上有关系统调用的背景知识.


使用gettimeofday可以编写将以32位或64位模式组合的内容,因此它可以int 0x80在微基准测试结束时使用.

标准化函数和系统调用约定的官方i386和x86-64 System V psABI文档的当前PDF文件链接自https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI.

有关初学者指南,x86手册,官方文档和性能优化指南/资源,请参阅标记wiki.


但是,由于人们不断发布与使用代码的问题exit_group()在64位代码,或不小心建立64位二进制文件从源代码对于32位写的,我不知道是什么确切不会对当前的Linux怎样呢?

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

如果你传递32位指针它是否有效?

linux assembly x86-64 system-calls abi

36
推荐指数
1
解决办法
4783
查看次数

是否可以通过模式切换在64位进程中执行32位代码?

在这个页面中,http://www.x86-64.org/pipermail/discuss/2004-August/005020.html 他说有一种方法可以在应用程序中混合使用32位代码和64位代码.他假设应用程序是32位(在兼容模式下),然后切换到64位模式以执行64位代码,反之亦然.

假设我的操作系统是64位Linux,我的应用程序是64位.我做了很多跳转到兼容模式并执行32位代码.当我进行系统调用或函数调用时它能正常工作吗?

兼容模式和64位模式之间是否存在模式切换的开销?我认为其中一个开销是我需要32位和64位的独立堆栈.

我可以将这个想法集成到JVM中,也许我可以在64位JVM中动态生成32位代码,并通过模式切换执行它吗?

linux jvm x86-64 32bit-64bit

7
推荐指数
1
解决办法
1935
查看次数

如何强制 malloc 在 64 位系统上返回 32 位指针?

我的程序中有一个错误,因此它在 32 位上工作正常,但在 64 位上只能随机工作,因为程序中某处有 32 位指针截断。

\n\n

原因是,如果 malloc 返回一个内存地址,并且在指针分配时在高 32 位中设置了一个位,则指针将变为 NULL。

\n\n

所以我找到了触发段错误的指针。但它\xe2\x80\x99s不是我参与的程序(我\xe2\x80\x99m是用户而不是开发人员)并且\xe2\x80\x99s根本没有编译器警告。

\n\n

因此,如何确保 malloc 返回一个可以在 32 位模式下使用的值,而不是花费我没有\xc2\xb4t 的时间?

\n

linux malloc 32-bit glibc x86-64

5
推荐指数
1
解决办法
2704
查看次数

32 位 GCC C 程序中的内联 64 位汇编

我正在编译 32 位二进制文​​件,但想在其中嵌入一些 64 位程序集。

void method() {
   asm("...64 bit assembly...");
}
Run Code Online (Sandbox Code Playgroud)

当然,当我编译时,我会收到有关引用错误寄存器的错误,因为寄存器是 64 位的。

evil.c:92: Error: bad register name `%rax'
Run Code Online (Sandbox Code Playgroud)

是否可以添加一些注释,以便 gcc 将使用 64 位汇编器来处理 asm 部分。我有一个单独编译的解决方法,使用 PROT_EXEC|PROT_WRITE 映射到页面中,然后复制到我的代码中,但这非常尴尬。

assembly gcc

2
推荐指数
1
解决办法
2549
查看次数

标签 统计

linux ×3

x86-64 ×3

assembly ×2

32-bit ×1

32bit-64bit ×1

abi ×1

gcc ×1

glibc ×1

jvm ×1

malloc ×1

system-calls ×1