gpt4 book ai didi

Linux 64-abi,调用约定

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:05 26 4
gpt4 key购买 nike

我正在阅读 intel manual关于调用约定以及哪个寄存器有哪个目的。以下是 图 3.4:注册用法中指定的内容:

%rax       temporary register; with variable arguments
passes information about the number of vector
registers used; 1st return register

但是在linux api我们使用 rax 来传递函数编号。是否与intel手册中规定的一致?实际上我预计(根据手册)我们会将函数编号传递给 rdi (它用于第一个参数)。等等……

我可以使用 rax 传递手写函数中的第一个函数参数吗?例如

mov rax, [array_lenght_ptr]
mov rdi, array_start_ptr
callq _array_sum

最佳答案

这句话是在谈论函数调用约定,它由 x86-64 System V ABI 文档标准化。

您正在考虑 Linux 的系统调用调用约定,它在 ABI 文档的附录中进行了描述,但那部分不是规范的。无论如何,系统调用 ABI 将调用号放入 rax,因为它不是系统调用的参数 。或者,您可以将其视为第 0 个参数,就像可变参数函数调用在 al 中传递 FP 寄存器参数的数量一样。 (有趣的事实:这使得调用者可以根据需要传递堆栈上的第一个 FP arg。)

但更重要的是,因为 RAX 中的调用编号会产生更好的 ABI,并且由于传统:这也是 i386 系统调用 ABI 所做的。并且 i386 System V 函数-调用 ABI 完全不同,只使用堆栈参数。

这意味着系统调用包装函数可以只设置eax 并运行syscall 而不是需要做类似的事情

libc_write_wrapper_for_your_imagined_syscall_convention:
; copy all args to the next slot over
mov r10, rdx ; size_t count
mov rdx, rsi ; void *buf
mov esi, edi ; int fd
mov edi, 1 ; SYS_write
syscall
cmp rax, -4095
jae set_errno
ret

代替

actual_libc_write_wrapper:   ; glibc's actual code I think also checks for pthread cancellation points or something...
mov eax, 1 ; SYS_write
syscall
cmp rax, -4095
jae set_errno
ret

请注意使用 r10 而不是 rcx 因为 syscall 会破坏 rcxr11 与保存的 RIP 和 RFLAGS,因此它不必写入任何带有返回信息的内存,并且不会强制用户空间将其放在内核可以读取的位置(如 32 位 sysenter 确实如此)。

因此系统调用约定不能与函数调用约定相同。 (或者函数调用约定将不得不选择不同的寄存器。)

对于具有 4 个或更多参数的系统调用(或适用于任何系统调用的通用包装器),您确实需要 mov r10, rcx,但仅此而已。 (与包装器必须从堆栈加载参数并保存/恢复 ebx 的 32 位约定不同,因为内核选择不当的 ABI 将其用于第一个参数。)


Can I use rax to pass the first function argument in my hand-written functions?

是的,您可以为不需要从 C 调用的私有(private)辅助函数做任何您想做的事情。

选择 arg 寄存器以使调用者(或最重要的调用者)更容易,或者您将使用具有固定寄存器选择的任何寄存器(如 div)。

注意哪些寄存器被破坏了,哪些保留了注释。只需费心保存/恢复您的调用者实际需要保存/恢复的寄存器,并选择您使用哪些 tmp regs 来最小化推送/弹出。如果您的函数很短,请避免作为调用方关键延迟路径一部分的寄存器的推送/弹出保存/重新加载。

关于Linux 64-abi,调用约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48624195/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com