文件系统及 IO 类

RuxOS 底层组件支持如下文件系统,具体的文件系统封装(如fatfs)在功能模块层。同时,在底层组件中定义了类似于 Rust 标准库的 I/O 类,用于后续的 trait 定义和实现。

设备文件系统 devfs

在 Linux 的设计理念中,将各类设备(网络设备、块设备、串口设备等)抽象为了文件,由 /dev 挂载的设备文件系统进行统一管理,通过统一的 read/write 接口来实现对设备的访问。RuxOS 遵循了这样的理念,将设备抽象为文件,设计了设备文件系统的相关接口,包括挂载文件系统、创建目录、删除设备文件等。

在 RuxOS 初始化的时候,将设备文件系统挂载在了根目录,并且初始化了如下设备:

  • 空设备 /dev/null。对 null 设备发起读将会返回空,发起写将直接返回写的长度。

  • 随机数设备 /dev/random。读 random 设备发起读能够以字节的形式返回给定长度的随机数,发起写将直接返回写的长度。

  • 零设备 /dev/zero。对 zero 设备发起读,将对传入的缓冲 buffer 填入指定长度的0;对 zero 设备发起写将直接返回写的长度。

内存文件系统 ramfs

内存文件系统将数据存储在内存中,借助 Rust Vector 数据结构来保存具体的数据,同时在内存中建立目录树。内存文件系统不提供数据持久化功能,并且伴随操作系统启动而进行初始化,提供系统运行环境的相关文件。RuxOS 内存文件系统相关接口移植于 ArceOS,提供完整的、兼容Linux的语义。借助内存文件系统,完成了如下系统相关的文件系统(与 Linux 匹配)的挂载:

  • /tmp:临时文件系统。应用往往在该目录下创建临时文件用于测试等。

  • /etc:往往保存系统相关的配置文件。

  • /proc:存储系统当前运行状态下,进程相关的信息。

  • /sys:保存系统设备、内核等属性。

虚拟文件系统层 vfs

虚拟文件系统层实现了对底层具体文件系统接口的统一封装,使得上层应用只对路径有感,而对具体路径对应的文件系统无感。RuxOS 的vfs 层移植于 ArceOS,在里面定义了虚拟文件系统的相关 trait,包括:

  • VfsOps:描述注册到虚拟文件系统层的具体文件系统需要具备的方法,mount、umount、statfs等。

  • VfsNodeOps:描述文件系统中文件/目录节点所需要具备的方法,open、read、write等。

同时,在这里面定义了虚拟文件系统层的文件/目录节点属性、目录项结构体:

  • VfsNodeAttr:文件/目录节点属性,描述了具体节点的大小、权限等信息。

  • VfsDirEntry:目录项结构体,保存该目录项(文件也有目录项)的类型、名称。

I/O 类

axio 移植于 ArceOS 源码,匹配 Rust 标准库,定义了 I/O 相关的 trait,包括: Read/Write/Seek/BufRead 等,同时为 &[u8] 类型实现了 Read。在 axio 中,还提供了 BufReader 这一基于内存的缓存数据结构。