【问题标题】:The role of major and minor numbers in device driver主次编号在设备驱动中的作用
【发布时间】:2013-01-13 00:57:21
【问题描述】:

我正在学习 Linux 设备驱动程序,但被主要、次要数字卡住了。到目前为止我所拥有的是:

  • 通过文件系统中的名称访问设备。那些名字 被称为特殊文件或设备文件或文件的 inode 系统。

  • 并且每个设备文件都与绑定到 dev_t 类型的 MAJOR 和 MINOR 编号相关联。

  • 这些数字由函数register_chrdev_region分配给设备

有些问题还困扰着我……

  1. fops 结构是否链接到文件结构的f_ops 字段 当我们像cdev_init(&c_dev, &fops);这样初始化设备时的设备文件?
  2. 如何调用open("/dev/mydev", O_RONLY); 实际调用open() 驱动程序的功能。数字是否出现在这里 找到设备驱动的实际写入方法,如果可以怎么办?
  3. 数字,major 用于识别设备驱动程序和 次要设备文件。这个数字的实际作用是什么 当我们对设备文件执行open()read()write()等操作时?

【问题讨论】:

    标签: linux file-io linux-kernel linux-device-driver


    【解决方案1】:

    我认为故事应该从你打字时发生的事情开始:

    mknod /dev/c83 c 8 3
    

    它将调用 ext2_mknod("/dev", "c83", CHAR, DEV(8, 3)),大多数文件系统将 mknod 实现为 init_special_inode 的包装器:

    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 = &def_fifo_fops;
            else if (S_ISSOCK(mode))
                    inode->i_fop = &bad_sock_fops;
            else
                    printk(KERN_DEBUG "init_special_inode: bogus i_mode (%o)\n",
                           mode);
    }
    

    当你最终调用 open("/dev/c83") 时,它将进入函数 def_chr_fops.chrdev_open,它将用你在 cdev_init() 中注册的 fops 替换文件 "/dev/c83" 的 fops:

    int chrdev_open(struct inode * inode, struct file * filp)
    {
        struct cdev *p;
        ...
        p = inode->i_cdev;
        ...
        filp->f_op = fops_get(p->ops);
        ...
        if (filp->f_op->open) {
            lock_kernel();
            ret = filp->f_op->open(inode,filp);
            unlock_kernel();
        }
        ...
        return ret;
     }
    

    之后,每个系统调用(例如读/写/关闭)都直接转到注册在 cdev_init() 中的函数指针!

    所以,对于你的第一个问题:

    1. 是的,正如您在 chrdev_open() 中看到的那样。
    2. 是的,因为设备的 fops 和 cdev_init 中注册的完全一样
    3. 在 open() 中起着重要作用,因为 open() 使用对来查找正确的设备驱动程序。但在那之后,其他文件操作,例如读/写/关闭(),不再参与,一切都通过在open()中解析的fops中的函数指针。

    【讨论】:

      猜你喜欢
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多