• Spring
    2019-06-23
    读完这篇文章,我感觉用三个文件系统主要是为了解耦和可扩展。首先是open一个块设备,涉及两个文件系统:devtmpfs和伪文件系统bdev。通过devtmpfs中的设备号dev_t在伪文件系统bdev中找到block_device,然后打开,打开后再将block_device设置到主流文件系统的super_block中。设置到主流文件系统的super_block后,我们就可以通过主流文件系统(如ext4)的file_operations对块设备进行操作了。由于主流文件系统有很多,而且未来可能退出新的,写操作系统内核时不可能每次都针对新的文件系统进行更改,因此devtmpfs和伪文件系统只是为了获取和打开block_device,最终对block_device进行读写是交给主流文件系统的。

    作者回复: 是的

    
     3
  • Geek_54edc1
    2019-06-22
    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
    展开

    作者回复: 是的

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

    作者回复: 有指针

    
     1
  • 小龙的城堡
    2019-06-14
    能解释下为什么打开一个块设备需要3个文件系统配合?为什么不是两个,也不是4个?感觉一堆代码分析,越来越晕了。

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

    
     1
  • 小庄.Jerry
    2019-11-14
    格式化的时候不会设置superblock吗
    
    
  • 一笔一画
    2019-06-16
    为什么查找ext4fs文件系统的内容需要devtmps来管理,感觉设计不太合理?

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

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

    作者回复: 一切皆文件

    
    
我们在线,来聊聊吧