【问题标题】:linux device driver file operations: it is possible to have race conditions?linux设备驱动文件操作:可能有竞争条件?
【发布时间】:2013-09-18 14:27:59
【问题描述】:

考虑一个实现 open()、read()、write()、close()、unlocked_ioctl() 和 mmap() 的 linux 设备驱动程序。

现在,假设多个(或相同)进程同时打开同一个设备 (/dev/device)。

这些文件操作是否以任何方式保证是原子的 w.r.t.或者 open()、read()、write()、close() 中的每一个都应该使用互斥锁,以便它们的一对在更改(例如,缓冲区数据)的过程中不会抢占它们(通过同一个inode)?

如果内核保证它们彼此之间的原子性,并且如果每个操作都找到并保持缓冲区/硬件处于一致状态,则应该没有必要。

请把我引向一些参考资料(如果你知道的话)。

谢谢。

编辑:它在其中一个 cmets 中,但我找到的最佳参考在这里:

http://www.makelinux.net/ldd3/chp-6-sect-6

它还展示了缓解问题的策略,通过限制单个用户、创建副本、强制用户等待等方式。

【问题讨论】:

标签: linux file-io kernel race-condition


【解决方案1】:

设备驱动程序代码在调用系统调用的进程中运行。内核没有在调用模块代码之前锁定的隐式“模块锁”。当单独的进程调用最终在您的驱动程序代码中的系统调用时,并发驱动程序调用绝对可能发生。

如您所料,内核更倾向于简单性和性能,而不是易于实现。访问共享状态时,由您来获取必要的自旋锁和信号量。

参见Linux Device Drivers 中的Chapter 5,其中详细讨论了并发和竞争条件。

并发及其管理

在现代 Linux 系统中,有许多并发源,因此可能存在竞争条件。多个用户空间进程正在运行,它们可以以惊人的组合方式访问您的代码。 SMP 系统可以在不同的处理器上同时执行您的代码。内核代码是可抢占的;您的驱动程序代码可能随时丢失处理器,并且替换它的进程也可能在您的驱动程序中运行。设备中断是异步事件,可导致代码并发执行。内核还提供了各种延迟代码执行的机制,例如工作队列、tasklet 和计时器,它们可能导致您的代码在任何时候以与当前进程正在执行的操作无关的方式运行。在现代、可热插拔的世界中,您的设备可能会在您使用它的过程中消失。

【讨论】:

  • 上面的链接已经失效了。
猜你喜欢
  • 2017-10-26
  • 2013-04-13
  • 2015-06-21
  • 2017-10-04
  • 2021-04-09
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 2010-09-29
相关资源
最近更新 更多