gpt4 book ai didi

c - 系统调用包装器 asm C

转载 作者:行者123 更新时间:2023-12-02 17:53:29 25 4
gpt4 key购买 nike

有人可以向我解释一下这段代码吗?另外请给我一些链接/URL,我可以在其中了解更多信息?此代码用作包装器来覆盖我们库中的“extern int errno”。有人可以向我解释这个函数,并告诉我为什么在某些系统调用中需要包装器吗?哪些也称为 WeakSYSCALLS?

#define ASM_ARGS_1      ASM_ARGS_0, "r" (_a1)
#define ASM_ARGS_2 ASM_ARGS_1, "r" (_a2)
#define ASM_ARGS_3 ASM_ARGS_2, "r" (_a3)
#define LOADREGS_5(a1, a2, a3, a4, a5) \
register int _v1 asm ("v1") = (int) (a5); \
LOADREGS_4 (a1, a2, a3, a4)

#define LOADREGS_6(a1, a2, a3, a4, a5, a6) \

register int _v2 asm ("v2") = (int) (a6); \

LOADREGS_5 (a1, a2, a3, a4, a5)

#define MYLIBC_SYSCALL(name, nargs, args...) \
({ \

unsigned int retval; \

{ \

register int _a1 asm ("r0"), _nargs asm ("r7"); \
LOADREGS_##nargs(args) \
_nargs = __NR_##name; \
asm volatile ( \
"swi 0x0" \
:"=r"(_a1) \
:"r"(_nargs) ASM_ARGS_##nargs \
: "memory" ); \

retval = _a1; \
} \

if ( retval >= 0xfffff001 ) { \
errno = -retval; \
retval = (unsigned int)-1; \
} \
(int) retval; \
})

最佳答案

执行“系统调用”意味着触发内核执行特殊事件。由于内核运行在不同的地址空间中,因此这不能通过简单的函数调用来完成。

根据操作系统和硬件平台,系统调用可以通过触发中断、调用门、SYSENTER 或其他几种方法来调用。

无论如何,您不能像 C 函数调用那样简单地将多个参数传递给内核。但是,您可以将参数值放入某些寄存器中。这些寄存器是什么,以及内核如何解释它们的内容,又是特定于所讨论的操作系统的。

由于您既不能访问特定寄存器,也不能调用上述任何内核触发方法,在纯 C 代码中,您可以使用系统调用包装器,它们称为 像C函数一样,然后将参数放入寄存器并使用ASM代码触发内核。

您在上面看到的就是这样一个系统调用包装器。您会看到它将参数数量放入寄存器 r7 的部分,将参数本身放入适当的寄存器 (LOADREGS_*),然后执行触发器 (swi 0x0,其中我猜是一个软件中断——我对ARM平台了解不多),并从寄存器A1获取“返回值”。

关于c - 系统调用包装器 asm C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4861621/

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