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; // 文件系统魔数。
};