分享
 
 
 

内存中inode与磁盘中inode

王朝other·作者佚名  2006-04-20
窄屏简体版  字體: |||超大  

作者:不详

来源:http://www.i170.com/user/grip2/Article_8613

在容易引起混淆的地方我将把把内存中的inode结构称为VFS inode,而文件

系统以EXT2为代表,把Ext2 inode作为磁盘上的inode代表。

首先需要分别对内存中的inode与磁盘上的inode做一下简单的描述:

<内存中的inode结构:>

VFS inode包含文件访问权限、属主、组、大小、生成时间、访问时间、

最后修改时间等信息。它是linux管理文件系统的最基本单位,也是文件系

统连接任何子目录、文件的桥梁。inode结构中的静态信息取自物理设备上

的文件系统,由文件系统指定的函数填写,它只存在于内存中,可以通过

inode缓存访问。虽然每个文件都有相应的inode结点,但是只有在需要的时

候系统才会在内存中为其建立相应的inode数据结构,建立的inode结构将形

成一个链表,我们可以通过遍历这个链表去得到我们需要的文件结点,VFS也

为已分配的inode构造缓存和hash table,以提高系统性能。inode结构中的

struct inode_operations *iop为我们提供了一个inode操作列表,通过这个

列表提供的函数我们可以对VFS inode结点进行各种操作。每个inode结构都

有一个i结点号i_ino,在同一个文件系统中每个i结点号是唯一的。

<磁盘上的inode:>

EXT2通过使用inode来定义文件系统的结构以及描述系统中每个文件的

管理信息,每个文件都有一个inode且只有一个,即使文件中没有数据,其

索引结点也是存在的。每个文件用一个单独的Ext2 inode结构来描述,而且

每一个inode都有唯一的标志号。Ext2 inode为内存中的inode结构提供了文

件的基本信息,随着内存中inode结构的变化,系统也将更新Ext2 inode中

相应的内容。Ext2 inode对应的是Ext2_inode结构。

从上面的描述,我们可以对内存中inode与磁盘中inode做出比较:

位置:VFS inode结构位于内存中,而Ext2_inode位于磁盘。

生存期:VFS inode在需要时才会被建立,如果系统断电,此结构也随之消失。

而Ext2_inode的存在与系统是否上电无关,而且无论文件是否包含

数据,Ext2_inode都是存在的。

唯一性:两者在自己的作用域中都是唯一的。

关系:VFS inode是Ext2 inode的抽象、映射与扩充,而后者是前者的静态

信息部分,也是对前者的具体化、实例化和持久化。

操作:对VFS inode的操作具有通用性,对文件系统inode的操作则是文件系

统相关的,依赖于特定的实现。

组织管理:系统通过VFS inode链表来对其进行组织,并且为了提高访问效率

相应地构造了inode构造缓存和hash table。

Ext2 inode的信息位于EXT2文件系统的划分的块组中,在每个块组

中包含相应的inode位图、inode表指定具体的inode信息,每个

inode对应Ext2_inode结构。

上面是从原理上对内存中inode与磁盘中inode进行比较,实际上在代码上也体

现出它们的不同。在下面我把在内核中两者对应的结构代码贴出来,虽然长了

一些,但是对进一步的比较还是很有好处。

struct inode {

struct list_headi_hash;

struct list_headi_list;

struct list_headi_dentry;

struct list_headi_dirty_buffers;

unsigned longi_ino;

atomic_ti_count;

kdev_ti_dev;

umode_ti_mode;

nlink_ti_nlink;

uid_ti_uid;

gid_ti_gid;

kdev_ti_rdev;

loff_ti_size;

time_ti_atime;

time_ti_mtime;

time_ti_ctime;

unsigned longi_blksize;

unsigned longi_blocks;

unsigned longi_version;

unsigned shorti_bytes;

struct semaphorei_sem;

struct rw_semaphorei_truncate_sem;

struct semaphorei_zombie;

struct inode_operations*i_op;

struct file_operations*i_fop;/* former ->i_op->default_file_ops */

struct super_block*i_sb;

wait_queue_head_ti_wait;

struct file_lock*i_flock;

struct address_space*i_mapping;

struct address_spacei_data;

struct dquot*i_dquot[MAXQUOTAS];

/* These three should probably be a union */

struct pipe_inode_info*i_pipe;

struct block_device*i_bdev;

struct char_device*i_cdev;

unsigned longi_dnotify_mask; /* Directory notify events */

struct dnotify_struct*i_dnotify; /* for directory notifications */

unsigned longi_state;

unsigned inti_flags;

unsigned chari_sock;

atomic_ti_writecount;

unsigned inti_attr_flags;

__u32i_generation;

union {

struct minix_inode_infominix_i;

struct ext2_inode_infoext2_i;

struct ext3_inode_infoext3_i;

struct hpfs_inode_infohpfs_i;

struct ntfs_inode_infontfs_i;

struct msdos_inode_infomsdos_i;

struct umsdos_inode_infoumsdos_i;

struct iso_inode_infoisofs_i;

struct sysv_inode_infosysv_i;

struct affs_inode_infoaffs_i;

struct ufs_inode_infoufs_i;

struct efs_inode_infoefs_i;

struct romfs_inode_inforomfs_i;

struct shmem_inode_infoshmem_i;

struct coda_inode_infocoda_i;

struct smb_inode_infosmbfs_i;

struct hfs_inode_infohfs_i;

struct adfs_inode_infoadfs_i;

struct qnx4_inode_infoqnx4_i;

struct reiserfs_inode_inforeiserfs_i;

struct bfs_inode_infobfs_i;

struct udf_inode_infoudf_i;

struct ncp_inode_infoncpfs_i;

struct proc_inode_infoproc_i;

struct socketsocket_i;

struct usbdev_inode_info usbdev_i;

struct jffs2_inode_infojffs2_i;

void*generic_ip;

} u;

};

