Siv*_*der 6 c system-calls linux-kernel
如何从我的 C 程序进行系统调用。例如,如何调用以下函数?我必须包含哪些标题?
asmlinkage long sys_exit(int error_code);
Run Code Online (Sandbox Code Playgroud)
asm volatile(
"xorq %%rdi, %%rdi;" /* return value */
"movq $60, %%rax;" /* syscall id (/asm/unistd_64.h */
"syscall;"
::: "rdi", "rax"
);
Run Code Online (Sandbox Code Playgroud)
您不能从纯 C 调用它,但您需要像任何包装器(如glibc. 另一种方法是使用int 80h,但这已经过时了。
rdi您将error_code(0在本例中)while 放入标识系统调用的数字中,rax可用的数字/usr/include/asm/unistd.h将依次指向您32位或64位版本。
#define __NR_exit 60
Run Code Online (Sandbox Code Playgroud)
您通常会为系统调用调用 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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5133 次 |
| 最近记录: |