Linux-文件-数据结构

Linux内核使用文件结构file和文件表file_talbe[]来管理对文件的操作访问。

文件数据结构如下所示:

    // 文件结构(用于在文件句柄与i节点之间建立关系)

 struct file {

         unsigned shortf_mode;        // 文件操作模式(RW位)

         unsigned shortf_flags;       // 文件打开和控制的标志。

         unsigned shortf_count;       // 对应文件引用计数值。

         struct m_inode * f_inode;     // 指向对应i节点。

         off_t f_pos;                 // 文件位置(读写偏移值)。

 };


    // 这是在内存中的i节点结构。前7项与d_inode完全一样。

 struct m_inode {

         unsigned short i_mode;        // 文件类型和属性(rwx)

         unsigned shorti_uid;         // 用户id(文件拥有者标识符)。

         unsigned longi_size;         // 文件大小(字节数)。

         unsigned longi_mtime;        // 修改时间(自1970.1.1:0算起,秒)。

         unsigned chari_gid;          // id(文件拥有者所在的组)

         unsigned chari_nlinks;       // 文件目录项链接数。

         unsigned shorti_zone[9];     // 直接(0-6)、间接(7)或双重间接(8)逻辑块号。

 /* these are in memory also */

         struct task_struct * i_wait;  // 等待该i节点的进程。

         struct task_struct * i_wait2;   /* forpipes */

         unsigned longi_atime;        // 最后访问时间。

        unsigned long i_ctime;       // i节点自身修改时间。

         unsigned shorti_dev;         // i节点所在的设备号。

         unsigned shorti_num;         // i节点号。

        unsigned shorti_count;       // i节点被使用的次数,0表示该i节点空闲。

         unsigned chari_lock;         // 锁定标志。

         unsigned chari_dirt;         // 已修改()标志。

         unsigned chari_pipe;         // 管道标志。

         unsigned chari_mount;        // 安装标志。

         unsigned chari_seek;         // 搜寻标志(lseek)

         unsigned chari_update;       // 更新标志。

 };



超级块是存储对应文件系统元数据的结构,存储的元数据包括包括文件系统大小,块大小,
以及空闲及已使用的块的数量inode表的大学及位置等消息.

    // 内存中磁盘超级块结构。

struct super_block {

         unsigned shorts_ninodes;       // 节点数。

         unsigned shorts_nzones;        // 逻辑块数。

         unsigned shorts_imap_blocks;   // i节点位图所占用的数据块数。

         unsigned shorts_zmap_blocks;   // 逻辑块位图所占用的数据块数。

         unsigned shorts_firstdatazone; // 第一个数据逻辑块号。

         unsigned shorts_log_zone_size; // log(数据块数/逻辑块)。(以2为底)。

         unsigned longs_max_size;       // 文件最大长度。

         unsigned shorts_magic;         // 文件系统魔数。

/* These are only in memory */

         struct buffer_head * s_imap[8]; // i节点位图缓冲块指针数组(占用8块,可表示64M)

         struct buffer_head * s_zmap[8]; // 逻辑块位图缓冲块指针数组(占用8块)。

         unsigned shorts_dev;           // 超级块所在的设备号。

         struct m_inode * s_isup;       // 被安装的文件系统根目录的i节点。(isup-superi)

         struct m_inode * s_imount;     // 被安装到的i节点。

         unsigned long s_time;          // 修改时间。

         struct task_struct * s_wait;    // 等待该超级块的进程。

         unsigned chars_lock;           // 被锁定标志。

         unsigned chars_rd_only;        // 只读标志。

         unsigned chars_dirt;           // 已修改()标志。

};

    // 磁盘上超级块结构。上面125-132行完全一样。

struct d_super_block {

        unsigned shorts_ninodes;       // 节点数。

         unsigned shorts_nzones;        // 逻辑块数。

         unsigned shorts_imap_blocks;   // i节点位图所占用的数据块数。

         unsigned short s_zmap_blocks;  // 逻辑块位图所占用的数据块数。

         unsigned shorts_firstdatazone; // 第一个数据逻辑块。

        unsigned shorts_log_zone_size; // log(数据块数/逻辑块)。(以2为底)。

         unsigned longs_max_size;       // 文件最大长度。

         unsigned shorts_magic;         // 文件系统魔数。

};

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值