第 9 章 · 05 文件系统:持久化的抽象


第 9 章 · 05 文件系统:持久化的抽象

本节摘要:这是 OS 线的最后一节,讲文件系统——把磁盘的块抽象成「文件与目录树」。本节简述 inode(呼应姊妹篇《Linux 命令》第 2 章)、目录、读写路径的实现思路。本节不深做,只让你看到「磁盘块如何变成文件」的完整链路。

内容来源:基于 OS 文件系统整理的导读,呼应姊妹篇《Linux 命令》第 2 章 inode 与第 5 章挂载。

学习目标

  1. 说清文件系统的职责:把磁盘块抽象成文件与目录树。
  2. 理解 inode:存文件元信息(权限/大小/数据块位置),文件名在目录里。
  3. 描述目录:它是「文件名 → inode 编号」的映射表。
  4. 理解读写路径:路径解析(逐级查目录)→ inode → 数据块。

一、学习价值:连接「块设备」与「文件」

磁盘硬件提供的是「块读写」(读第 N 个扇区)。但用户需要的是「文件」(打开 hello.txt,读内容)。文件系统就是这中间的翻译层——把块组织成文件与目录树。理解文件系统,你才理解 open("hello.txt") → read 这条调用链背后发生了什么(姊妹篇《Linux 命令》全书的根基)。

二、认知拆解

inode 与目录(呼应姊妹篇第 2 章)

  • inode:文件元信息(权限/大小/数据块位置)的存储结构,编号唯一。不含文件名。
  • 目录:一种特殊文件,内容是「文件名 → inode 编号」的映射表。
  • 路径:树形结构,根目录 / 是起点,逐级经子目录到文件。

文件名只是 inode 的门牌号——这与姊妹篇《Linux 命令》第 2 章讲的硬链接完全一致(本书只是从「造文件系统」的视角重讲)。

磁盘布局

磁盘(或分区)格式化后典型布局:

[超级块: 整体元信息] [inode 位图] [数据块位图] [inode 表] [数据块] ​
  • 超级块:文件系统整体信息(大小、inode 数等)。
  • 位图:哪些 inode/数据块空闲。
  • 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 的文件系统(代码短,清晰)。

本节要点回顾

  1. 文件系统:把磁盘块抽象成文件与目录树,连接块设备与「文件」概念。
  2. inode:文件元信息(权限/大小/数据块位置),不含文件名;呼应姊妹篇第 2 章。
  3. 目录:「文件名 → inode 编号」映射表的特殊文件。
  4. 读写路径:逐级解析目录找 inode,按 inode 找数据块。
  5. 磁盘布局:超级块 + 位图 + inode 表 + 数据块。

推荐上手顺序

  1. 设计磁盘布局(超级块/位图/inode 表/数据块)。
  2. 实现 inode 分配与数据块分配。
  3. 实现目录(文件名→inode 映射)。
  4. 实现 open/read/write/lst。
  5. 参考 xv6 文件系统。

OS 线至此结束。接下来三节是编译器线——从源码到可执行。

作者与出处
原作者:灏天文库
来源:codecrafters-io
许可证:CC0-1.0
整理人: 灏天文库整理
由灏天文库结构化整理,提供目录导航、全文检索与在线阅读,便于系统化学习
发布者: 作者: 灏天文库 转发
评论区 (0)
U