# 请将Socket API编程接口、系统调用机制及内核中系统调用相关源代码、 socket相关系统调用的内核处理函数结合起来分析,并在5.0以上的内核中进一步跟踪验证。
# Socket接口在用户态通过系统调用机制进入内核
# 内核中将系统调用作为一个特殊的中断来处理,以socket相关系统调用为例进行分析
# socket相关系统调用的内核处理函数内部通过“多态机制”对不同的网络协议进行的封装方法
# Socket API编程接口、系统调用机制及内核中系统调用相关源代码; socket相关系统调用的内核处理函数结合起来分析
1. 引言
在网络编程时,往往会用到socket,socket是网络通信中应用程序对应的进程和网络协议之间的接口
socket位于协议之上,可以通过参数传递来实现不同协议
此处我们用gdb跟踪分析内核初始化加载TCP/IP协议栈,及hello/hi通信程序中从socket api到内核系统调用处理函数的过程-3.18.6
2. C中socket相关的api, linux下socket相关系统调用及对应的内核处理函数
# socket api, socket的主要API都定义在sys/socket.h头文件中, 主要包括以下
--> socket()
--> bind()
--> listen()
--> connect()
--> accept()
--> close() # 将fd的引用计数减一只有当引用计数为0的时候才真正的关闭连接
--> shutdown() # 立即终止连接
--> recv()
--> send()
# 32位linux系统下socket相关系统调用及对应的内核处理函数(更多的系统调用可参考https://github.com/mengning/linux/blob/master/arch/x86/entry/syscalls/syscall_32.tbl)
系统调用 内核处理函数
--> socketcall sys_socketcall
--> socket sys_socket
--> bind sys_bind
--> connect sys_connect
--> listen sys_listen
--> accept4 sys_accept4
--> recvmsg sys_recvmsg
--> sendmsg sys_sendmsg
--> shutdown sys_shutdown
3. 内核初始化加载TCP/IP协议栈
start_kernel --> trap_init --> idt_setup_traps --> 0x80(entry_INT80_32)
# 在系统中是将系统调用当作一个特殊的中断来处理
3.1 start_kernel
# start_kernel在init/main.c函数中
# 转入trap_init, trap_init主要是中断向量表的初始化工作
3.2 trap_init
#
4. gdb跟踪调试hello/hi通信程序中从socket api到内核系统调用的过程
# 内核中将系统调用作为一个特殊的中断来处理, 证明之???
# 从sokcet api 到 内核系统调用的过程???
# 用户发起的网络调用,如sockcet(), send()等, 通过系统调用接口进入内核,之后内核调用 sys_socketcall()(位于./net/socket.c 中, 也是所有的socket系统调用的入口)
# 该函数将特定的调用分别发送到指定目标,如sockcet()调用对应sys_socket()内核处理函数, 而send()调用对应sys_send()完成, 这两个内核函数都在./net/socket.c中
# 在Intel结构的计算机中,由中断int 0x80实现将处理器转向系统调用入口, int 0x80处对应的中断服务例程就是system_call,也就是系统调用的入口函数
4.1 system_call(系统调用的入口函数)
# 当调用socket api的时候,会跳转到system_call处,system_call会检查相关的系统调用编号(在系统调用表中查找),之后找到对应的函数指针,就调用该函数
# 函数返回后,调用ret_from_sys_call,这里就是著名的进程调度时机之一
(??? 展开后的代码实际上是将系统调用号放入ax后移用int 0x80使处理器转向系统调用入口,然后查找系统调用表,进而由内核调用真正的功能函数。)
4.3 sys_socketcall(对应112号系统调用socketcall)
4.3 sys_socket (从用户态到内核态, 对应socket系统调用)
4.4 recv (用内核态到用户态)
参考来源:
1. https://github.com/mengning/net/blob/master/doc/tcpip.md
2. https://github.com/mengning/net/blob/master/doc/socketSourceCode.md