QnA*_*QnA 2 c system-calls linux-kernel
我对系统调用(高级)工作流程的理解是:
如果是这样,那么内核源代码中应该有一堆 sys_xxx() 函数。例如,对于read()
,在内核 2.6 代码中,我找到了sys_read。然而,在内核 5.4 代码中,我没有找到这样的服务例程代码,我发现的唯一sys_read就像是 libc 包装器的替代品。所以我很困惑..
一个相关的问题 - 内核将实现放在 sys_xxx() 中的原因是内核空间也可以调用这些函数,对吗?
内核确实定义了一个名为的函数sys_read
,它的行为如您所说。通过搜索很难找到,因为它是通过使用标记串联的辅助宏定义的。见fs/read_write.c
第 595 行:
SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
{
return ksys_read(fd, buf, count);
}
Run Code Online (Sandbox Code Playgroud)
这具有以下效果:
声明一个名为 的函数sys_read
,别名为__se_sys_read
定义__se_sys_read
,它显然对任何 32 位参数进行符号扩展,然后调用__do_sys_read
定义__do_sys_read
谁的身体如图所示(即调用ksys_read
哪个做实际工作)。
您可以SYSCALL_DEFINEx
在include/linux/syscalls.h
第 206 行看到宏的定义。