axio
路径:
components/axio类型:库 crate 分层:组件层 / 通用同步 I/O 语义层 版本:0.3.0-pre.1文档依据:Cargo.toml、README.md、src/lib.rs、src/read/mod.rs、src/write/mod.rs、src/seek/mod.rs、src/buffered/*、src/iobuf/*、src/utils/*、tests/*
axio 是仓库里所有“同步 I/O 行为”共享的一层公共协议。它把 Rust std::io 的核心 trait、缓冲包装器和若干辅助适配器移植到 no_std 语境,并将错误统一到 ax-errno。文件、socket、内存游标、用户态缓冲区访问器、POSIX 兼容层里的读写对象,都通过它来表达“可读”“可写”“可 seek”这些共同语义。
最需要先钉死的一条边界是:axio 只定义同步 I/O 接口与默认行为,不负责等待、唤醒、超时和多路复用。PollState 只是一个轻量就绪快照,不是事件系统。
架构设计
设计定位
axio 解决的不是文件系统、网络协议或设备驱动本身,而是这些子系统都必须共享的 I/O 契约:
- 统一的同步 trait:
Read、Write、Seek、BufRead - 统一的缓冲包装器:
BufReader、BufWriter、LineWriter - 统一的游标与 glue 工具:
Cursor、copy、read_fn、write_fn、empty、sink、repeat、take、chain - 统一的“剩余长度”扩展:
IoBuf/IoBufMut
这让上层代码在不关心底层对象究竟是文件、socket、内存切片 还是用户缓冲访问器的前提下,复用同一套读写与缓冲逻辑。
模块结构
| 模块 | 作用 |
|---|---|
read | 定义 Read / BufRead,提供 read_exact、read_to_end、read_to_string、read_until、lines 等默认实现 |
write | 定义 Write,提供 write_all、write_fmt 等通用逻辑 |
seek | 定义 Seek / SeekFrom,提供 stream_len、stream_position、rewind、seek_relative |
buffered | 实现 BufReader、BufWriter、LineWriter 以及 IntoInnerError |
iobuf | 定义 IoBuf / IoBufMut 及其扩展 trait,用于暴露剩余可读/可写长度 |
utils | 放置 Cursor、copy、take、chain、empty、sink、repeat、read_fn、write_fn 等适配器 |
prelude | 重导出常用 trait,供上层直接 use ax_io::prelude::* |
1.3 与 std::io 的关系
README.md 已明确说明:axio 基本沿 用 Rust 标准库 std::io 的设计与大量实现细节,但为了适配内核和 no_std 场景做了几处关键收敛:
- 错误类型改为
ax_errno::AxError - 不提供
IoSlice、IoSliceMut与*_vectored系列接口 - 在不启用
alloc时保留一条更适合固定缓冲区的最小能力路径
因此,axio 更准确的表述不是“重新发明一套 I/O 接口”,而是“给 ArceOS/StarryOS 提供可在 no_std 中使用的 std::io 内核版”。
1.4 IoBuf / IoBufMut 的真实意义
这两个扩展 trait 很容易被忽略,但在仓库里它们恰好体现了 axio 的定位:不仅要抽象“能不能读写”,还要在对象本身能给出长度信息时,把这类信息向上层显式暴露。
IoBuf::remaining():当前还剩多少字节可读IoBufMut::remaining_mut():当前还剩多少空间可写
这不是新的 I/O 模型,而是给通用 trait 层补上一点对内核路径很实用的容量语义。ax-net-ng 的发送/接收接口、部分文件与缓冲区适配器都会消费这类信息。
1.5 alloc feature 的边界
alloc 是 axio 最关 键的编译期开关。开启后会额外获得:
Read::read_to_end、Read::read_to_stringBufRead::read_until、read_line、split、lines- 对
Vec<u8>、Box<T>等分配型容器的 trait 实现 - 更完整的
BufReader/BufWriter容量行为
不开启 alloc 时,axio 仍然是完整可用的同步 I/O 抽象,只是更偏向固定切片、固定容量缓冲和内核内部对象之间的最小通路。
1.6 与 axpoll 的关系
src/lib.rs 中的 PollState 只有两个布尔位:readable 与 writable。它的职责仅仅是表达“此刻是否可读/可写”,给上层留下一个统一的 readiness 结果结构。
真正的等待与唤醒不在 axio 中:
axpoll负责IoEvents、Pollable和 waker 集合ax-task负责把 nonblocking I/O 桥接成 futureselect/poll/epoll一类系统接口在更高层实现
这条边界对理解 axio 极其关键:axio 是同步 I/O 语义层,不是事件轮询层。