34 | 块设备(上):如何建立代理商销售模式?
刘超
该思维导图由 AI 生成,仅供参考
上一章,我们解析了文件系统,最后讲文件系统读写的流程到达底层的时候,没有更深入地分析下去,这是因为文件系统再往下就是硬盘设备了。上两节,我们解析了字符设备的 mknod、打开和读写流程。那这一节我们就来讲块设备的 mknod、打开流程,以及文件系统和下层的硬盘设备的读写流程。
块设备一般会被格式化为文件系统,但是,下面的讲述中,你可能会有一点困惑。你会看到各种各样的 dentry 和 inode。块设备涉及三种文件系统,所以你看到的这些 dentry 和 inode 可能都不是一回事儿,请注意分辨。
块设备需要 mknod 吗?对于启动盘,你可能觉得,启动了就在那里了。可是如果我们要插进一块新的 USB 盘,还是要有这个操作的。
mknod 还是会创建在 /dev 路径下面,这一点和字符设备一样。/dev 路径下面是 devtmpfs 文件系统。这是块设备遇到的第一个文件系统。我们会为这个块设备文件,分配一个特殊的 inode,这一点和字符设备也是一样的。只不过字符设备走 S_ISCHR 这个分支,对应 inode 的 file_operations 是 def_chr_fops;而块设备走 S_ISBLK 这个分支,对应的 inode 的 file_operations 是 def_blk_fops。这里要注意,inode 里面的 i_rdev 被设置成了块设备的设备号 dev_t,这个我们后面会用到,你先记住有这么一回事儿。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入剖析了文件系统中块设备的底层实现,包括块设备的存在原因、操作流程以及与文件系统的关联。文章首先介绍了块设备的mknod和打开流程,以及文件系统和底层硬盘设备的读写流程。块设备一般会被格式化为文件系统,在这个过程中涉及到各种dentry和inode。此外,文章还讨论了块设备的特殊inode和默认file_operations,以及块设备文件的挂载和与文件系统的关联。通过对blkdev_get_by_path和bd_acquire等函数的作用,以及bdev伪文件系统的初始化和使用的解析,读者可以深入了解文件系统中块设备的存在和操作流程。文章还详细介绍了block_device、gendisk和hd_struct等结构的复杂关系,以及在打开设备文件时的代码实现。总体而言,本文对文件系统中块设备的底层实现进行了深入剖析,为读者提供了全面的技术视角。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《趣谈 Linux 操作系统》,新⼈⾸单¥68
《趣谈 Linux 操作系统》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(13)
- 最新
- 精选
- Spring读完这篇文章,我感觉用三个文件系统主要是为了解耦和可扩展。首先是open一个块设备,涉及两个文件系统:devtmpfs和伪文件系统bdev。通过devtmpfs中的设备号dev_t在伪文件系统bdev中找到block_device,然后打开,打开后再将block_device设置到主流文件系统的super_block中。设置到主流文件系统的super_block后,我们就可以通过主流文件系统(如ext4)的file_operations对块设备进行操作了。由于主流文件系统有很多,而且未来可能退出新的,写操作系统内核时不可能每次都针对新的文件系统进行更改,因此devtmpfs和伪文件系统只是为了获取和打开block_device,最终对block_device进行读写是交给主流文件系统的。
作者回复: 是的
2019-06-23229 - djfhchdhvoid init_special_inode(struct inode *inode, umode_t mode, dev_t rdev) { inode->i_mode = mode; if (S_ISCHR(mode)) { inode->i_fop = &def_chr_fops; inode->i_rdev = rdev; } else if (S_ISBLK(mode)) { inode->i_fop = &def_blk_fops; inode->i_rdev = rdev; } else if (S_ISFIFO(mode)) inode->i_fop = &pipefifo_fops; else if (S_ISSOCK(mode)) ; /* leave it no_open_fops */ } 从这段代码可以看出,/dev/xxx设备文件对应的特殊inode还可以表示FIFO、SOCK
作者回复: 是的
2019-06-226 - 小龙的城堡能解释下为什么打开一个块设备需要3个文件系统配合?为什么不是两个,也不是4个?感觉一堆代码分析,越来越晕了。
作者回复: 每一个都有自己的用处呀,一切接文件,所以为了管理方便,所有想对外暴露管理接口的,文件都是首选的方式。
2019-06-143 - 安排如果block_device是指向某个分区的,我们要先找到hd_struct,然后根据hd_struct找到对应整个设备的gendisk,这里是怎么根据hd_struct找到对应整个设备的gendisk的啊?
作者回复: 有指针
2019-06-1422 - 安排bdev这个文件系统的内容是不会持久化到磁盘的,既然这样,那么为什么要组织成文件系统的形式呢? 对内存中的文件系统不太了解,下面是我的理解,希望老师给予指正: bdev里面由各种数据结构组成,例如链表、树之类的。这些结构和通常的文件系统用的那些数据结构相同,而且组织成了和通常的文件系统类似的形式,所以这里就把bdev代表的这一对数据结构组成的东西叫做文件系统。 如果把bdev组织成和通常的文件系统大不相同的形式,是不是也可以完成本文中的功能?那么这时候就不把bdev叫做文件系统了,而它就是一堆普通的数据结构。
作者回复: 一切皆文件
2019-06-141 - 一笔一画为什么查找ext4fs文件系统的内容需要devtmps来管理,感觉设计不太合理?
作者回复: 一切皆文件,管理它也需要文件
2019-06-16 - 皮皮侠回答老师问题:还可以表示网络socket和管道2020-11-071
- 小庄.Jerry格式化的时候不会设置superblock吗2019-11-141
- Geek_ae11ce最后这张图,尤其里边带了文字步骤,棒2023-07-18归属地:北京
- Damoncui没有课代表可让我怎么活啊~2022-12-13归属地:北京
收起评论