news 2026/8/3 12:11:04

xv6 文件系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
xv6 文件系统

1. xv6 文件系统的整体结构:目录是一棵树

xv6 的文件系统中:

  • 文件 = 字节数组(例如普通文件)

  • 目录 = 一种特殊的文件,里面存的不是内容,而是:

    • 文件名 → inode 号(指向文件的引用)

    • 子目录的引用

所以整个系统形成一棵树:

/ ├── a │ └── b │ └── c

路径/a/b/c解析方式:

  1. 从根目录/开始

  2. 找名字"a"→ 得到 inode_A

  3. 在 inode_A 代表的目录里找名字"b"→ 得到 inode_B

  4. 在 inode_B 里找"c"→ 得到 inode_C(文件)


2. 绝对路径 vs 相对路径 + chdir

  • 绝对路径/开头,从根开始解析
    如:/a/b/c

  • 相对路径不以/开头,从“当前工作目录”开始解析
    当前工作目录属于每个进程自己的属性

系统调用chdir(path)会改变调用进程的当前目录。

举例:

chdir("/a"); chdir("b"); open("c", O_RDONLY);

执行效果:

  1. 当前目录变为/a

  2. 然后变为/a/b

  3. open("c")打开的就是/a/b/c

所以它等价于:

open("/a/b/c", O_RDONLY);

3. 创建文件 / 目录 / 设备文件的方法

xv6 提供几种系统调用:

系统调用作用
mkdir(path)创建目录
open(path, O_CREATE...)
mknod(path, major, minor)创建设备文件

示例

mkdir("/dir"); // 创建目录 fd = open("/dir/file", O_CREATE|O_WRONLY); // 创建文件 close(fd); mknod("/console", 1, 1); // 创建设备文件

关键点:设备文件不包含数据

它的 inode 会标记为:

  • 类型:T_DEV

  • 记录设备号 major/minor

当进程 open 这个设备文件时:

内核不会从磁盘读取这个“文件”,
而是把read/write调用转发给对应的内核设备驱动。


4. fstat():查看文件的信息

struct stat { short type; // 文件类型:目录 / 普通文件 / 设备文件 int dev; // 所在磁盘设备号 uint ino; // inode 编号(关键) short nlink; // 有多少名字指向这个 inode uint size; // 文件大小(字节) };

最关键字段:

  • ino:唯一标识一个文件实体

  • nlink:有多少文件名指向它(链接数量)


5. 一个 inode 可以有多个名字:link()

文件名只是指向 inode 的“标签”。

一个 inode(真实文件)可以有多个文件名指向它,这叫硬链接(hard link)

示例:

open("a", O_CREATE|O_WRONLY); // 创建 inode 10,名字 a → inode 10 link("a", "b"); // 添加名字 b → inode 10

结果:

  • "a"指向 inode 10

  • "b"也指向 inode 10

  • inode 10 的 nlink = 2

任何对 a 的读写 = 对 b 的读写

因为它们操作的是同一个 inode。

fstat()会告诉你:

  • a 与 b 的 inode 号一样

  • nlink = 2


6. unlink:删除的是“名字”,不是文件本体

unlink(path)做两件事:

  1. 删除该目录项(“名字”)

  2. 把那个 inode 的 nlink 减 1

如果 nlink > 0:

  • 还有别的名字指着它

  • inode 不会删除

如果 nlink = 0:

  • 没有任何名字再引用这个 inode

  • 如果没有进程打开它
    → 文件内容和 inode 会被回收

示例:

open("a", ...); link("a", "b"); unlink("a");

此时:

  • "a"删除

  • "b"仍然指向 inode 10

  • nlink 从 2 降到 1

文件仍然存在。


7. 利用 unlink 创建临时文件(Unix 经典技巧)

代码:

fd = open("/tmp/xyz", O_CREATE|O_RDWR); unlink("/tmp/xyz");

含义:

  • /tmp/xyz被创建,inode 20 的 nlink=1

  • unlink 删除名字"xyz"→ nlink=0

  • 但进程仍然持有 fd 指向 inode 20

  • 所以 inode 不会删除

结果:

  • 文件没有名字 → 外部不可见

  • 进程仍可通过fd读写它

  • 当进程退出 / 关闭 fd → inode 自动删除

这是 Unix 最推荐的“安全临时文件”方式。


8. 为什么 xv6 的 mkdir / ln / rm 都是用户程序?

因为它们只需要执行:

