内核空间中的文件描述符

时间:2018-08-23 11:27:54

标签: linux-kernel linux-device-driver

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

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

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

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

1 个答案:

答案 0 :(得分:0)

欢迎使用stackoverflow!

要实现您在注释中指定的目标,有两种方法:

  1. ioctlread

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

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

现在,此方法会增加开销,您也需要添加锁。一次最多只能有一个消费者可以读取该设备。

  1. ioctlmmap

    您可以映射每个使用者的读取缓冲区,并使用ioctl来请求新数据等,使其按自己的步调从中读取。

    这将允许多个使用者同时阅读。

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