axdriver_vsock 技术文档
路径:
components/axdriver_crates/axdriver_vsock类型:库 crate 分层:组件层 / vsock 设备类别接口层 版本:0.1.4-preview.3文档依据:Cargo.toml、README.md、src/lib.rs、components/axdriver_crates/axdriver_virtio/src/socket.rs、os/arceos/modules/axruntime/src/lib.rs
axdriver_vsock 用来定义 vsock 驱动的统一接口。它既不是通用 socket API,也不是网络协议栈,而是把“面向 host/guest 通道的设备驱动”抽象成一组统一操作,让 virtio-vsock 之类的具体实现能被 ax-driver 聚合层和 ax-net-ng 上层消费。
1. 架构设计分析
1.1 设计定位
这个 crate 的职责集中在三个方面:
- 定义
VsockAddr和VsockConnId这两个连接标识类型。 - 定义
VsockDriverEvent,把底层设备事件统一成驱动层事件模型。 - 定义
VsockDriverOps,为监听、连接、收发、断开和事件轮询提供统一接口。
它的层次位置是:
- 向下承接具体 vsock 设备驱动,例如
VirtIoSocketDev。 - 向上被
ax-driver::prelude和ax-net-ng使用。 - 不承担 BSD socket、poll 语义、地址解析等更高层网络职责。
1.2 关键对象
| 符号 | 作用 |
|---|---|
VsockAddr | (cid, port) 形式的对端地址 |
VsockConnId | 以 peer_addr + local_port 标识一条连接 |
VsockDriverEvent | 驱动上报的连接/接收/断开/credit 事件 |
VsockDriverOps | 统一定义监听、连接、收发和轮询接口 |
1.3 事件与连接模型
VsockDriverOps 暴露的操作分为几组:
- 基本信息:
guest_cid()。 - 连接管理:
listen()、connect()、disconnect()、abort()。 - 数据通路:
send()、recv()、recv_avail()。 - 事件获取:
poll_event()。
VsockConnId::listening(local_port) 还提供了一个特殊构造,用于表达“仅监听某个本地端口”的连接标识。
1.4 当前主要实现路径
当前仓库里,ax_driver_virtio::VirtIoSocketDev 是主要实现:
- 它内部使用
virtio_drivers::device::socket::VsockConnectionManager。 connect()/send()/recv()等操作都被翻译到底层 VirtIO socket 管理器。poll_event()会把底层VsockEvent转成VsockDriverEvent。recv()后还会显式update_credit(),说明 credit 流控是当前实现的重要一环。
再往上一层:
ax-driver把 vsock 设备放入AllDevices.vsock。ax-runtime仅在net-ng+vsockfeature 组合下调用ax-net_ng::init_vsock(all_devices.vsock)。
这说明该 crate 不是独立的网络主线,而是 ax-net-ng 可选能力的一部分。
1.5 源码中的现实细节
src/lib.rs 里还残留了明显的文案复制 错误,例如把顶层注释写成 “device drivers (i.e. disk)” 、把 trait 注释写成 “block storage device”。这些注释并不代表真实定位,真实接口完全围绕 vsock 连接和事件设计。
1.6 边界澄清
最关键的边界是:axdriver_vsock 定义的是 vsock 设备驱动契约,不是用户可见的 socket API,也不是通用网络栈。
2. 核心功能说明
2.1 主要能力
- 统一表达 vsock 地址、连接和驱动事件。
- 为设备驱动提供一套面向连接管理和事件轮询的 trait。
- 让
virtio-vsock这样的实现可以被ax-driver聚合和ax-net-ng消费。
2.2 当前接口特征
- 连接标识以
peer_addr + local_port为主,而不是文件描述符或句柄。 poll_event()返回Option<VsockDriverEvent>,支持“暂时无事件”的轮询模式。recv_avail()把“当前可读字节数”单独抽成接口,说明上层可能需要先探测再读。
2.3 当前实现范围
本 crate 目前只定义契约,不内建任何具体设备实现。当前仓库里的实际实现来自 ax_driver_virtio::VirtIoSocketDev,也就是说,它本身是纯类别层。
3. 依赖关系图谱
3.1 直接依赖
| 依赖 | 作用 |
|---|---|
ax-driver-base | 提供统一设备元信息和错误类型 |
log | 为实现 crate 预留日志依赖环境 |
3.2 主要消费者
components/axdriver_crates/axdriver_virtioos/arceos/modules/axdriveros/arceos/modules/axnet-ng