这是一个奇怪的问题,但我在一个关于linux内核驱动程序开发的课堂上,教授无法回答这个问题。
假设我有一个与SPI或I2C总线相连的有限状态机(在现实生活中,这实际上是一个加速度计,但实现并不重要)。如果我为它编写了一个misc字符驱动程序,并使它不受干扰,系统上的任何用户现在都可以访问该设备。
假设我想从这个FSM设备读取200个字节的数据。读取是通过发送数据位置的寄存器地址,并执行连续读取,直到我有我的200个字节(program#1)。
当我知道我的用户级程序正在被分割的时候,混乱就出现了。如果另一个(program#2)用户级程序也要从这个加速度计中请求10个字节,它将寻址并连续读取,直到它有10个字节。
如果program#1在得到时间切片时运行并读取了50个字节,并且program#2被运行到完成,那么当program#1返回时,它所读取的地址被破坏了,并且它从错误的地址读取数据。
时间片对用户是不可见的。据我所知,它们对内核驱动程序代码也是不可见的。有什么机制可以避免这种情况吗?原子读和写将是最有意义的,但这些I2C/SPI设备的CPU标准是缓慢的。我无法想象CPU会一直袖手旁观,仅仅为了确保I2C/SPI读写是原子的?
教授给我的答案是,这个问题很久以前就已经解决了,而linux“很可能正在做一些花哨的事情”来实现它。但这并没有真正解决问题的根源。我想要一个正确的答案。如果有人能推荐更好的搜索条件来解决这个问题,我也会很感激。
谢谢
https://stackoverflow.com/questions/71453901
复制相似问题