趣谈 Linux 操作系统
刘超
前网易杭州研究院云计算技术部首席架构师
85459 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 72 讲
趣谈 Linux 操作系统
15
15
1.0x
00:00/00:00
登录|注册

34 | 块设备(上):如何建立代理商销售模式?

sd_open
sd_fops
bd_part
bd_contains
bd_queue
bd_disk
表示分区
分区信息
描述整个设备
blockdev_superblock
bdget函数
mount_bdev
ext4_mount
基于主流文件系统进行文件读写
将块设备文件挂载到文件夹下
调用blkdev_get打开块设备
def_blk_fops
devtmpfs文件系统
创建在/dev路径下
硬盘设备
文件系统
Linux中的“一切皆文件”概念
特殊的inode的作用
块设备的管理和关联
block_device的重要性
文件系统的作用
块设备的复杂性
block_device_operations
block_device结构
hd_struct结构
gendisk结构
bdev伪文件系统
ext4文件系统
mount操作
blkdev_open操作
特殊inode的默认file_operations
mknod操作
块设备的存在
课堂练习
总结
块设备的创建和打开流程
块设备
Linux块设备知识关系脑图

该思维导图由 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
立即购买
登录 后留言

全部留言(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-23
    2
    29
  • djfhchdh
    void 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-22
    6
  • 小龙的城堡
    能解释下为什么打开一个块设备需要3个文件系统配合?为什么不是两个,也不是4个?感觉一堆代码分析,越来越晕了。

    作者回复: 每一个都有自己的用处呀,一切接文件,所以为了管理方便,所有想对外暴露管理接口的,文件都是首选的方式。

    2019-06-14
    3
  • 安排
    如果block_device是指向某个分区的,我们要先找到hd_struct,然后根据hd_struct找到对应整个设备的gendisk,这里是怎么根据hd_struct找到对应整个设备的gendisk的啊?

    作者回复: 有指针

    2019-06-14
    2
    2
  • 安排
    bdev这个文件系统的内容是不会持久化到磁盘的,既然这样,那么为什么要组织成文件系统的形式呢? 对内存中的文件系统不太了解,下面是我的理解,希望老师给予指正: bdev里面由各种数据结构组成,例如链表、树之类的。这些结构和通常的文件系统用的那些数据结构相同,而且组织成了和通常的文件系统类似的形式,所以这里就把bdev代表的这一对数据结构组成的东西叫做文件系统。 如果把bdev组织成和通常的文件系统大不相同的形式,是不是也可以完成本文中的功能?那么这时候就不把bdev叫做文件系统了,而它就是一堆普通的数据结构。

    作者回复: 一切皆文件

    2019-06-14
    1
  • 一笔一画
    为什么查找ext4fs文件系统的内容需要devtmps来管理,感觉设计不太合理?

    作者回复: 一切皆文件,管理它也需要文件

    2019-06-16
  • 皮皮侠
    回答老师问题:还可以表示网络socket和管道
    2020-11-07
    1
  • 小庄.Jerry
    格式化的时候不会设置superblock吗
    2019-11-14
    1
  • Geek_ae11ce
    最后这张图,尤其里边带了文字步骤,棒
    2023-07-18归属地:北京
  • Damoncui
    没有课代表可让我怎么活啊~
    2022-12-13归属地:北京
收起评论
显示
设置
留言
13
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部