3 c unix operating-system kernel linux-kernel
在我上次的工作面试中,我被问到了一个似乎非常简单的问题:
问:哪个库系统调用(是内核空间而不是 libc 中的包装器)实现的?
答:我回答了 <unistd.h>
面试官告诉我这是错误的,他问的是它在哪个库中实现,而不是在哪个头文件中声明。
为什么我的答案是错误的,正确答案是什么?
我在网上搜索了几个小时,却什么也没找到,甚至man 2 syscall在 shell 中编写也给出了:
#include <unistd.h>
#include <sys/syscall.h> /* For SYS_xxx definitions */
long syscall(long number, ...);
Run Code Online (Sandbox Code Playgroud)
syscall是一个包装器,实际上加载寄存器并syscall在 64 位 x86 或int 80h32sysenter位 x86 上执行指令,它是标准库的一部分。
例子:
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
Run Code Online (Sandbox Code Playgroud)
所以答案是该syscall函数在 glibc 中。
在内核的汇编文件中,syscall、sysentry 指令条目或 int 80h 中断处理程序(取决于系统实现)执行一些堆栈魔术,执行一些检查,然后调用将处理特定system call. 这些函数的地址被放置在包含函数指针的特殊表中。但这部分很难称为“库”。
| 归档时间: |
|
| 查看次数: |
912 次 |
| 最近记录: |