应该在Linux设备驱动程序中打开方法返回文件描述符?

时间:2013-08-03 15:44:11

标签: linux-kernel linux-device-driver system-calls

我正在学习Linux设备驱动程序编程第3版,我对open方法有一些疑问,这是本书中使用的“scull_open”方法:

int scull_open(struct inode *inode, struct file *filp){
    struct scull_dev *dev; /* device information */

    dev = container_of(inode->i_cdev, struct scull_dev, cdev);
    filp->private_data = dev; /* for other methods */
    /* now trim to 0 the length of the device if open was write-only */
    if ( (filp->f_flags & O_ACCMODE) == O_WRONLY) {
            if (down_interruptible(&dev->sem))
                    return -ERESTARTSYS;
            scull_trim(dev); /* ignore errors */
            up(&dev->sem);
    }
    return 0;          /* success */
}

我的问题是:

  • 此函数不应该向刚打开的设备返回文件描述符吗?
  • 这个函数不是“* filp”的本地,那么为什么我们要将dev的内容复制到它?
  • 我们以后如何在读写方法中使用它?
  • 有人会写我的开放式方法的典型“非脂肪”实现吗?

    ssize_t scull_read(struct file * filp,char __user * buf,size_t count,loff_t * f_pos){    struct scull_dev * dev = filp-> private_data;    ...}

2 个答案:

答案 0 :(得分:2)

用户空间打开功能正是您所考虑的,这是一个返回文件描述符int的系统调用。很多很好的参考资料,例如APUE 3.3。

设备驱动程序“open method”是file_operations结构中的一个函数。它与用户空间“文件打开”不同。安装设备驱动程序后,当用户代码打开设备(例如访问/ dev / scull0)时,将调用此“打开方法”。

答案 1 :(得分:0)

  1. 此函数不应该向刚刚打开的设备返回文件描述符吗? 在linux设备驱动程序中,open()返回0或负错误代码。文件描述符由内核管理。
  2. 这个函数不是“* filp”本地,那么为什么我们将dev的内容复制到它呢? filp表示打开的文件,指向它的指针由内核传递给驱动程序。有时使用此filp有时驱动程序不需要它。复制dev的内容是必需的,这样当其他一些函数让我们说read()被调用时,驱动程序可以检索一些设备特定的数据。
  3. 我们以后如何在读写方法中使用? 在read / write()中使用filp的最常见方法之一是获取锁。当设备打开时,驱动程序将创建一个锁。现在,当发生读/写时,如果多个进程正在访问同一设备,则会使用相同的锁来防止数据缓冲区损坏。
  4. 有人可以写一下我开放方法的典型“非脂肪”实现吗? 正如您正在学习,请享受更多探索。可以找到实施here