Linux 中 SYSCALL() 在哪里实现?
Where is SYSCALL() implemented in Linux?
在我上次的求职面试中,我被问到一个似乎非常简单的问题:
问:在哪个库系统调用(一个是内核space而不是libc中的包装器)实现?
答: 我回答了
面试官告诉我这是错误的,他问的是在哪个库中实现的,而不是在哪个头文件中声明的。
为什么我的答案是错误的,正确答案是什么?
我在网上搜索了几个小时,但一无所获,即使在 shell 中写 man 2 syscall
也给出了:
#include <unistd.h>
#include <sys/syscall.h> /* For SYS_xxx definitions */
long syscall(long number, ...);
头文件的格式为 *.h,将添加到 C 程序源代码中。它们通常位于类 Unix 操作系统上的目录 /usr/include 中。标准库头文件通常并不实际提供人们在包含它们时可能假设的所需功能,而是提供预处理宏,而如果需要库中的函数,它们还提供外部链接,使您最终可以使用隐藏的库别处。
库与包含在源代码中的头文件不同,它可以包含一些不同的想法,但通常会链接到使用编译器的选项和标志或作为参数传递给它。库通常在 /usr/lib 中存档,或者由系统开发人员作为共享对象分发。通过研究一些链接器工具,您应该能够找到您正在搜索的内容。
syscall
is a wrapper that actually loads the register and executes the instruction syscall
on 64 bit x86 or int 80h
or sysenter
on 32 bit x86 and it is part of the standard library.
example:
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
So the answer is that that syscall
function is in the glibc.
In the kernel in the assembly file the syscall,sysentry instruction entry or int 80h interrupt handler (depending on the system implementation) does some stack magic, performs some checks and then calls the function which will handle the particular system call
. Addresses of those functions are placed in the special table containing function pointers. But this part is very hard to be called the "library".
在我上次的求职面试中,我被问到一个似乎非常简单的问题:
问:在哪个库系统调用(一个是内核space而不是libc中的包装器)实现?
答: 我回答了
面试官告诉我这是错误的,他问的是在哪个库中实现的,而不是在哪个头文件中声明的。
为什么我的答案是错误的,正确答案是什么?
我在网上搜索了几个小时,但一无所获,即使在 shell 中写 man 2 syscall
也给出了:
#include <unistd.h>
#include <sys/syscall.h> /* For SYS_xxx definitions */
long syscall(long number, ...);
头文件的格式为 *.h,将添加到 C 程序源代码中。它们通常位于类 Unix 操作系统上的目录 /usr/include 中。标准库头文件通常并不实际提供人们在包含它们时可能假设的所需功能,而是提供预处理宏,而如果需要库中的函数,它们还提供外部链接,使您最终可以使用隐藏的库别处。
库与包含在源代码中的头文件不同,它可以包含一些不同的想法,但通常会链接到使用编译器的选项和标志或作为参数传递给它。库通常在 /usr/lib 中存档,或者由系统开发人员作为共享对象分发。通过研究一些链接器工具,您应该能够找到您正在搜索的内容。
syscall
is a wrapper that actually loads the register and executes the instruction syscall
on 64 bit x86 or int 80h
or sysenter
on 32 bit x86 and it is part of the standard library.
example:
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
So the answer is that that syscall
function is in the glibc.
In the kernel in the assembly file the syscall,sysentry instruction entry or int 80h interrupt handler (depending on the system implementation) does some stack magic, performs some checks and then calls the function which will handle the particular system call
. Addresses of those functions are placed in the special table containing function pointers. But this part is very hard to be called the "library".