Linux kernel Character设备读取参数的内容来自哪里?

Linux kernel Character设备读取参数的内容来自哪里?,linux-kernel,linux-device-driver,device-driver,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_

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

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)
我的问题是

  • 这些参数是强制性的吗
  • 无法查看中使用的*filp和*offset。这有什么用
  • *缓冲区和*长度的数据实际上来自哪里?在代码中,据说缓冲区位于用户数据段中。这到底是什么意思

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


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

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

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

  • 这些参数是强制性的吗

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

  • 无法查看示例驱动程序中使用的*filp和*offset。这有什么用

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

  • *缓冲区和*长度的数据实际上来自哪里?在代码中,据说缓冲区位于用户数据段中。这到底是什么意思

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

  • 这些参数是强制性的吗

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

  • 无法查看示例驱动程序中使用的*filp和*offset。这有什么用

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

  • *缓冲区和*长度的数据实际上来自哪里?在代码中,据说缓冲区位于用户数据段中。这到底是什么意思

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