gpt4 book ai didi

c - SYSCALL() 在 Linux 中在哪里实现?

转载 作者:行者123 更新时间:2023-12-04 03:25:34 25 4
gpt4 key购买 nike

在我上次的工作面试中,我被问到一个似乎非常简单的问题:

问:在哪个库系统调用(一个是内核空间而不是libc中的包装器)实现?

答:我回答了

面试官告诉我这是错误的,他问的是它是在哪个库中实现的,而不是在哪个头文件中声明的。

为什么我的答案是错误的,正确答案是什么?

我在网上搜索了几个小时,但一无所获,甚至在 shell 中编写 man 2 syscall 也给出了:

   #include <unistd.h>
#include <sys/syscall.h> /* For SYS_xxx definitions */

long syscall(long number, ...);

最佳答案

syscall 是一个包装器,它实际上加载寄存器并在 64 位 x86 或 int 80hsysenter 上执行指令 syscall 在 32 位 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

所以答案是 syscall 函数在 glibc 中。

在汇编文件的内核中,syscall、sysentry 指令条目或 int 80h 中断处理程序(取决于系统实现)执行一些堆栈魔术,执行一些检查,然后调用将处理特定 系统的函数调用。这些函数的地址放在包含函数指针的特殊表中。但这部分很难被称为“图书馆”。

关于c - SYSCALL() 在 Linux 中在哪里实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67679984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com