正常
导引:为什么需要 tmpfs
做完之后,
/tmp真能用:boot 自动挂上、busybox 能在里面建目录写文件、mount -t tmpfs none /mnt/tmp能在运行时再挂一个、umount能把整棵树干净回收。一条诚实的边界先说在前头:这是内存型 FS 的第一刀,只做最小可用的 tmpfs——无 inode 级 last-close 语义(unlink立即删 node)、非空目录删除返 EIO 而非 ENOTEMPTY、单 per-FS Spinlock 粗粒度、无 size 上限/无 swap 支撑、卸载即丢、symlink/link/rename未实现。这些不假装做了,留到正文和「这章没做的」里一条条交代。
这章咱们要点亮什么
- 同一个范式的第三次复用:
FileSystem子类 +InodeOps子类 + boot_init.cpp这个 DevFS/ProcFS 立起来的模子,tmpfs 照搬。差别只在「内容是不是真数据」。 - 内容存哪:不是生成的,是真在堆上的字节。
TmpNode内嵌Inode+fs_private指回自身(从 DevFS 的「单例 FS 指自己」升级到「per-node 可变内容指自己」),文件内容住在data/capacity/size三件套里。 - 写路径三件事:越 capacity 按 4KB 对齐摊销扩容、gap 零填防 stale 堆字节泄漏、靠
is_page_cacheable()默认 false 这条「故意不做」的逃生路径绕开磁盘 PageCache。 - 目录树怎么长:单向兄弟链表代替 DevFS 的定长表,支持运行时
create/mkdir/unlink改树;lookup是真正的多段 walk(扁平的 DevFS/ProcFS 不需要)。 - 两条挂载通路:boot 用静态
g_tmpfs、unowned(umount2只摘槽);运行时sys_mount用堆对象、owned=true(umount2走free_tree递归回收整棵树)。差别全在挂载表那个ownedbool。