在我上次的工作面试中,我被问到一个似乎非常简单的问题:
问:在哪个库系统调用(一个是内核空间而不是libc中的包装器)实现?
答:我回答了
面试官告诉我这是错误的,他问的是它是在哪个库中实现的,而不是在哪个头文件中声明的。
为什么我的答案是错误的,正确答案是什么?
我在网上搜索了几个小时,但一无所获,甚至在 shell 中编写 man 2 syscall
也给出了:
#include <unistd.h>
#include <sys/syscall.h> /* For SYS_xxx definitions */
long syscall(long number, ...);
最佳答案
syscall
是一个包装器,它实际上加载寄存器并在 64 位 x86 或 int 80h
或 sysenter 上执行指令
在 32 位 x86 上,它是标准库的一部分。syscall
例子:
syscall:
endbr64
mov rax,rdi
mov rdi,rsi
mov rsi,rdx
mov rdx,rcx
mov r10,r8
mov r8,r9
mov r9,QWORD PTR [rsp+0x8]
syscall
所以答案是 syscall
函数在 glibc 中。
在汇编文件的内核中,syscall、sysentry 指令条目或 int 80h 中断处理程序(取决于系统实现)执行一些堆栈魔术,执行一些检查,然后调用将处理特定 系统的函数调用
。这些函数的地址放在包含函数指针的特殊表中。但这部分很难被称为“图书馆”。
关于c - SYSCALL() 在 Linux 中在哪里实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67679984/