当前位置: 技术问答>linux和unix
驱动开发--SMP对应
来源: 互联网 发布时间:2017-02-21
本文导语: 大家好,第一次发贴,如有不妥之处,还请多多指正。 正题:如何确定临界区(临界资源)? 现在,我正对应一个板卡驱动程序的SMP版本。在UP机器上正常运行,在Duo CPU机器上关掉一个CPU核后也...
大家好,第一次发贴,如有不妥之处,还请多多指正。
正题:如何确定临界区(临界资源)?
现在,我正对应一个板卡驱动程序的SMP版本。在UP机器上正常运行,在Duo CPU机器上关掉一个CPU核后也可正常运行。而在Duo CPU机器上会发生NG情况,这一点可以说明“没有对应SMP”对吧?
我查阅代码,对于板卡寄存器相关操作都加上spinlock,但是还是NG(在Duo CPU机器上)。
现在我很困惑,不知道哪些地方还需要加SMP相关代码。甚至越看越迷茫,都有点“草木皆兵”(现在看着什么都该加锁)。
希望,得到大家的建议和指导,不胜感激……
正题:如何确定临界区(临界资源)?
现在,我正对应一个板卡驱动程序的SMP版本。在UP机器上正常运行,在Duo CPU机器上关掉一个CPU核后也可正常运行。而在Duo CPU机器上会发生NG情况,这一点可以说明“没有对应SMP”对吧?
我查阅代码,对于板卡寄存器相关操作都加上spinlock,但是还是NG(在Duo CPU机器上)。
现在我很困惑,不知道哪些地方还需要加SMP相关代码。甚至越看越迷茫,都有点“草木皆兵”(现在看着什么都该加锁)。
希望,得到大家的建议和指导,不胜感激……
|
不是所有寄存器操作都是临界资源,临界资源也不仅限于寄存器。
被多个执行单元(进程上下文以及中断上下文)同时并发地访问共享资源(硬件资源和变量),都是临界区。
某段代码,在一个cpu上执行时,如果可能被另外一个cpu或中断修改它使用的变量或者寄存器,都需要对这段代码做临界区保护。
smp下,进程上下文使用 spin_lock_irqsave spin_unlock_irqrestore
smp下,中断上下文使用 spin_lock spin_unlock
被多个执行单元(进程上下文以及中断上下文)同时并发地访问共享资源(硬件资源和变量),都是临界区。
某段代码,在一个cpu上执行时,如果可能被另外一个cpu或中断修改它使用的变量或者寄存器,都需要对这段代码做临界区保护。
smp下,进程上下文使用 spin_lock_irqsave spin_unlock_irqrestore
smp下,中断上下文使用 spin_lock spin_unlock