文件系统

    文件系统的结构


    超级块的数据结构是:

struct super_block {
	unsigned short s_ninodes;
	unsigned short s_nzones;
	unsigned short s_imap_blocks;
	unsigned short s_zmap_blocks;
	unsigned short s_firstdatazone;
	unsigned short s_log_zone_size;
	unsigned long s_max_size;
	unsigned short s_magic;
/* These are only in memory */
	struct buffer_head * s_imap[8];
	struct buffer_head * s_zmap[8];
	unsigned short s_dev;
	struct m_inode * s_isup;
	struct m_inode * s_imount;
	unsigned long s_time;
	struct task_struct * s_wait;
	unsigned char s_lock;
	unsigned char s_rd_only;
	unsigned char s_dirt;
};


    其中s_imap[8]指向了i节点位图的buffer_head结构。buffer_head里面的b_data指向了真正的i节点位图数据。

    其中s_zmap[8]指向了逻辑块位图的buffer_head结构。buffer_head里面的b_data指向了真正的逻辑块位图数据。

    i节点的第一个数据块,共1024个字节,1024再除以如下inode数据结构的大小,就可以知道每个数据块中inode节点的个数。第一个inode节点就是根节点,也就是/。

    

    inode的数据结构(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;
};

    dir_entry的数据结构(目录项):

struct dir_entry {
	unsigned short inode;
	char name[NAME_LEN];
};


    例如获取/bin/sh的最终代码。

    1、首先根据根节点i_zone[9],也就是数据块的块号,读取对应的数据块到缓冲区,此时缓冲区的数据,就是多个目录项结构。根据bin和dir_entry里面的name对比,找到对应的目录项。

    2、再根据dir_entry里面的inode,也就是i节点的块号,找到bin的i节点。

    3、再根据bin的i节点i_zone[9],也就是数据块的块号,读取对应的数据块到缓冲区,此时缓冲区的数据,就是多个目录项结构。根据sh和dir_entry里面的name对比,找到对应的目录项。

    4、再根据dir_entry里面的inode,也就是i节点的块号,找到sh的i节点。

    5、sh的i节点i_zone[9],对应的是真实代码的块号,而不再是目录项的集合。

你可能感兴趣的:(文件系统)