本节摘要:这是 OS 线的最后一节,讲文件系统——把磁盘的块抽象成「文件与目录树」。本节简述 inode(呼应姊妹篇《Linux 命令》第 2 章)、目录、读写路径的实现思路。本节不深做,只让你看到「磁盘块如何变成文件」的完整链路。
内容来源:基于 OS 文件系统整理的导读,呼应姊妹篇《Linux 命令》第 2 章 inode 与第 5 章挂载。
磁盘硬件提供的是「块读写」(读第 N 个扇区)。但用户需要的是「文件」(打开 hello.txt,读内容)。文件系统就是这中间的翻译层——把块组织成文件与目录树。理解文件系统,你才理解 open("hello.txt") → read 这条调用链背后发生了什么(姊妹篇《Linux 命令》全书的根基)。
/ 是起点,逐级经子目录到文件。文件名只是 inode 的门牌号——这与姊妹篇《Linux 命令》第 2 章讲的硬链接完全一致(本书只是从「造文件系统」的视角重讲)。
磁盘(或分区)格式化后典型布局:
[超级块: 整体元信息] [inode 位图] [数据块位图] [inode 表] [数据块]
open("/a/b.txt"): 从根目录 inode 开始 在根目录的目录项里找 "a" → 得 a 的 inode 在 a 目录项里找 "b.txt" → 得 b.txt 的 inode 返回这个 inode 对应的"打开文件" read(fd, buf): 按 inode 里记录的数据块位置, 读块到 buf
写新文件:分配空闲 inode、分配空闲数据块、写内容到数据块、把「文件名→inode」加到目录、更新位图。呼应第 8 章数据库的「页分配」——存储分配是共通问题。
造 OS 时,写一个最简文件系统:固定 inode 表 + 数据块位图 + 目录项。实现 open/read/write/lst。参考 xv6 的文件系统(代码短,清晰)。
OS 线至此结束。接下来三节是编译器线——从源码到可执行。