Socket与系统调用深度分析

Posted mingjian6666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Socket与系统调用深度分析相关的知识,希望对你有一定的参考价值。

本实验以上一次实验为基础,在构建好的menuOS之上,对replyhi进行分析。

当在应用中调用到socket()函数时,便会发生系统调用,所有与socket相关的操作都会被映射到 sys_socketcall 这个系统调用中(32位)。

给 sys_socketcall 打上断点,当发生调用时便会弹出信息。在qemu中menuOS中执行replyhi,然后输入 hello,运行结果如下。当执行hello时,执行了socket相关的操作,故发生sys_socketall系统调用,gdb在此处暂停。

技术图片

 

 

 查看net/socket.c中SYSCALL_DEFINE2的源码:

技术图片

 

 

 根据call的不同来 具体选择要使用的内核处理函数。

gdb调试时,一次完整的hello指令共捕获到了7次sys_socketcall系统调用:

技术图片

 

 

 通过对每一次sys_socketcall使用print call输出call的值,

技术图片

 

 

 通过查看socket.c 中SYSCALL_DEFINE2源代码中的switch部分,我们发现,具体执行的系统调用按顺序如下:

1.

技术图片

 2.

技术图片

3.技术图片

4.技术图片

 

 5.技术图片

 

 6.技术图片

 

 7.技术图片

 

在net/socket.c中我们可以查看__sys_listen()的源代码如下(其余也均在此文件中):

int __sys_listen(int fd, int backlog)
{
        struct socket *sock;
        int err, fput_needed;
        int somaxconn;

        sock = sockfd_lookup_light(fd, &err, &fput_needed);
        if (sock) {
                somaxconn = sock_net(sock->sk)->core.sysctl_somaxconn;
                if ((unsigned int)backlog > somaxconn)
                        backlog = somaxconn;

                err = security_socket_listen(sock, backlog);
                if (!err)
                        err = sock->ops->listen(sock, backlog);

                fput_light(sock->file, fput_needed);
        }
        return err;
}

 

 

 

 

 

 

 

 

 

 

以上是关于Socket与系统调用深度分析的主要内容,如果未能解决你的问题,请参考以下文章

Socket与系统调用深度分析

Socket与系统调用深度分析

Socket与系统调用深度分析

Socket系统调用Socket与系统调用深度分析

Socket与系统调用深度分析

Socket与系统调用深度分析