卷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结构是核心数据结构。