【问题标题】: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