sys_sendto Linux系统调用实现

时间:2013-06-24 16:53:08

标签: sockets linux-kernel sendto

我正在尝试探索“sendto”套接字函数的实现。我试图在Linux中找到一个实现。

在Linux中,sendto函数对应于“sys_sendto”系统调用。当我试图遵循它时,我只找到了一个定义如下:

asmlinkage long sys_sendto(void) attribute ((weak,alias(“sys_ni_syscall”))

这就是说sys_sendto不是sys_ni_syscall的别名,它只是返回一个值。就我而言,这没有任何意义。哪里可以找到sys_snedto实现?它是由一些汇编代码实现的吗?

2 个答案:

答案 0 :(得分:1)

您可以找到sendto here的Linux实施。正如您所看到的,它本质上是更强大的sendmsg

的包装器

看起来你正在查看系统调用的声明(原型),而不是实现。

答案 1 :(得分:1)

它位于net/socket.cline 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中的来源。