操作系统拿着文件名查找磁盘文件的全过程
文章目录
- 前言
- 操作系统拿着文件名查找磁盘文件的全过程
- Step 1:路径解析(Path Parsing)
- Step 2:找到文件的 inode 编号
- Step 3:根据 inode 编号找到文件属性
- Step 4:通过 inode 中的数据块指针找到内容
- Step 5:磁盘访问细节(LBA寻址)
- Step 6:路径缓存(dentry cache)
- Step 7:跨分区查找与挂载(Mount)
- Step 8:总结整个查找过程
- 最终串讲一句话
前言
在写完文件系统那篇博客之后总感觉差点意思。今天这篇博客就从宏观上来讲述,操作系统拿着文件名去磁盘上查找文件的全流程。
操作系统拿着文件名查找磁盘文件的全过程
一句话总览:
从「文件名」到「磁盘数据」的查找过程,其实是操作系统从路径 → 目录 → inode → 数据块逐层解析的过程。
Step 1:路径解析(Path Parsing)
操作系统拿到一个路径(如 /home/user/test.txt),会先从根目录 / 开始查找。
路径会被拆解成多级目录:
/ → home → user → test.txt
每一级目录都要被访问一次。
在访问目录时,操作系统要读取它对应的 inode,并通过它的 data block 获取 文件名与 inode 的映射关系表。
每个目录本质上是一个特殊文件,它的数据块中保存着「文件名 → inode编号」的对应表。
Step 2:找到文件的 inode 编号
当系统解析到最后一级目录时(例如 user 目录),它会在该目录的 data block 中查找目标文件名(test.txt)。
查到后,操作系统就得到了该文件对应的 inode 编号(inode number)。
注意:
文件名不是文件的属性!
文件名保存在上一级目录的数据块中,而不是文件自己的 inode 中。
Step 3:根据 inode 编号找到文件属性
拿到 inode 编号后,操作系统进入下一步:
→ 通过 inode bitmap 找到该 inode 在 inode table 中的位置。
→ 从 inode table 中读出这个文件的属性(大小、权限、时间戳、所属用户、数据块指针等)。
inode 中最关键的信息之一是:
int data_blocks[N]—— 记录该文件内容在磁盘上的块号。
Step 4:通过 inode 中的数据块指针找到内容
操作系统根据 inode 中保存的 data block 编号,从磁盘的 data blocks 区 读出真正的文件内容。
数据块(block)是磁盘的基本存储单位(通常 4KB = 8个扇区)。
所以系统读文件时,并不是一个扇区一个扇区地读,而是以块为单位批量读取。
Step 5:磁盘访问细节(LBA寻址)
此时文件内容所在的数据块(block)在物理磁盘上其实对应很多个扇区。
操作系统通过文件系统层的块号(block number)找到对应的 LBA地址(Logical Block Address),磁盘控制器再将其转换为 CHS(Cylinder-Head-Sector) 物理地址,最终定位到磁盘上的真实位置。
所以:
- OS 只认 LBA(逻辑块地址)
- 磁盘内部自动完成 LBA → CHS 转换
Step 6:路径缓存(dentry cache)
「等下,那每次都要从根目录查一遍?那效率岂不是爆炸低?」
没错,所以 Linux 在内存中维护了一棵 目录树缓存(struct dentry 树)。
- 每打开一个目录或文件,都会在内核中生成一个 dentry 结构。
- 这些结构以 多叉树 + Hash + LRU 的方式组织。
- 当再次访问同一路径时,系统直接从缓存中找到目标 inode,避免磁盘 I/O。
Step 7:跨分区查找与挂载(Mount)
路径中的不同部分可能对应不同分区,比如:
/ -> 根分区(/dev/sda1)
/mnt/usb -> 挂载在U盘分区(/dev/sdb1)
所以系统在路径解析时,会根据路径前缀判断文件在哪个分区。
每个分区中都有自己的:
- super block
- GDT
- inode bitmap
- data block bitmap
- inode table
- data blocks
只有在挂载(Mount)操作后,分区才能与目录绑定并被访问。
Step 8:总结整个查找过程
| 步骤 | 操作 | 涉及结构 | 说明 |
|---|---|---|---|
| 1️⃣ | 解析路径 | dentry(目录项缓存) | 从根开始逐级解析路径 |
| 2️⃣ | 查找文件名对应 inode 编号 | 目录文件的 data block | 得到文件的唯一 inode number |
| 3️⃣ | 定位 inode | inode bitmap + inode table | 获取文件属性信息 |
| 4️⃣ | 定位数据块 | data block bitmap + inode 中的 block 指针 | 找到存放内容的块号 |
| 5️⃣ | 读取文件内容 | LBA地址映射 | 从磁盘加载数据块 |
| 6️⃣ | 缓存路径 | dentry 树结构 | 提高下次访问速度 |
| 7️⃣ | 分区管理 | 挂载(Mount)机制 | 实现多分区统一访问 |
最终串讲一句话
操作系统拿着文件名找文件的全过程:
路径解析(目录→inode) → 属性查询(inode→data block) → 物理定位(block→LBA→磁盘) → 路径缓存(dentry) → 分区挂载(mount)
完
