如何从我的 C 程序进行系统调用

How do I make syscalls from my C program

如何从我的 C 程序进行系统调用。例如,如何调用以下函数? headers 我必须包括什么?

asmlinkage long sys_exit(int error_code);
asm volatile(
              "xorq %%rdi, %%rdi;"  /* return value */
              "movq , %%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

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

作为在汇编中自己完成工作的替代方法,您可以尝试 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);
}