卷2 第15章 插口层

15.1 引言

插口层将进程请求映射到协议实现。

15.2 代码介绍

  • sys/socketvar.h:socket结构
  • kern/uipc_syscalls.c:系统调用
  • kern/uipc_socket.c:插口层函数

15.3 socket结构

成员

成员说明
so_type插口类型
so_options选项
so_linger拖延时间
so_state状态
so_pcb协议控制块
so_proto协议交换结构
so_rcv接收缓存
so_snd发送缓存

插口状态

标志说明
SS_ASYNC异步通知
SS_NBIO非阻塞
SS_ISCONNECTED已连接
SS_ISCONNECTING正在连接
SS_ISDISCONNECTING正在断开
SS_CANTRCVMORE不能接收
SS_CANTSENDMORE不能发送

15.4 系统调用

sysent结构

struct sysent {
    int sy_narg;
    int (*sy_call)();
};

系统调用流程 进程调用

syscall处理

参数复制

执行内核函数

返回结果

15.5 进程、描述符和插口

text proc{} → filedesc{} → file{}[] → file{} → socket{} 描述符是file结构数组的索引

file.f_data指向socket结构

15.6 socket系统调用

socket函数 falloc分配描述符

socreate创建socket

pffindproto查找协议

PRU_ATTACH请求

socreate函数 分配socket结构

调用协议PRU_ATTACH

15.7 getsock和sockargs函数

getsock:描述符→file结构

sockargs:参数复制到mbuf

15.8 bind系统调用

绑定本地地址

PRU_BIND请求

15.9 listen系统调用

准备接受连接

设置连接队列大小

solisten函数 PRU_LISTEN请求

最大队列:5(SOMAXCONN)

15.10 tsleep和wakeup函数

tsleep:进程睡眠

wakeup:唤醒进程

15.11 accept系统调用

等待连接

falloc分配描述符

从队列取出连接

PRU_ACCEPT请求

返回地址

15.12 sonewconn和soisconnected

sonewconn:新连接入队

soisconnected:连接完成

15.13 connect系统调用

客户端主动打开

PRU_CONNECT请求

等待连接完成

15.14 shutdown系统调用

how 说明 0 关闭读 1 关闭写 2 关闭读写 soshutdown函数 sorflush清空接收缓存

PRU_SHUTDOWN请求

15.15 close系统调用

soclose函数 丢弃未完成连接

断开已建立连接

SO_LINGER处理

PRU_DETACH请求

释放socket结构

15.16 小结

插口层提供协议无关的系统调用接口。socket结构是核心数据结构。