axfs_devfs 技术文档
路径:
components/axfs_crates/axfs_devfs类型:库 crate 分层:组件层 / 可复用基础组件 版本:0.1.2文档依据:Cargo.toml、README.md、src/lib.rs、src/dir.rs、src/null.rs、src/zero.rs、src/urandom.rs、src/tests.rs
axfs_devfs 是旧文件系统栈中的设备文件系统实现。它建立在 axfs_vfs 之上,提供一棵由代码显式构造的目录树,并内置 /dev/null、/dev/zero、/dev/urandom 这类典型字符设备节点所需的最小行为模型。
1. 架构设计分析
1.1 设计定位
axfs_devfs 的定位非常明确:
- 它是一个具体文件系统实现,而不是 VFS 抽象层。
- 它服务于旧
ax-fs栈,用于把设备节点挂入统一根目录。 - 它更像“程序构造出的静态设备树”,而不是能处理热插拔、权限、设备号和复杂 ioctl 语义的完整 devfs。
1.2 内部模块划分
src/lib.rs:定义DeviceFileSystem,负责根目录对象、mkdir()、add()与挂载时父目录回填。src/dir.rs:目录节点实现。内部用BTreeMap<&'static str, VfsNodeRef>保存子节点,并负责lookup、read_dir、路径递归。src/null.rs:/dev/null语义。src/zero.rs:/dev/zero语义。src/urandom.rs:/dev/urandom语义。src/tests.rs:覆盖目录树构造、路径遍历、父目录关系与设备读写行为。
1.3 关键设计点
根目录由代码构造
DeviceFileSystem 不从磁盘加载任 何内容。调用者通过:
mkdir(name)创建目录add(name, node)插入节点
来构造整棵设备树。
挂载时只修正父关系
mount() 的核心动作不是加载设备,而是把根目录的 parent 设置为挂载点父目录,使 .. 语义在挂载后仍然成立。
目录树默认不可动态修改
DirNode::create() 与 DirNode::remove() 最终都会返回 PermissionDenied。这说明当前 devfs 更像“只读目录结构 + 可读写设备节点”,而不是运行时可增删节点的管理器。
1.4 与相邻 crate 的边界
axfs_devfs位于axfs_vfs之上,是旧栈的具体叶子文件系统。- 它和
axfs_ramfs同级,但用途不同:ramfs存普通文件内容,devfs存设备节点。 - StarryOS 当前的
/dev并不复用它,而是在axfs-ng-vfs之上自建了新一套 pseudofs 设备树。
2. 核心功能说明
2.1 主要功能
- 维护一棵静态设备目录树。
- 提供空设备、零设备、伪随机设备的最小实现。
- 通过
lookup/read_dir/parent支持路径遍历。 - 在挂载到旧
ax-fs根目录后提供兼容性的/dev/*节点。
2.2 内置设备节点行为
NullDev
read_at()始终返回0,表示 EOF。write_at()直接丢弃输入并返回写入字节数。- 属性类型为
CharDevice。
ZeroDev
read_at()会把缓冲区填零。write_at()丢弃数据。- 适合表示经典
/dev/zero。
UrandomDev
read_at()基于简单 LCG 伪随机数生成器填充字节流。- 默认种子固定为
0xa2ce_a2ce。 - 它不是密码学安全随机源,更接近“方便测试与占位”的
/dev/urandom近似实现。
2.3 目录语义
- 目录节点使用
BTreeMap,因此遍历顺序稳定。 read_dir()会显式合成.和..。lookup()支持.、..以及多层递归路径。- 动态创建/删除路径默认被拒绝,避免 devfs 在运行期被当普通目录使用。
3. 依赖关系图谱
3.1 关键直接依赖
axfs_vfs:旧栈节点 trait 与目录项/属性结构。spin:目录树内部锁。log:目录创建/删除等调试输出辅助。