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与系统调用深度分析的主要内容,如果未能解决你的问题,请参考以下文章