struct buffer_head {
char * b_data; /* pointer to data block (1024bytes) */ //指针。
unsigned long b_blocknr; /* block number */ // 块号。
unsigned short b_dev; /* device (0 = free) */ // 数据源的设备号。
unsigned char b_uptodate; // 更新标志:表示数据是否已更新。
unsigned char b_dirt; //修改标志:0 未修改,1 已修改.
unsigned char b_count; // 使用的用户数。
unsigned char b_lock; // 缓冲区是否被锁定。
struct task_struct * b_wait; // 指向等待该缓冲区解锁的任务。
struct buffer_head * b_prev; // hash 队列上前一块(这四个指针用于缓冲区的管理)。
struct buffer_head * b_next; // hash 队列上下一块。
struct buffer_head * b_prev_free; // 空闲表上前一块。
struct buffer_head * b_next_free; // 空闲表上下一块。
};
// 磁盘上的索引节点(i 节点)数据结构。
struct d_inode {
unsigned shorti_mode; // 文件类型和属性(rwx 位)。
unsigned shorti_uid; // 用户id(文件拥有者标识符)。
unsigned longi_size; // 文件大小(字节数)。
unsigned longi_time; // 修改时间(自1970.1.1:0 算起,秒)。
unsigned chari_gid; // 组id(文件拥有者所在的组)。
unsigned chari_nlinks; // 链接数(多少个文件目录项指向该i 节点)。
unsigned shorti_zone[9]; // 直接(0-6)、间接(7)或双重间接(8)逻辑块号。
// zone 是区的意思,可译成区段,或逻辑块。
91 };
// 这是在内存中的i 节点结构。前7 项与d_inode 完全一样。
struct m_inode {
unsigned shorti_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)逻辑块号。
structtask_struct * i_wait; // 等待该i 节点的进程。
unsigned longi_atime; // 最后访问时间。
unsigned longi_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; // 更新标志。
};
// 文件结构(用于在文件句柄与i 节点之间建立关系)
struct file {
unsigned shortf_mode; // 文件操作模式(RW 位)
unsigned shortf_flags; // 文件打开和控制的标志。
unsigned shortf_count; // 对应文件句柄(文件描述符)数。
struct m_inode *f_inode; // 指向对应i 节点。
off_t f_pos; // 文件位置(读写偏移值)。
};
// 内存中磁盘超级块结构。
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; // 文件系统魔数。
struct buffer_head * s_imap[8]; // i 节点位图缓冲块指针数组(占用8 块,可表示64M)。
structbuffer_head * s_zmap[8]; // 逻辑块位图缓冲块指针数组(占用8 块)。
unsigned shorts_dev; //超级块所在的设备号。
struct m_inode *s_isup; // 被安装的文件系统根目录的i 节点。
struct m_inode *s_imount; // 被安装到的i 节点。
unsigned longs_time; // 修改时间。
structtask_struct * s_wait; // 等待该超级块的进程。
unsigned chars_lock; // 被锁定标志。
unsigned chars_rd_only; // 只读标志。
unsigned char s_dirt; // 已修改(脏)标志。
};
// 磁盘上超级块结构。上面125-132 行完全一样。
structd_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; // 文件系统魔数。
};
// 文件目录项结构。
struct dir_entry{
unsigned shortinode; // i 节点。
charname[NAME_LEN]; // 文件名。
};