1

我读过,字符设备驱动程序的读取功能看起来像

static ssize_t device_read(struct file *filp,   /* see include/linux/fs.h   */
               char *buffer,    /* buffer to fill with data */
               size_t length,   /* length of the buffer     */
               loff_t * offset)

我的问题是

  1. 这些参数是强制性的吗?
  2. 无法看到示例驱动程序中使用的 *filp 和 *offset 。那有什么用?
  3. *buffer 和 *length 的数据实际上来自哪里?在代码中,据说缓冲区位于用户数据段中。实际上是什么意思?
4

2 回答 2

1
  1. 这些参数是强制性的吗?

    不,这些参数不是强制性的。这完全取决于您希望如何实现读取操作。但是,是的,用户空间应用程序必须传递读取系统调用中所需的所有内容,然后由驱动程序决定驱动程序想要使用的内容。

  2. 无法看到示例驱动程序中使用的 *filp 和 *offset。那有什么用?

    那是因为示例驱动程序没有读取实际设备,它只是读取全局字符字符串。但在实际的驱动程序中,它会读取一些设备。为了通知驱动程序用户空间想要读取哪个设备,*filp 用作设备标识符。偏移量只是给出开始在设备上读取的位置。

  3. *buffer 和 *length 的数据实际上来自哪里?在代码中,据说缓冲区位于用户数据段中。实际上是什么意思?

    在实际场景中,从 filp 指示的设备中读取数据,并将数据放入缓冲区并相应设置长度。但是在示例驱动程序中,为了简单起见,它只是读取全局字符字符串,而不是读取设备。此 *buffer 在用户数据段中,这意味着用户空间应用程序已在其自己的数据段中分配该缓冲区,并将其指针传递给内核空间,因此内核可以将数据传递给驱动程序已从设备读取的用户空间应用程序。put_user 用于将数据适当地传输到用户空间缓冲区。

于 2013-10-16T08:10:20.670 回答
0

假设一个用户进程想要使用read系统调用从文件中读取一些数据。用户进程提供一个文件描述符、一个数据应该被读入的缓冲区以及要读取的字节数。

调用的文件描述符被内核read转换为 a 。和参数是用户进程提供struct file *的缓冲区和字节数。bufferlength

于 2013-10-16T04:59:40.067 回答