【问题标题】:file descriptor in kernel space内核空间中的文件描述符
【发布时间】:2019-01-29 18:30:38
【问题描述】:

我正在为 Linux 开发一个字符设备驱动程序。

我想实现以文件描述符为目标的read() 操作,每次打开设备时都会有点具体。

可以识别调用read() 的进程(使用内核current 宏),但在此进程中可能有多个与我的设备关联的文件描述符。

我知道文件描述符在进行系统调用之前已映射到 struct file 对象,但我可以取回它吗?

【问题讨论】:

  • 您已发布XY problem。这个“每次打开设备都会有点具体的操作”是什么?
  • 我想创建将输入数据存储在队列中的输入设备。然后每个消费者打开我的设备应该能够读取每个输入块而不会并发或任何其他数据丢失
  • 输入驱动程序实时向输入框架报告事件。无论如何,输入设备(如用户空间所见)默认情况下不是独占的。那么,您希望从当前行为中做出什么改变?

标签: linux-kernel linux-device-driver


【解决方案1】:

欢迎使用 stackoverflow!

要达到您在评论中指定的目标,有两种方法:

  1. ioctlread

    在这里,您将有多个缓冲区供每个使用者读取,并且写入缓冲区与读取缓冲区不同。每个消费者在打开设备后都会立即触发一个 ioctl,这将导致分配新缓冲区并为该缓冲区生成一个新令牌(类似于此令牌编号表示此缓冲区)。这个令牌号码应该传回给相关的消费者。

    现在每个消费者在进行读取调用之前都会触发 ioctl,给出令牌号,该令牌号会将当前读取缓冲区切换到与该令牌号关联的缓冲区。

现在这个方法增加了开销,你也需要添加锁。此外,一次最多只能有一个消费者从设备中读取数据。

  1. ioctlmmap

    您可以映射每个消费者的读取缓冲区,并让它按照自己的节奏读取,使用 ioctl 请求新数据等。

    这将允许多个消费者同时阅读。

  2. 或者,您可以 malloc 一个新的数据缓冲区,以便在每次打开调用时从中读取,并将指向缓冲区的指针存储在文件结构的私有字段中。 每当以这种方式调用读取时,您只需读取随调用传递的文件结构的私有数据字段,然后查看正在讨论的缓冲区。 您也可以在私有字段中嵌入包含缓冲区指针和大小等的整个结构。

【讨论】:

  • 感谢您的回答,但我认为解决方案有点复杂。其实我已经解决了我的问题。仅通过作为read 参数提供的struct file* filp 就可以识别消费者。见 stackoverflow.com/questions/5284062/… 所以我不需要 ioctl 我的设备,tail -f /dev/mysweetdev 就可以工作
猜你喜欢
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-25
相关资源
最近更新 更多