字符设备读取参数的内容来自哪里?

时间:2013-10-16 04:51:03

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

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

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. 无法在sample driver中看到* filp和* offset。有什么用?
  3. * buffer和* length的数据实际上来自哪里?在代码中,据说缓冲区在用户数据段中。实际上是什么意思?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

答案 1 :(得分:0)

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

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