ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Zeal 8-bit OS VFS架构揭秘:虚拟文件系统如何统一驱动、磁盘与文件?

Zeal 8-bit OS VFS架构揭秘:虚拟文件系统如何统一驱动、磁盘与文件? Zeal 8-bit OS VFS架构揭秘虚拟文件系统如何统一驱动、磁盘与文件【免费下载链接】Zeal-8-bit-OSAn Operating System for Z80 computers, written in assembly项目地址: https://gitcode.com/gh_mirrors/ze/Zeal-8-bit-OSZeal 8-bit OS 是一个完全用汇编语言编写的 Z80 操作系统专为 8 位复古计算机设计。在这款系统的内核中**虚拟文件系统VFS**是连接用户程序、设备驱动、磁盘和文件系统的中枢神经。本文将带你一步步拆解 Zeal 8-bit OS VFS 架构用通俗易懂的方式讲清楚VFS 如何用一套统一的接口让应用程序读写文件、键盘、屏幕就像操作普通文件一样简单。本文基于 Zeal 8-bit OS 官方源码编写相关实现见 kernel/vfs.asm、kernel/disks.asm头文件定义见 include/vfs_h.asm。为什么 8 位系统也需要虚拟文件系统你可能觉得虚拟文件系统是 Linux 等大型系统的专利但在资源极度有限的 8 位平台上VFS 的价值反而更突出统一接口应用只需调用open/read/write/close不用关心背后是磁盘文件还是屏幕驱动节省内存所有驱动和文件系统共享同一套调用约定内核代码大幅精简易扩展新增一种文件系统或设备驱动不需要改动应用层代码。在 Zeal 8-bit OS 中用户程序通过RST 8中断进入系统调用分发器Syscall dispatcher随后请求被路由到 VFS由 VFS 决定调用磁盘模块还是设备驱动这正是整个架构的核心设计。一张图看懂 VFS 分层架构从 docs/details/vfs.md 的架构图可以看出整个系统分为清晰的多层用户程序 (User program) │ syscall / RST 8 ▼ 系统调用分发器 (Syscall dispatcher) ├──► 时间模块 (Time Date) ├──► 内存模块 (Memory) ├──► 加载器 (Loader) └──► VFS 虚拟文件系统 ├──► 磁盘模块 (Disk module) │ └──► 文件系统 (File System: ZealFS / Rawtable / HostFS) └──► 驱动 (Driver: 视频、键盘、串口等) └──► 硬件 (Hardware)核心设计思路VFS 位于分发器之下统一管理打开的设备表dev table。每次open调用返回一个描述符descriptor后续所有读写操作都通过描述符索引完成——这与 Unix 的文件描述符思想如出一辙。磁盘模块最多支持 26 个盘符Zeal 8-bit OS 的磁盘模块kernel/disks.asm支持最多26 个磁盘用字母A~Z标识。其中A:是特殊的默认盘系统启动时会从它加载init.bin初始程序。磁盘模块维护两张核心表_disks保存每个盘符对应的驱动地址每个盘背后都绑定一个块设备驱动_disks_fs记录每个盘使用的文件系统编号。挂载操作由 kernel/disks.asm 中的zos_disks_mount完成它负责校验盘符、检查是否重复挂载并把驱动与文件系统登记到表中。若盘符已被占用会返回ERR_ALREADY_MOUNTED错误。三种路径写法应用中的路径支持三种形式详见 docs/details/vfs.md类型示例说明相对路径my_dir2/file1.txt相对于当前目录盘内绝对路径/my_dir1/my_dir2/file1.txt相对于当前磁盘根目录跨盘绝对路径B:/your_dir/file2.txt显式指定盘符VFS 初始化时会把当前目录设为A:/用户程序通过chdir/curdir系统调用切换或查询当前目录。文件系统三兄弟Rawtable、ZealFS 与 HostFS即使系统完全烧录在 ROM 中无需磁盘即可启动加载init.bin时依然需要某种存储格式因此文件系统不可或缺。1. Rawtable极简只读文件表Rawtablekernel/fs/rawtable.asm不是传统文件系统而是一种组织化存储原始数据的方式存储设备开头是一个文件表头依次排列每个文件的名字16 字符内、大小、偏移和日期之后紧跟着文件内容本身。它不支持目录、只读非常适合 ROM 打包资源。2. ZealFS为 8KB~64KB 小存储而生ZealFSkernel/fs/zealfs_v2.asm是专门为微型存储设计的可读写文件系统支持文件和目录弥补了 Rawtable 的不足也让用户程序能够真正地保存数据。3. HostFS模拟器专用文件系统HostFSkernel/fs/hostfs.asm在模拟器环境下运行通过 I/O 端口与宿主机通信——把open等操作翻译成OP_OPEN、OP_STAT等命令发送给主机端见 tools/xfer.py让 Z80 程序直接读写 PC 上的文件极大方便了开发调试。未来还计划支持 FAT16让系统能直接读写 CompactFlash 和 SD 卡但该功能尚未实现。驱动如何与文件平起平坐这是 Zeal 8-bit OS VFS 最巧妙的设计驱动就是文件文件也是设备。在 kernel/vfs.asm 中定义了一个关键常量VFS_DRIVER_INDICATOR #当应用执行open时VFS 会检查路径首字符见 kernel/vfs.asm以#开头→ 按驱动处理通过zos_driver_find_by_name查找驱动否则→ 按文件处理交给磁盘模块与文件系统。驱动结构体include/drivers_h.asm由 4 字符名字 8 个函数指针组成init/read/write/open/close/seek/ioctl/deinit。例如打开键盘驱动只需open #KBD, O_RDONLY之后对它read就能像读文件一样读取按键输入。屏幕、串口、磁盘设备统统遵循这一约定——统一抽象正是 VFS 的灵魂。打开的文件描述符长什么样每个被打开的文件/目录都会分配一个打开文件结构include/disks_h.asm它记录字段作用magic标识该槽位是否空闲0xA0/0xB0也是区分文件与驱动的暗号fs文件系统编号低 4 位与读写标志高 4 位driver底层驱动地址size / off文件大小与当前读写偏移32 位usr4 字节自由区供文件系统自用VFS 借助结构体首字节的 magic 值非法 ASCII 字符就能快速判断一个描述符背后是文件还是驱动从而决定调用文件系统还是驱动函数——这个小聪明让代码极其精简高效。VFS 对外暴露的完整 APIVFS 在 include/vfs_h.asm 中声明了完整的公开接口映射到系统调用表docs/system-calls.md类别函数对应系统调用文件操作zos_vfs_open/close/read/write/seekopen/close/read/write/seek状态查询zos_vfs_stat/dstatstat/dstat目录操作zos_vfs_mkdir/chdir/opendir/readdirmkdir/chdir/opendir/readdir设备控制zos_vfs_ioctl/dup/swapioctl/dup/swap系统维护zos_vfs_mount/init/cleanmount及内核内部以zos_vfs_readkernel/vfs.asm为例它的执行流程极具代表性通过描述符查表拿到设备条目校验缓冲区不跨页边界调用zos_disk_is_opn_filedir判断是文件还是驱动文件→ 跳转到zos_disk_read走文件系统驱动→ 直接取出驱动的read函数指针跳转执行。读键盘和读文件走的是同一条 VFS 代码路径只是最后一步分叉而已。这种先判断、再尾调用的模式在 8 位汇编里做到了极致的性能与代码复用。总结VFS 的价值在哪里通过本文的拆解可以看到Zeal 8-bit OS 用不到几千行汇编就实现了一个功能完备的虚拟文件系统架构✅统一抽象文件、目录、设备驱动共用open/read/write/close一套接口✅多文件系统支持Rawtable、ZealFS、HostFS 可插拔共存未来还能加 FAT16✅多磁盘管理26 个盘符 每盘独立文件系统路径规则清晰✅极致精简magic 字节区分文件与驱动、尾调用分发处处体现汇编级优化智慧。如果你想深入源码推荐按这个顺序阅读include/vfs_h.asm接口定义→ kernel/vfs.asmVFS 核心→ kernel/disks.asm磁盘模块→ kernel/fs/zealfs_v2.asm文件系统实现。相信读完之后你会和我一样惊叹原来 8 位系统也能拥有如此优雅的 VFS 架构【免费下载链接】Zeal-8-bit-OSAn Operating System for Z80 computers, written in assembly项目地址: https://gitcode.com/gh_mirrors/ze/Zeal-8-bit-OS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表