struct dentry_operations { int (*d_compare)(struct dentry *, struct qstr *, struct qstr *); int (*d_delete)(struct dentry *); int (*d_release)(struct dentry *); }; 这里 d_delete 是指向具" name="description" />

Newt文件系统的VFS分析(8)

发表于:2007-06-08来源:作者:点击数: 标签:
最后的部分 MI LY: 宋体; mso-bidi-font-size: 10.5pt"> struct dentry_operations { int (*d_compare)(struct dentry *, struct qstr *, struct qstr *); int (*d_delete)(struct dentry *); int (*d_release)(struct dentry *); }; 这里 d_delete 是指向具

最后的部分

MILY: 宋体; mso-bidi-font-size: 10.5pt">struct dentry_operations {

    int (*d_compare)(struct dentry *, struct qstr *, struct qstr *);

    int (*d_delete)(struct dentry *);

    int (*d_release)(struct dentry *);

};

    这里d_delete是指向具体文件系统的“删除文件”操作的入口函数,d_release则用于“关闭文件”操作。d_compare用于文件名的比对。为什么这里还要为它创建一个函数指针呢?因为有的文件系统中文件名的长度限于8个字符,有的则可以有255个字符;有的文件系统允许文件名里有特殊符号,有的则不允许;有的支持汉字,有的则不支持。所以,这么做还是很有必要的。

    struct super_block *d_sb;       /* The root of the dentry tree */

    d_sb指针指向其所在设备的超级块的super_block数据结构。

虽然我们还没有具体分析VFS的代码,但我们还是可以通过图6看到Newt文件系统内部结构的基本情况的。

VFSdentry对象其实在Ext2文件系统的磁盘上有其对应物,即ext2_dir_dentry_2,只不过它们有很大的不同。它是在ext2_fs.h中定义的:

#define EXT2_NAME_LEN 255

struct ext2_dir_entry_2 {

       __u32     inode;                    /* Inode number */

       __u16     rec_len;          /* Directory entry length */

       __u8       name_len;              /* Name length */

       __u8       file_type;

       char name[EXT2_NAME_LEN];   /* File name */

};

文件名(不包括路径部分)的最大长度为255个字符。

file_type表示文件的类型,目前已经定义的文件类型为:

/*

 * Ext2 directory file types.  Only the low 3 bits are used.  The

 * other bits are reserved for now.

 */

#define EXT2_FT_UNKNOWN           0

#define EXT2_FT_REG_FILE          1

#define EXT2_FT_DIR                 2

#define EXT2_FT_CHRDEV            3

#define EXT2_FT_BLKDEV               4

#define EXT2_FT_FIFO                  5

#define EXT2_FT_SOCK                 6

#define EXT2_FT_SYMLINK             7

#define EXT2_FT_MAX                  8

    ext2_dir_entry_2结构是变长的,其中rec_len字段说明了这个数据结构实际的长度。这么做完全是为了不浪费空间,因此,数据结构中可变的部分(name)必须放到最后。

    至此,VFS中主要的对象模型就介绍完了,这也是VFS实现的核心数据结构。Newt文件系统的设计正是抓住了问题的主要矛盾,忽略一些不必要的“繁枝冗节”。因此,我们掌握了这些知识不仅能理解现代操作系统的先进技术,而且也为教学研究实践了改革之路。如果能在Newt现有的基础上不断深入的做下去,相信有一天我们也会为祖国的操作系统事业贡献一份微薄之力的!

原文转自:http://www.ltesting.net