[索引节点]
索引节点(也称i节点)分两种:一个是磁盘上的索引节点,它描述了文件的全部信息;一个是内存中的索引节点信息,它除了包好磁盘中的索引节点的数据外,还包括一些额外的和内存、进程相关的字段。
索引节点描述了一个文件的布局,索引节点以静态形式存于磁盘上,内核把它们读到内存索引节点表以便操作它们。磁盘上的索引节点由如下字段组成:文件所有者标识号、所有者在的用户组标识号、文件类型、文件存取权限、文件存取时间、指向文件的链接数、文件数据的磁盘地址明细表、文件大小。也就是说,文件的索引节点描述了文件的一切信息。
内存中的索引节点额外包括的字段有:内存索引节点的状态、含有该文件的文件系统的逻辑设备号、索引节点号、指向其它内存索引节点的指针、应用数。
索引节点与文件数据有区别的,当对文件进行读写时,改变的是文件数据,但文件的索引节点信息并没有改变。但当改变文件的所有者,改变文件的访问权限时,会使得文件的索引节点信息发生变化,但没有改变文件数据。
[磁盘上的索引节点和内存中的索引节点]
磁盘上的索引节点和内存中的索引节点在0.11中的数据结构分别如下,从代码上可以很明显看到它们之间的差别
/*磁盘上的i节点的数据结构描述*/
struct d_inode {
unsigned short i_mode;
unsigned short i_uid;
unsigned long i_size;
unsigned long i_time;
unsigned char i_gid;
unsigned char i_nlinks;
unsigned short i_zone[9];
};
/*
内存中的i节点的数据结构描述
*/
struct m_inode {
unsigned short i_mode;
unsigned short i_uid;
unsigned long i_size;
unsigned long i_mtime;
unsigned char i_gid;
unsigned char i_nlinks;
unsigned short i_zone[9];
/* these are in memory also */
struct task_struct * i_wait;
unsigned long i_atime;
unsigned long i_ctime;
unsigned short i_dev;
unsigned short i_num;
unsigned short i_count;
unsigned char i_lock;
unsigned char i_dirt;
unsigned char i_pipe;
unsigned char i_mount;
unsigned char i_seek;
unsigned char i_update;
};
i_mode表示文件的访问权限,i_uid表示文件所有者的用户id,i_size表示文件的大小,i_mtime文件的修改时间,i_gid文件所有者的组id,i_nlinks链接数,i_zone逻辑块号数组,i_wait等待在此i节点上的进程,i_atime最后访问时间,i_ctime为i节点创建时间,i_dev为i节点所在的设备号,i_num为i节点号,i_count为i节点被引用次数,i_lock是否加锁标志,i_dirti节点数据是否修改标志,i_pipe管道标志,i_mount安装标志,i_seek搜寻标志,i_update更新标志