struct ext2_inode {

__u16i_mode;/* File mode */

__u16i_uid;/* Low 16 bits of Owner Uid */

__u32i_size;/* Size in bytes */

__u32i_atime;/* Access time */

__u32i_ctime;/* Creation time */

__u32i_mtime;/* Modification time */

__u32i_dtime;/* Deletion Time */

__u16i_gid;/* Low 16 bits of Group Id */

__u16i_links_count;/* Links count */

__u32i_blocks;/* Blocks count */

__u32i_flags;/* File flags */

union {

struct {

__u32 l_i_reserved1;

} linux1;

struct {

__u32 h_i_translator;

} hurd1;

struct {

__u32 m_i_reserved1;

} masix1;

} osd1;/* OS dependent 1 */

__u32i_block[EXT2_N_BLOCKS];/* Pointers to blocks */

__u32i_generation;/* File version (for NFS) */

__u32i_file_acl;/* File ACL */

__u32i_dir_acl;/* Directory ACL */

__u32i_faddr;/* Fragment address */

union {

struct {

__u8l_i_frag;/* Fragment number */

__u8l_i_fsize;/* Fragment size */

__u16i_pad1;

__u16l_i_uid_high;/* these 2 fields */

__u16l_i_gid_high;/* were reserved2[0] */

__u32l_i_reserved2;

} linux2;

struct {

__u8h_i_frag;/* Fragment number */

__u8h_i_fsize;/* Fragment size */

__u16h_i_mode_high;

__u16h_i_uid_high;

__u16h_i_gid_high;

__u32h_i_author;

} hurd2;

struct {

__u8m_i_frag;/* Fragment number */

__u8m_i_fsize;/* Fragment size */

__u16m_pad1;

__u32m_i_reserved2[2];

} masix2;

} osd2;/* OS dependent 2 */

};

从结构的定义中可以看出来inode(VFS inode)与ext2_inode的差别是很大的,怎么说呢,

除了相同的都是不同。它们都包含动态信息和静态信息,通过union指定的内容那一定

是动态的了。inode结构中的union u实际上反映了VFS支持的文件系统。

可以看出inode结构与ext2_inode结构有些内容是相似的,如inode定义的

unsigned longi_ino;

umode_ti_mode;

nlink_ti_nlink;

uid_ti_uid;

gid_ti_gid;

loff_ti_size;

time_ti_atime;

time_ti_mtime;

time_ti_ctime;

unsigned longi_blksize;

unsigned longi_blocks;

和ext2_inode定义的定义部分

__u16i_mode;/* File mode */

__u16i_uid;/* Low 16 bits of Owner Uid */

__u32i_size;/* Size in bytes */

__u32i_atime;/* Access time */

__u32i_ctime;/* Creation time */

__u32i_mtime;/* Modification time */

__u32i_dtime;/* Deletion Time */

__u16i_gid;/* Low 16 bits of Group Id */

__u16i_links_count;/* Links count */

__u32i_blocks;/* Blocks count */

__u32i_flags;/* File flags */

这些都可以对应上,当然还有一些不同的地方,如inode中定义的

kdev_ti_rdev;

kdev_ti_dev;

kdev_ti_dev;

unsigned shorti_bytes;

struct semaphorei_sem;

在ext2_inode中没有体现,不过这部分对ext2_inode是没有用途而且无法确定的。

类似的,可以推广到两个结构的其余部分,最终在代码中的区别还是与原理中分析的

区别相关的,也是原理的具体体现。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有