gpt4 book ai didi

限制 gcc 内联 x86_64 程序集中的 r10 寄存器

转载 作者:行者123 更新时间:2023-11-30 16:16:02 25 4
gpt4 key购买 nike

我正在尝试编写一个非常轻量级的 libc 替换库,以便我可以更好地理解内核 - 应用程序接口(interface)。第一个任务显然是获取一些系统调用包装器。我已经成功地让 1 到 3 个参数包装器正常工作,但我正在努力处理 4 个参数变体。这是我的出发点:

long _syscall4(long type, long a1, long a2, long a3, long a4)
{
long ret;
asm
(
"syscall"
: "=a"(ret) // return value
: "a"(type), "D"(a1), "S"(a2), "d"(a3), "r10"(a4)
: "c", "r11", "memory" // some syscalls read or write memory
// the syscall insn instruction itself destroys RCX and R11
);
return ret;
}

(编者注:这是安全且可用的,也是一个很好的例子,在应用答案的方式处理r10之后。MUSL libc有一些类似的宏。)

编译器给出以下错误:

error: matching constraint references invalid operand number

我的 _syscall3 函数工作正常,但不使用 r10 或有破坏列表。

(编者注:没有破坏列表是不安全的:您需要告诉编译器 RCX 和 R11 被覆盖,并且“内存”应该在可能读取或写入的系统调用之前同步如果您想为特定的系统调用编写特定的包装器,您可以有选择地省略“内存”破坏者,或者根据哪些参数是该系统调用的指针来使用虚拟内存操作数。

如果此_syscall4函数无法内联,则寄存器和“内存”破坏实际上不会导致任何问题,但您应该 使它们能够内联;与调用非内联包装函数相比,内联此系统调用在调用站点所需的代码更少。)

最佳答案

寄存器没有限制:%r8 .. %15。然而,更新的版本(如 gcc-4.x)应该接受:

register long r10 asm("r10") = a4;

然后对您的 asm 语句使用输入约束:"r"(r10)
https://gcc.gnu.org/onlinedocs/gcc/Local-Register-Variables.html

<小时/>

请注意,强制选择扩展 asm 的 "r" 约束是 GCC 为寄存器 asm 局部变量保证的唯一行为。像 register void *rsp asm("rsp");void *stack_pointer = rsp; 之类的东西有时确实有效,但不能得到保证,并且不再推荐。

<小时/>

您将希望您的系统调用包装器asm语句是 volatile 并且具有“内存”破坏器,除非您编写特定的特定系统调用的包装器,使用虚拟内存输入或输出来了解哪些参数是指针(根据 How can I indicate that the memory *pointed* to by an inline ASM argument may be used? )

它需要 volatile ,因为执行write(1, buf, 16)应该打印缓冲区两次,而不仅仅是CSE返回值!系统调用通常不是其输入的纯函数,因此您需要 volatile

(一些特定的系统调用包装器,例如 getpid 可能是非 volatile 的,因为它们每次都会返回相同的内容,除非您也使用 fork。但是 getpid 是如果通过 VDSO 完成,效率会更高,因此如果您使用的是 Linux,则无需首先进入内核,因此如果您正在为 getpid 制作自定义包装器Clock_gettime 您可能一开始就不需要 syscall。请参阅 The Definitive Guide to Linux System Calls )

需要“内存”破坏器,因为寄存器中的指针并不暗示所指向的内存也是输入或输出。仅由 write 系统调用读取的缓冲区存储不需要作为死存储进行优化。或者对于 munmap,编译器最好在内存取消映射之前完成所有加载/存储。有些系统调用不接受任何指针输入,也不需要“内存”,但通用包装器必须做出最坏情况的假设。

register ... asm("r10") 通常不需要需要asm 易失“内存” 破坏,但系统调用包装器可以。

关于限制 gcc 内联 x86_64 程序集中的 r10 寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56859394/

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