设备文件与文件系统如何联系起来

        这篇文章比较短,主要是说明一下文件系统和特殊文件是怎么联系起来的。我们前面分析了VFS加一个sysfs,知道了想要找到一个文件,那都是需要通过VFS找到具体的文件系统,比如ext2、ext3、jiffs、sysfs、proc等等,然后在由具体的文件系统里面的操作集对该文件进行操作。

        那这里有一个疑问,我们前面操作的文件都是属于普通文件、最多就是目录这两类,那怎么去操做设备文件这类特殊的文件呢?比如字符设备、块设备,他们在Linux系统里面也是呈文件的形式,那文件系统怎么和他们挂钩联系起来呢,所以这篇文章就是要记录这个。

文件如何变成设备

        在第一篇文章里面讲文件系统的注册的时候,我们说到这个过程会分配dentry、super_block、inode,并且设置他们三个的关系(反正就是各种链表指来指去)。其中inode里面是通过:xxxfs_get_inode方法来得到的,比如ramfs_get_inode,我直接给出代码。

struct inode *ramfs_get_inode(struct super_block *sb,
                                const struct inode *dir, umode_t mode, dev_t dev)
{
    struct inode * inode = new_inode(sb);
    if (inode) {

    switch (mode & S_IFMT) {
        default:
            init_special_inode(inode, mode, dev);
            break;
        case S_IFREG:
            inode->i_op = &ramfs_file_inode_operations;
            inode->i_fop = &ramfs_file_operations;
            break;
        case S_IFDIR:
            inode->i_op = &ramfs_dir_inode_operations;
            inode->i_fop = &simple_dir_operations;
            /* directory inodes start off with i_nlink == 2 (for "." entry) */
            inc_nlink(inode);
            break;
        case S_IFLNK:
            inode->i_op = &page_symlink_inode_operations;
            break;
    }
}
    return inode;
}

        该方法会根据文件类型设置inode信息,如果都不是想要的文件类型,说明就是特殊文件,就要使用init_special_inode方法,该方法就是用来把设备文件和文件系统联系起来的,或者说把文件变成设备的,而Linux上面设备文件又分为:字符设备、块设备、网络设备,我们来看一下该方法。

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))
        inode->i_fop = &bad_sock_fops;

}

        

        也就是在这里将i_fop根据设备类型给替换了,所以此处就产生了联系,那么后面对文件的操作,打开、读写、关闭都是通过此处被替换过的fop进行的,就这样找到了设备文件,并且对设备文件进行操作。

        至此我们已经引出了设备文件,后面就开始围绕设备进行学习了,首先肯定是字符设备,字符设备是整个Linux内核里面最大的一类驱动,简单的非常简单,复杂的也非常复杂,但是万变不离其宗,多分析几个驱动框架就好,坚持下去后,你就会觉得 so easy!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值