我正在尝试探索“sendto”套接字函数的实现。我试图在Linux中找到一个实现。
在Linux中,sendto函数对应于“sys_sendto”系统调用。当我试图遵循它时,我只找到了一个定义如下:
asmlinkage long sys_sendto(void) attribute ((weak,alias(“sys_ni_syscall”))
这就是说sys_sendto不是sys_ni_syscall的别名,它只是返回一个值。就我而言,这没有任何意义。哪里可以找到sys_snedto实现?它是由一些汇编代码实现的吗?
答案 0 :(得分:1)
您可以找到sendto
here的Linux实施。正如您所看到的,它本质上是更强大的sendmsg
。
看起来你正在查看系统调用的声明(原型),而不是实现。
答案 1 :(得分:1)
它位于net/socket.c
,line 1747 of v3.10-rc7。
/*
* Send a datagram to a given address. We move the address into kernel
* space and check the user space data area is readable before invoking
* the protocol.
*/
SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
unsigned int, flags, struct sockaddr __user *, addr,
int, addr_len)
{
struct socket *sock;
struct sockaddr_storage address;
...
SYSCALL_DEFINE6
宏是用于定义带有六个参数的系统调用的宏。它在include/linux/syscalls.h
中定义。这很复杂,所以让我们先看看无争论版本中会发生什么:
#define SYSCALL_DEFINE0(sname) \
SYSCALL_METADATA(_##sname, 0); \
asmlinkage long sys_##sname(void)
getuid()
中定义的系统调用kernel/sys.c
,编码如下:
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_getuid
的直接定义。
可选择将元数据编译到内核中进行跟踪。有关详细信息,请参阅syscalls.h
中的来源。