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" />
最后的部分
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文件系统内部结构的基本情况的。
VFS的dentry对象其实在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现有的基础上不断深入的做下去,相信有一天我们也会为祖国的操作系统事业贡献一份微薄之力的!