Linux设备驱动程序文件操作:是否可能有竞争条件?

问题描述 投票:5回答:1

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

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

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

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

[请把我重定向到一些参考文献(如果您知道)。

谢谢。

编辑:它在评论之一中,但是我发现的最佳参考在这里:

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

[它还显示了通过限制单个用户,通过创建副本,或者通过迫使用户等待等方式来减轻该问题的策略。

linux file-io kernel race-condition
1个回答
4
投票

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

如您所料,内核优先考虑简单性和性能,而不是易于实现。访问共享状态时,您需要掌握必要的自旋锁和信号灯。

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

并发及其管理

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

© www.soinside.com 2019 - 2024. All rights reserved.