Chinaunix首页 | 论坛 | 博客
  • 博客访问: 232367
  • 博文数量: 27
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 213
  • 用 户 组: 普通用户
  • 注册时间: 2015-06-10 22:38
文章分类

全部博文(27)

文章存档

2016年(1)

2015年(26)

分类: LINUX

2015-06-21 00:01:58

一直对这几个结构体的概念很模糊,最近终于通过查各种资料搞明白了,现解释如下:
inode:文件系统中最重要的一个结构体,用来描述一个具体的文件,当表示设备文件时,最关键的字段是描述设备号的i_rdev;一个文件只有一个inode。
block_device:是bdevfs伪文件系统层的一个概念,用来抽象一个块设备,在bdevfs中与inode一一对应,被放置在一个结构体中,也就是bdev_inode。
注意:如果块设备进行分区,那么每个分区都对应一个block_device,因为每个分区有自己的设备号,有独立的inode,而inode与                block_device是一一对应的。
bdev_inode:用来管理block_device和相关的inode,其结构如下:

点击(此处)折叠或打开

  1. struct bdev_inode {
  2.     struct block_device bdev;
  3.     struct inode vfs_inode;
  4. };
所以根据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。

如有错误,欢迎批评指正


阅读(4350) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~