您的位置:首页 > 理论基础 > 数据结构算法

Linux-文件-数据结构

2017-12-16 17:00 197 查看
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_he
4000
ad
* 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;         // 文件系统魔数。 };
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: