Sockets sys_sendto Linux系统调用实现
我试图探索“sendto”套接字函数的实现。我试图在Linux中找到一个实现 在Linux中,sendto函数对应于“sys_sendto”系统调用。当我试图遵循它时,我只找到了一个定义,即: asmlong sys\u sendto(void)属性((弱,别名(“sys\u ni\u syscall”))Sockets sys_sendto Linux系统调用实现,sockets,linux-kernel,sendto,Sockets,Linux Kernel,Sendto,我试图探索“sendto”套接字函数的实现。我试图在Linux中找到一个实现 在Linux中,sendto函数对应于“sys_sendto”系统调用。当我试图遵循它时,我只找到了一个定义,即: asmlong sys\u sendto(void)属性((弱,别名(“sys\u ni\u syscall”)) 也就是说,sys_sendto只是sys_ni_syscall的别名,它只返回一个值。就我而言,这没有意义。在哪里可以找到sys_snedto实现?它是由一些汇编代码实现的吗?您可以找到se
也就是说,sys_sendto只是sys_ni_syscall的别名,它只返回一个值。就我而言,这没有意义。在哪里可以找到sys_snedto实现?它是由一些汇编代码实现的吗?您可以找到
sendto
的Linux实现。如您所见,它是es在功能更强大的sendmsg
周围安装一个包装器
看起来您看到的是系统调用的声明(原型),而不是实现。它位于
net/socket.c
SYSCALL\u DEFINE6
宏是用于定义包含六个参数的系统调用的宏。它是在include/linux/syscalls.h
中定义的。它相当复杂,所以让我们先看看无参数版本中会发生什么:
#define SYSCALL_DEFINE0(sname) \
SYSCALL_METADATA(_##sname, 0); \
asmlinkage long sys_##sname(void)
在kernel/sys.c
中定义的系统调用如getuid()
,其编码如下:
SYSCALL_DEFINE0(getuid)
{
/* Only we change this so SMP safe */
return from_kuid_munged(current_user_ns(), current_uid());
}
宏扩展到
SYSCALL_METADATA(_##sname, 0);
asmlinkage long sys_getuid(void)
{
/* Only we change this so SMP safe */
return from_kuid_munged(current_user_ns(), current_uid());
}
这是对函数的简单定义sys\u getuid
元数据可以选择性地编译到内核中进行跟踪。有关详细信息,请参阅
syscalls.h
中的源代码。我已经看过此页面。代码显示另一个函数“sock\u sendmsg”正在做这项工作。但是,当我尝试实现它时,我没有得到任何具体的信息。我想要的是了解sendto函数的底部。换句话说,缓冲区是如何传输的,以及参数(地址、端口等)是如何传输的是的,sock\u sendmsg
是在同一个文件中定义的。看看它是怎么做的。你会看到它调用\uuuusock\u sendmsg
,然后调用\uusock\u sendmsg\u nosec
。你会看到调用是根据所涉及的套接字类型进行调度的。
SYSCALL_METADATA(_##sname, 0);
asmlinkage long sys_getuid(void)
{
/* Only we change this so SMP safe */
return from_kuid_munged(current_user_ns(), current_uid());
}