linux设备驱动文件操作:有可能有竞争条件吗?

时间:2013-09-18 14:27:59

标签: linux file-io kernel race-condition

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

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

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

如果内核保证彼此的原子性以及每个操作是否找到并使缓冲区/硬件保持一致状态,则不应该这样做。

请重新引导我一些参考(如果你知道的话)。

谢谢。

编辑:它出现在其中一条评论中,但我找到的最佳参考资料是:

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

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

1 个答案:

答案 0 :(得分:4)

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

正如您所料,内核更容易实现简单性和性能。在访问共享状态时,您可以获取必要的自旋锁和信号量。

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

  

并发及其管理

     

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