栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

fd补充:file和inode的实现

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

fd补充:file和inode的实现

struct file

struct file {
    // ...
    struct path                     f_path;
    struct inode                    *f_inode;
    const struct file_operations    *f_op;

    atomic_long_t                    f_count;
    unsigned int                     f_flags;
    fmode_t                          f_mode;
    struct mutex                     f_pos_lock;
    loff_t                           f_pos;
    struct fown_struct               f_owner;
    // ...
}

它标识一个进程打开的文件,数组内指针所指向的,下面解释相关的几个最重要的字段:
f_path :标识文件名
f_inode :inode 这个是vfs的inode类型,是基于具体文件系统之上的抽象封装;
f_pos :就是当前文件偏移。f_pos 在 open 的时候会设置成默认值,seek 的时候可以更改,从而影响到 write/read 的位置。


ionde

struct file 结构体里面有一个指向 inode 的指针。这个指向inode指针并没有直接指向具体文件,而是操作系统抽象出来的一层虚拟文件系统,叫做 VFS ( Virtual File System ),然后在 VFS 之下才是真正的文件系统,比如 ext4 之类的。

为了避免struct file 处理逻辑的复杂,因为每对接一个具体的文件系统,就要考虑一种实现。所以操作系统必须把底下文件系统屏蔽掉,对外提供统一的 inode概念,对下定义好接口进行回调注册。这样让 inode 的概念得以统一,Unix 一切皆文件的基础就来源于此。


VFS的ionde和特异化“ionde”接口

**VFS层对上层提供统一的inode(vfs_inode)接口,与下层对接的是特异化inode接口,如何通过 vfs提供的inode得到具体文件的inode?

强制地址转换
struct ext4_inode_info {
    // ext4 inode 特色字段
    // ...
    
    // 重要!!!
    struct inode    vfs_inode;  
};
每一个特异的具体的inode结构体中,本身就包含有 vfs_inode,直接通过 vfs inode 结构体的地址强转类型就能得到 ext4_inode_info 结构体。需要考虑的仅是两个结构体之间的地址偏移。

例如:
vfs_inode 的地址为 0xa89be0;
ext4_inode_info 里有个内嵌字段 vfs_inode,类型为 struct inode ,该字段在结构体内偏移为 64 字节;
ext4_inode_info 的地址为 (struct ext4_inode_info *)(0xa89be0 - 64)

分配 inode 的时候,其实分配的是 ext4_inode_info 结构体,包含了 vfs inode,然后对外给出去 vfs_inode 字段的地址即可。VFS 层拿 inode 的地址使用,底下文件系统强转类型后,取外层的 inode 地址使用。

inode 的内存由后端文件系统分配,vfs_inode 结构体内嵌在不同的文件系统的 inode 之中。不同的层(vfs层和具体文件层)用不同的地址,ext4 文件系统用 ext4_inode_info 的结构体的地址,vfs 层用 ext4_inode_info.vfs_inode 字段的地址。


每一个具体的xxxxx_inode都有处于vfs层的成员对象vfs_inode,这是将具体文件统一成vfs_inode放置于vfs层供上层使用的(这就是vfs层的由来)。具体的xxxxx_inode和它所提供的vfs_inode存在一个偏移,通过所提供的vfs_inode并补偿偏移来访问具体的xxxxx_inode。这里每个vfs_inode只能对应一个xxxxx_inode,但多个vfs_inode指向同一个xxxxx_inode。这是因为先创建的xxxxx_inode,再创建的vfs_inode。

思考问题:怎么理解 fs inode 和 ext2_inode_info,ext4_inode_info 等结构体的区别?
所有文件系统共性的东西抽象到 vfs inode ,不同文件系统差异的东西放在各自的 inode 结构体中。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/972696.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号