image.png
- 所有的块设备都在 bdev_map 中的维护,它是一个devt和gendisk的映射关系
gendisk: gen 的意思是 general 通用的意思,也就是说,所有的块设备,不仅仅是硬盘 disk,都会用一个 gendisk 来表示
- 所有的block_device 表示的设备都在bdev的文件系统中维护着inode节点
bdev 伪文件系统
block_device 结构如下struct block_device { dev_t bd_dev; /* not a kdev_t - it's a search key */ int bd_openers; struct super_block * bd_super; ...... struct block_device * bd_contains; unsigned bd_block_size; struct hd_struct * bd_part; unsigned bd_part_count; int bd_invalidated; struct gendisk * bd_disk; struct request_queue * bd_queue; struct backing_dev_info *bd_bdi; struct list_head bd_list; ...... } ;
gendisk 指向该块设备的gendisk ,他们是一对多的关系,比如开一个硬盘被分成两个分区,那么block_device 会有三个,一个总的两个分的,request_queue 处理请求的队列,hd_struct 指各个分区,db_contains 指向总的块的block_device
image.png
- mknod 创建出来的块设备文件在 devtemfs 文件系统里面,特殊 inode 里面有块设备号;
- mount 一个块设备上的文件系统,调用这个文件系统的 mount 接口;
- 通过按照 /dev/xxx 在文件系统 devtmpfs 文件系统上搜索到特殊 inode,得到块设备号;
- 根据特殊 inode 里面的 dev_t 在 bdev 文件系统里面找到 inode;
- 根据 bdev 文件系统上的 inode 找到对应的 block_device,根据 dev_t 在 map 中找到 gendisk,将两者关联起来;
- 找到 block_device 后打开设备,调用和 block_device 关联的 gendisk 里面的 block_device_operations 打开设备;
- 创建被 mount 的文件系统的 super_block。
网友评论