4

I'm studying Linux Device Driver programming 3rd edition and I have some questions about the open method, here's the "scull_open" method used in that book:

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 */
}

And my questions are:

  • Shouldn't this function returns a file descriptor to the device just opened?
  • Isn't the "*filp" local to this function, then why we copy the contents of dev to it?
  • How we could use later in read and write methods?
  • could someone writes to my a typical "non-fatty" implementation of open method?

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

4

2 回答 2

2

用户空间打开函数就是您所想的,即返回文件描述符 int 的系统调用。有很多很好的参考,例如APUE 3.3。

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

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