【问题标题】:What are the arguments of syscall (2) and their purpose?syscall (2) 的参数及其用途是什么?
【发布时间】:2021-03-18 13:55:27
【问题描述】:

我遇到了这个wikibook,它表明可以有 7 个参数传递给syscall,我想了解每个参数的用途。

这在man page 中没有指定。
另外,我发现了一个table 可以传递给每个系统调用的参数,但我不一定了解它们之间的共同点。

理想情况下,我正在寻找一个指定的答案

arg #1 - pid  
arg #2 - ... 

架构是 x86-64。

【问题讨论】:

    标签: c linux x86 x86-64 system-calls


    【解决方案1】:

    table you linked to 提供了您要求的参数列表。

    我认为你可能会感到困惑的是syscall 不执行单个操作。相反,它是一个通用 API,可用于您可能希望内核执行的任何操作——打开文件、映射内存、派生新进程等等。

    您希望内核执行的特定操作是使用系统调用号选择的。只需从表中选择第一个,系统调用 0(称为sys_read)从文件中读取。

    显然,不同系统调用执行的操作需要不同的参数。继续使用 sys_read 示例,我们在表中看到它需要三个参数:文件描述符 (fd)、指向缓冲区的指针 (buf) 和要读取的字节数 (count) .所以如果你想调用这个系统调用,你可以这样做:

    #include <sys/syscall.h>
    
    // Assuming these have been initialized appropriately.
    unsigned int fd = ...;
    char * buf = ...;
    size_t count = ...;
    
    syscall(SYS_read, fd, buf, count);
    

    This answer 提供有关您何时可能希望选择使用syscall 的更多信息。简短的版本是使用syscall 的原因很少。

    编辑:正如@PeterCordes 指出的那样,系统调用编号在 ABI 之间有所不同,因此您应该使用sys/syscall.h 中定义的常量,而不是自己硬编码系统调用编号。

    【讨论】:

    • 您在最后一段中链接的答案描述了您何时想在 C 中使用 syscall(int, ...) 包装函数。而不是 syscall instruction 内联系统调用在 asm.如果你在玩玩具程序而不是链接 libc,你通常想直接使用 syscall。
    • @PeterCordes:有syscall 指令吗?以前我们使用INT,后来使用ENTER,现在我认为只是一个JMP(没有实际地址,“段”的选择器表有关于哪个环和哪个内核地址要执行的数据)
    • @GiacomoCatenazzi:是的,AMD 引入了syscall,并为 AMD64 重新设计了它。这是在 Linux 上从用户空间使用 64 位系统调用 ABI 的唯一方法。 enter 可用于系统调用是不合理的——这是制作堆栈帧的慢速方法;也许您正在考虑sysenter(英特尔的 32 位快速系统调用指令)?请参阅What happens if you use the 32-bit int 0x80 Linux ABI in 64-bit code? 了解差异以及同时使用 Linux write 的示例。
    • @MartinB:哦,你说得对,它被标记为[x86-64],但不是 [assembly],并且标题中有syscall(2)。我们收到很多关于syscall 指令的问题,OP 的第一个链接是关于汇编语言的。在我关注的标签中,我基本上从未见过这样的标签,而且我浏览得太快没有注意到我做出了错误的假设>.
    • 由于您提供的是便携式答案,因此您不想对电话号码进行硬编码 - 它们在 ISA 之间有所不同,即使在 i386 和 amd64 之间也是如此。在包含适当的标头(&lt;asm/unistd.h&gt;&lt;sys/syscall.h&gt;)后使用__NR_readSYS_read__NR_read 在 x86-64 上为 0,但在 i386 上不是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 2013-08-12
    • 2016-10-10
    • 1970-01-01
    • 2021-07-01
    相关资源
    最近更新 更多