tianole/docs/agents/tasks/06-storage-vfs.md

114 lines
4.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 06 存储、缓存与 VFS
## 目标
建立文件访问路径:块设备或 initramfs 提供数据VFS 提供统一文件接口。
## 前置条件
- 内存管理可用。
- 锁和等待机制可用。
- 用户态之前可以先由 kernel 测试 VFS。
## 建议边界
- `drivers/block/`:块设备抽象和具体设备。
- `kernel/fs/`VFS。
- `mm/`:页缓存或块缓存。
- `fs/`:具体文件系统实现。
## 实现内容
- 建立 block device 接口。
- 初期支持 initramfs/ramdisk。
- 建立 inode、dentry、file 等 VFS 对象。
- 建立路径解析。
- 支持 open/read/close/readdir。
- 后续再加入 write 和持久化文件系统。
- 为 page cache、block cache、writeback 和崩溃一致性预留边界。
### 1. Block layer 与数据来源
- 初期可以使用 initramfs/ramdisk让 VFS 在没有真实磁盘驱动时先闭环。
- block device 接口要表达设备大小、块大小、read/write 请求和完成状态。
- 块设备驱动不直接解析文件系统,也不直接服务 shell。
- 后续 virtio-blk、AHCI、NVMe 应通过同一 block device 接口接入。
### 2. VFS object model
- 建立 superblock、inode、dentry、file 或等价对象边界。
- inode 表示文件对象和元数据dentry 表示路径缓存file 表示一次打开实例和 offset。
- 对象生命周期要有引用计数或明确所有权。
- VFS 调用方不能直接依赖某个具体文件系统结构。
### 3. Path lookup
- 路径解析要支持绝对路径、相对路径、`.`、`..` 和目录边界。
- lookup 需要区分不存在、不是目录、权限不足和 I/O 错误。
- 当前可以先不实现 mount namespace但接口要为 mount point 和根目录切换留位置。
- 路径字符串来自用户态时,必须经过用户指针复制和长度检查。
### 4. File operations
- 先实现 `open/read/close/readdir`,再加入 `write/create/unlink/rename`
- file operation 通过表或函数指针分发VFS 不写死 ramfs/initramfs。
- 目录读取要有稳定迭代语义,不能只打印日志。
- offset、EOF、短读和错误码要从一开始定义清楚。
### 5. Cache 与一致性预留
- page cache/block cache 不应属于某个具体磁盘驱动。
- 只读阶段可以不做 writeback但接口要保留 dirty、flush、invalidate。
- 后续可写文件系统需要定义崩溃一致性策略,例如 journal、copy-on-write 或简单同步写。
- VFS、MM 和 block layer 的缓存边界要清楚,避免同一数据被多套缓存重复管理。
## Linux 参考原则
- 参考 Linux VFS上层通过通用 inode/file/dentry/superblock 语义访问不同文件系统。
- 参考 Linux block layer文件系统发出块请求具体设备驱动处理硬件细节。
- 参考 Linux page cache文件数据缓存属于 MM/VFS 共同边界,而不是具体文件系统私有数组。
- 参考 Linux file operations具体文件系统实现操作表VFS 负责统一分发和生命周期。
## 非玩具化约束
- VFS 不依赖某个具体文件系统。
- 文件系统不直接依赖 shell 或进程加载器。
- 路径解析和引用计数要从一开始有边界。
- 缓存层不能和具体磁盘驱动耦合。
- VFS 对象生命周期必须明确,不能靠全局静态对象规避释放问题。
- 文件权限、时间戳、inode 编号等 POSIX 语义要保留位置。
- open file 和 inode 不能混成同一个对象。
- VFS 错误要能映射到后续用户态 errno。
- read/write 不能只服务 demo 文件,必须处理 offset、EOF 和短读。
- 文件系统 selftest 不能依赖 shell 已经存在。
- 后续可写路径不能要求重写只读 VFS API。
## 验收方式
- kernel 可通过 VFS 打开并读取文件。
- 可列出目录。
- 替换具体 FS 不影响 VFS 调用方。
- 后续能加入可写缓存和 writeback而不重写 VFS 调用层。
- initramfs/ramfs 和至少一个 VFS selftest 通过同一 open/read/readdir 接口。
- 路径解析错误有明确返回值。
- file offset 行为可测试。
- 多次 open 同一文件能得到独立 file object。
- 后续用户态 `cat/ls` 可以直接复用当前 VFS 接口。
## 当前状态
未开始。
进入本阶段前,`03-memory.md` 应至少有稳定 heap`04-time-scheduler.md` 应具备锁和等待基础。
## 后续扩展
- page cache。
- block cache。
- writeback。
- 可写 ramfs。
- FAT/ext2 等简单持久化文件系统。
- mount table。
- 权限、时间戳和 inode 编号。
- 设备文件、pipe 和 socket 文件接口。