最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【经验记录】linux驱动中的互斥之自旋锁

经验和教训 crifan 2165浏览 0评论

此处不是专门介绍spinlock的,而是简单记录一下最近的体会。

涉及Linux驱动之初,有人就说了,Linux驱动中最难的就是资源管理方面的,包括内存管理,以及进程互斥和共享等,开始没遇到,没有啥体会,近日遇到一个这方面的内容,才发现这句话说的多么有道理。。。

在编写LBA Nand Flash驱动的时候,经过测试,数据读写都正常了。

但是后来,在内核编译的menuconfig里面,打开了CONFIG_PREEMPT之后,LBA驱动工作就不正常了,常常出现一些打印提示信息,说LBA发生一些错误,不过具体什么错误,即使根据datasheet的说明,也无法定位,而其他一些LBA错误是读写错误。这些错误虽然知道了,但是一直没完全搞懂为何会出错,因为编译内核,在不开启CONFIG_PREEMPT的时候,LBA驱动读写数据都是正确的,开启之后,LBA读写就常常出错。

最后经过漫长的调试,终于搞清楚了。原来是对于LBA的读写函数过程需要一定的时间,在此期间,如果是开启了CONFIG_PREEMPT,即允许内核抢占,优先级更高的任务就可能会打断LBA的读写,因此就很可能发生错误,而解决办法就是,加一个自旋锁去保护此操作,在读写之前上锁,读写完成后,解锁,即可。

看来,很多东西,的确都是真正遇到了,才会明白的,否则只是理论而已,很难理解的透彻。

转载请注明:在路上 » 【经验记录】linux驱动中的互斥之自旋锁

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
79 queries in 0.151 seconds, using 21.94MB memory