0

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

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

asmlinkage long sys_sendto (void)属性((weak,alias("sys_ni_syscall"))

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

4

2 回答 2

1

sendto 您可以在此处找到 Linux 实现。如您所见,它本质上是更强大的sendmsg.

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

于 2013-06-24T17:20:04.250 回答
1

它位于v3.10-rc7 的第 1747net/socket.c行。

/*
 *  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

于 2013-06-24T17:21:57.727 回答