  • 系统调用(mkdir、link、unlink 等)

系统调用操作真正的文件系统:

  • 不依赖进程的内部状态

  • 所以用单独的进程执行完全没问题

这符合 Unix 的“用户态工具 + 小内核”哲学。


9. 唯一例外:cd 必须在 shell 内部实现

为什么?

因为:

  • shell 每次执行命令前都会 fork 一个子进程来执行外部命令

  • 如果 cd 是外部命令,它会运行在子进程

那么:

$ cd /a/b

会发生:

  1. shell fork 出子进程

  2. 子进程执行 cd → 改变子进程的当前目录

  3. 子进程退出

  4. 回到父进程 shell,当前目录没变!

也就是说:

子进程 chdir() 没法改变父进程(shell)的当前目录。

所以:

  • cd 必须直接在 shell 进程里执行

  • shell 不能 fork,它必须自己调用chdir()

这就是为什么:

  • mkdir, rm, ln 等可以自成程序

  • 但 cd 必须写死在 shell 代码里(built-in 命令)


总结

  1. 文件名只是 inode 的引用,目录是一棵树结构。

  2. 路径解析由当前目录决定,chdir 改变当前进程目录。

  3. mkdir/open/mknod 分别创建目录、普通文件、设备文件。

  4. inode 是文件本体,有唯一编号和链接数(nlink)。

  5. link 为同一 inode 创建第二个名字。

  6. unlink 删除“名字”,只有 nlink=0 且无 fd 才删除文件本体。

  7. open + unlink 可创建“无名字的临时文件”。

  8. xv6 文件操作命令都是用户程序,唯独 cd 必须在 shell 内运行,因为子进程不能改变父进程目录。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/3 11:47:02

CentOS7 磁盘扩容

1.在vm虚拟机中添加一个新的磁盘 在vm虚拟机中添加一个磁盘这里我添加了一个10GB的磁盘 2.对于磁盘进行分区 我们先运行 lsblk来查看我们刚刚新添加磁盘的代号可以看到我这里添加的新磁盘是sdf那么我们现在进行分区: fdisk /dev/sdf然后我们按n开始分区:…

作者头像 李华
网站建设 2026/8/3 10:15:26

PDFMathTranslate中文乱码终极解决方案:从诊断到完美修复

PDFMathTranslate中文乱码终极解决方案:从诊断到完美修复 【免费下载链接】PDFMathTranslate PDF scientific paper translation with preserved formats - 基于 AI 完整保留排版的 PDF 文档全文双语翻译,支持 Google/DeepL/Ollama/OpenAI 等服务&#x…

作者头像 李华
网站建设 2026/8/3 17:43:01

直接数字下变频 原理解释和python仿真

第一步:图 25.12 & 25.13 —— 寻找“完美的采样点”这两张图是在教我们怎么“偷懒”。1. 笨办法但很完美(图 25.12)2. 聪明的偷懒(图 25.13)第二步:图 25.14 —— 频域里的“乾坤大挪移”这张图解释了…

作者头像 李华
网站建设 2026/8/3 17:46:08

告别低效内耗:2025中小企业办公新方式

在数字化浪潮的推动下,中小企业的办公模式正迎来颠覆性变革。不同于大型企业拥有充足的资金和专业IT团队支撑复杂系统落地,中小企业更需要“轻量化部署、低成本投入、高适配性”的办公解决方案。仲量联行报告显示,2025年已有73%的中小企业实现…

作者头像 李华
网站建设 2026/8/3 10:23:17

微信7.0.6提示升级问题解决方法

下载NP管理器 1.1、提取安装包 打开安装包编辑器,点击左侧拉出菜单栏,单击栏内【安装包提取】功能,选择新旧版本微信后提取软件安装包。 1.2、查看安装包 通过安装包编辑器提取安装包功能提取新旧版VX的安装包,选择定位并查看,新旧版本操作方法一致。 1.3、获取版本…

作者头像 李华
网站建设 2026/8/3 16:24:15

大模型训练优化:5个内存效率提升技巧与实战配置指南

大模型训练优化:5个内存效率提升技巧与实战配置指南 【免费下载链接】DeepSeek-V3 项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-V3 在当今大模型训练领域,内存优化与计算效率已成为决定项目成败的关键因素。本文基于DeepSeek-V3…

作者头像 李华