一直对这几个结构体的概念很模糊,最近终于通过查各种资料搞明白了,现解释如下:
inode:文件系统中最重要的一个结构体,用来描述一个具体的文件,当表示设备文件时,最关键的字段是描述设备号的i_rdev;一个文件只有一个inode。
block_device:是bdevfs伪文件系统层的一个概念,用来抽象一个块设备,在
bdevfs中与inode一一对应,被放置在一个结构体中,也就是bdev_inode。
注意:如果块设备进行分区,那么每个分区都对应一个block_device,因为每个分区有自己的设备号,有独立的inode,而inode与 block_device是一一对应的。
bdev_inode:用来管理block_device和相关的inode,其结构如下:
-
struct bdev_inode {
-
struct block_device bdev;
-
struct inode vfs_inode;
-
};
所以根据inode的指针很容易找到block_device,在内核中这个操作是通过
BDEV_I完成的。
dentry:用来描述目录项(目录和文件统称为目录项)信息,存储name和inode信息。由于一个文件可能有多个别名,所以一个文件可能对应多个dentry。
gendisk:通用块层中用于描述一个完整的底层设备,比如一个底层设备有多个分区,但它只对应一个gendisk。
hd_struct: 用于描述分区信息,一个块设备如果没有进行分区,那它默认只有一个分区,也就是说一个gendisk至少对应一个hd_struct。
那是如何通过文件系统层的
block_device找到
底层的gendisk的呢?二者是什么时候建立关联的呢?
其实在注册块设备的时候,就已经完成了block_device与gendisk的关联,具体的调用关系如下:
add_disk()->register_disk()->blkdev_get()->__blkdev_get()
在
__blkdev_get()中完成了指向关系:bdev->bd_disk = disk。
当然在
blkdev_get()调用之前,需要先调用bdget_disk()分配一个block_device。
如有错误,欢迎批评指正
阅读(4304) | 评论(0) | 转发(0) |