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

标签 c unix linux-kernel operating-system kernel

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

问:在哪个库系统调用(一个是内核空间而不是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/

相关文章:

c - linux内核中潜在的内存泄漏?

linux-kernel - Linux 驱动程序 phys_mem_access_prot 未定义

c - winapi:SetFocus() 可以无错误地返回 NULL 吗?因为这就是我在实现焦点恢复时所看到的 a la recent oldnewthing post

c - 难道我做错了什么?我需要一些关于分隔符的指导。对 C 还算陌生

c - 我的 returnList[0] 被重写为 @5'

c - C实践的实例?

c - OS X Tiger上的mprotect API

c - setuid 和 seteuid 函数的区别

linux - 以编程方式读取linux内核参数

c++ - openssl 中已弃用的 AES_ige_encrypt() API 的替代方案