如何创建一个设备文件


这节将如何将设备文件与fops联合起来

1.mknod引入

创建指定类型的特殊文件

mknod --help

用法:mknod [选项]... 名称 类型 [主设备号 次设备号]
Create the special file NAME of the given TYPE.
...
当类型为"p"时可不指定主设备号和次设备号,否则它们是必须指定的。
如果主设备号和次设备号以"0x""0X"开头,它们会被视作十六进制数来
解析;如果以"0"开头,则被视作八进制数;其余情况下被视作十进制数。
可用的类型包括:

  b      创建(有缓冲的)区块特殊文件
  c, u   创建(没有缓冲的)字符特殊文件
  p      创建先进先出(FIFO)特殊文件

如:
mknod /dev/led c 20 0

2.原理分析

在这里插入图片描述

2.1 init_special_inode函数分析

fs/inode.c

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))//判断是否为FIFO文件
               inode->i_fop = &pipefifo_fops;
       else if (S_ISSOCK(mode))
               ;       /* leave it no_open_fops */
      else
               printk(KERN_DEBUG "init_special_inode: bogus i_mode (%o) for"
                                 " inode %s:%lu\n", mode, inode->i_sb->s_id,
                                  inode->i_ino);
}

判断文件的inode类型,如果是字符设备类型,则把def_chr_fops作为该文件的操作接口,并把设备号记录在inode->i_rdev。

3.警告

inode上的file_operation并不是自己构造的file_operation,而是字符设备通用的def_chr_fops,那么自己构建的file_operation等在应用程序调用open函数之后,才会绑定在文件上。

const struct file_operations def_chr_fops = {
      .open = chrdev_open,
       .llseek = noop_llseek,
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值