【问题标题】:How do I make syscalls from my C program如何从我的 C 程序进行系统调用
【发布时间】:2015-05-17 18:31:55
【问题描述】:

如何从我的 C 程序进行系统调用。例如,如何调用以下函数?我必须包含哪些标题?

asmlinkage long sys_exit(int error_code);

【问题讨论】:

标签: c linux-kernel system-calls


【解决方案1】:

您通常会为系统调用调用 C 库包装器(例如 open() 和 read() 只是包装器)。 Wrappers 更友好。

作为在汇编中自己完成工作的替代方法,您可以尝试 glibc 中的 syscall(2) 函数。此函数在没有包装器的情况下进行系统调用,并且在调用没有包装器函数的系统调用时特别有用。这样你只需要为系统调用号提供符号常量,而且我认为比在汇编指令中编码系统调用更便携。

文档中的示例:

#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
int
main(int argc, char *argv[])
{
    pid_t tid;
    tid = syscall(SYS_gettid);
    tid = syscall(SYS_tgkill, getpid(), tid);
}

【讨论】:

    【解决方案2】:
    asm volatile(
                  "xorq %%rdi, %%rdi;"  /* return value */
                  "movq $60, %%rax;"    /* syscall id (/asm/unistd_64.h   */
                  "syscall;" 
                  ::: "rdi", "rax"
                );
    

    您不能从纯 C 中调用它,但您需要从程序集中调用它,就像 glibc 这样的任何包装器一样。 另一种方法是使用int 80h,但这已经过时了。

    rdi 中输入error_code(在这种情况下为0),而在rax 中输入标识系统调用的编号,在/usr/include/asm/unistd.h 中可用,这反过来将您指向32 位或64 位版本。

    #define __NR_exit 60
    

    【讨论】:

      猜你喜欢
      • 2015-03-14
      • 1970-01-01
      • 2013-05-20
      • 2011-08-17
      • 2013-11-09
      • 1970-01-01
      • 2023-03-08
      • 2015-10-22
      • 2011-02-20
      相关资源
      最近更新 更多