Linux 内核、I2C SPI 总线和时间片?

Linux kernel, I2C SPI buses, and time slices?

有点奇怪的问题,但我正在 class 关于 linux 内核驱动程序开发,教授无法回答这个问题。

假设我有一个连接到 SPI 或 I2C 总线的某种有限状态机(在现实生活中,这实际上是一个加速度计,但实现并不重要)。如果我为它写一个 misc 字符驱动程序,并 insmod 它,系统上的任何用户现在都可以访问这个设备。

假设我想从这个 FSM 设备读取 200 字节的数据。通过发送数据位置的寄存器地址来执行读取,并执行连续读取直到我有 200 个字节(程序#1)。

当我知道我的用户级程序被时间分割时,我就感到困惑了。如果另一个(程序#2)用户级程序也将向该加速度计请求 10 个字节,它将寻址并连续读取直到它达到 10 个字节。

如果程序#1 有 运行 并在它被时间分割时读取 50 个字节,并且程序#2 是 运行 完成,那么当程序#1 returns,它从中读取的地址已损坏,它正在从错误的地址读取数据。

时间片对用户不可见。据我所知,它们对内核驱动程序代码也是不可见的。有什么机制可以避免这种情况吗?原子读取和写入最有意义,但这些 I2C/SPI 设备的速度低于 CPU 标准。我无法想象 CPU 会一直袖手旁观,只是为了确保 I2C/SPI read/write 是原子的?

教授给我的答案是这个问题很久以前就已经解决了记忆问题,linux“可能在幕后做了一些奇特的事情”来实现它。但这并没有真正解决问题的根源。我想要一个正确的答案。如果有人可以推荐更好的搜索词来解决这个问题,我也会很感激。

谢谢

如果我答对了你的问题,那么整个问题就是锁定多个程序使用的设备 (线程等)this post 可能有一个答案。

你的教授说对了一部分。这个问题很久以前就发现了,叫做race conditions。但是,内核本身并没有以 fancy 的方式提供解决方案。用户有责任实施一种机制来防止设备或任何其他资源出现竞争条件。