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;
}

 

 

 

 

 

 

 

 

 

 

posted @ 2019-12-19 17:28  mingjian6666  阅读(212)  评论(0编辑  收藏  举报