Socket与系统调用深度分析

# 请将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函数中

  Socket与系统调用深度分析_第1张图片

 

     # 转入trap_init, trap_init主要是中断向量表的初始化工作

  Socket与系统调用深度分析_第2张图片

 

 

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

你可能感兴趣的:(Socket与系统调用深度分析)