当前位置: 首页
系统平台
UNIX文件系统深度分析与对比研究

UNIX文件系统深度分析与对比研究

热心网友 时间:2026-06-20
转载

在Unix世界里,文件系统的底层机制并不复杂。从源码实现细节入手,我们来看看一个文件从创建到被打开,磁盘与内存之间究竟经历了哪些关键步骤。需要说明的是:本文基于经典V7 Unix实现进行解析,但其核心设计理念至今仍被现代操作系统沿用。

首先,当一个文件尚未被打开时,它在磁盘上需要以下三部分内容:一个目录项、一个磁盘Inode结构、以及若干磁盘块(n可以为0)

目录项是一个轻量级数据结构,其中最关键的两个字段分别是:文件名指向inode的指针。目录的执行权限本质上就是允许系统将文件名转换为inode编号,完成这项转换的核心函数是namei。具体实现细节可参考Unix源码,这里不再展开。

磁盘Inode结构在V7中定义如下:

struct dinode 
{
    unsigned short di_mode;   /* 文件类型与权限位 */
    short di_nlink;           /* 硬链接数量 */
    short di_uid;             /* 文件所属用户ID */
    short di_gid;             /* 文件所属组ID */
    off_t di_size;            /* 文件字节大小 */
    char di_addr[40];         /* 磁盘块地址列表 */
    time_t di_atime;          /* 最后访问时间 */
    time_t di_mtime;          /* 最后修改时间 */
    time_t di_ctime;          /* 创建时间 */
};

各字段含义已通过注释说明,但有几个要点值得深入理解:di_mode不仅包含权限信息,还标识文件类型(普通文件、目录、设备等);di_nlink记录有多少个目录项指向该inode;di_addr是inode的核心字段,它存储了文件数据所占用的磁盘块地址数组,V7使用40字节来存储这些地址,实际实现中每个块通常为512字节;三个时间戳分别对应访问时间修改时间属性变更时间

磁盘块在物理层面是连续的扇区,逻辑上则按固定大小组织成块,便于文件系统管理。

当系统引用一个文件时(注意:此时尚未执行open系统调用),需要将磁盘inode加载到内存中。V7的内存inode结构定义如下:

struct inode 
{
    Char i_flag;
    char i_count;            /* 引用计数(当前活跃引用数) */
    dev_t i_dev;             /* 该inode所在的设备号 */
    ino_t i_number;          /* inode编号,与设备号唯一对应 */
    unsigned short i_mode;
    short i_nlink;           /* 目录项数量 */
    short i_uid;             /* 属主用户ID */
    short i_gid;             /* 属主组ID */
    off_t i_size;            /* 文件大小 */
    union {
        struct {
            daddr_t i_addr[NADDR];   /* 普通文件/目录的磁盘块地址 */
            daddr_t i_lastr;         /* 上次读取的逻辑块号(用于预读优化) */
        };
        struct {
            daddr_t i_rdev;          /* 设备号,复用i_addr[0]字段 */
            struct group i_group;    /* 多路复用组文件 */
        };
    } i_un;
};

与磁盘inode相比,内存版本增加了运行时所需的字段,其中最重要的就是引用计数i_count,它记录了当前有多少进程或内核路径指向该inode。当i_count归零时,该内存inode才可以被回收。

最后,当文件被真正打开时,还需要引入以下两层结构:

  • 用户进程的u区中的u_ofile数组项:该数组存储指向file结构的指针,所谓文件描述符,本质上就是该数组的下标索引。
  • 系统文件表中的一项:即struct file,V7中的定义如下:
struct file 
{
    char f_flag;
    char f_count;            /* 引用计数(当前引用该file结构的进程数) */
    struct inode *f_inode;   /* 指向内存inode的指针 */
    union {
        off_t f_offset;      /* 读写指针偏移量 */
        struct chan *f_chan; /* 多路复用通道指针 */
    } f_un;
};

文件表结构最初的设计目的是为了支持偏移量共享f_offset)。使用dup复制一个文件描述符与再次打开同一个文件,两者的本质区别就在于file结构的f_countdup会使两个描述符指向同一个file结构,从而共享读写偏移量;而两次独立的open调用则会创建两个独立的file结构,各自维护自己的偏移量。

如果感兴趣,可以结合这些数据结构字段的变化,手动模拟文件打开、关闭、linkunlink等操作流程,这样对Unix文件系统原理的理解会更加透彻。虽然Unix源码非常精炼,但直接阅读仍有一定难度——本文只选取了最核心的线索进行分析。

此外,附上昨晚编写的一个find命令简易实现,支持-name-user-group参数。使用方法:Find 目录列表 可选参数。代码水平有限,希望给初学C语言的朋友提供一个参考范例,如有改进意见也欢迎交流指正。

来源:https://www.jb51.net/os/Unix/66939.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
Mac隐藏左上角菜单栏苹果图标

Mac隐藏左上角菜单栏苹果图标

先直接告诉你答案:Mac电脑屏幕左上角的那个苹果标志,既无法关闭,也无法隐藏。它是系统级的固定入口,所有macOS版本都会强制显示。苹果既没有提供开关选项,也没有预留终端命令,更不可能在系统偏好设置里让你找到隐藏开关。如果有人声称能用第三方工具或修改系统文件来删除它,千万别相信——结果很可能是系统不

时间:2026-07-02 07:30
Win11切换输入法的几种常用方法和快捷键设置

Win11切换输入法的几种常用方法和快捷键设置

写文档写得正顺,突然要敲几个英文单词,或者打代码时想切回中文拼音——手指条件反射地按下Ctrl+Space,光标却纹丝不动。这种场景你应该不陌生。Windows 11其实准备了五种互不干扰的切换方式,有些连锁屏界面都能响应,关键是你得选对场景来用。下面把这五种路径挨个拆开,看完你就能找到最适合自己的

时间:2026-07-02 07:29
电脑开机黑屏提示未检测到启动盘修复方法

电脑开机黑屏提示未检测到启动盘修复方法

电脑开机直接黑屏,屏幕上孤零零地显示一句“No boot disk has been detected”——别紧张,这并非系统崩溃,也不是常见的蓝屏代码,而是主板在告诉你:“我没有找到硬盘。”换句话说,电脑连BIOS自检阶段都没能通过。 这属于硬件层面的硬中断,与引导损坏、系统文件丢失完全不是一回事

时间:2026-07-02 07:29
Windows 11更改默认音频采样率级别的详细方法

Windows 11更改默认音频采样率级别的详细方法

Windows 11 用户在播放音频时,偶尔会遇到爆音、杂音甚至声音动态被压缩得干瘪的情况。这种问题通常并非硬件损坏,而是系统在音频采样率设定上“擅作主张”了。例如某次系统更新后,默认格式可能被悄然重置为 24 位 192000 Hz——一个不少声卡难以稳定运行的高规格,结果导致 DMA 缓冲溢出、

时间:2026-07-02 07:29
Win11如何查看笔记本实时充电功率

Win11如何查看笔记本实时充电功率

对于笔记本充电功率的实时监测,系统自带的电池图标只能显示“正在充电”或“已充满”,却无法告知具体的瓦数。要获得实时数值,需要绕过默认界面直接读取硬件传感器。这里直接给出结论:最可靠的工具是HWiNFO64,其次是BatteryInfoView,而powercfg只能用于间接验证。无论你遇到插着65W

时间:2026-07-02 07:29
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