为了给您提供完整的背景信息,我的讨论始于一个观察:我在ARM cortex A8 SoC上运行SMP Linux(3.0.1-rt11),这是单处理器。我很想知道禁用SMP支持是否会有任何性能优势。如果有的话,它将对我的驱动程序和中断处理程序产生什么影响。
我阅读了一些相关主题:自旋锁和内核抢占。我做了更多的谷歌搜索和阅读,但这次得到的都是过时和矛盾的答案。所以我想试试stackoverflow。
我的疑问/问题是:
a) Linux kernel默认情况下在内核空间中是可抢占的吗?如果是,这种抢占是否仅限于进程,还是中断处理程序也可以被抢占?
b) Linux内核(在ARM上)是否支持嵌套中断?如果是,每个中断处理程序(top half)是否有自己的堆栈,还是它们共享相同的4k/8k内核模式堆栈?
c) 如果我禁用SMP(CONFIG_SMP)和抢占(CONFIG_PREEMPT),那么我的驱动程序和中断处理程序中的自旋锁是否有意义?
d) 内核如何处理在执行top-half时引发的中断,即它们是否被禁用或掩码?
经过一些谷歌搜索,我发现:
对于没有编译CONFIG_SMP且没有编译CONFIG_PREEMPT的内核,自旋锁根本不存在。这是一个非常好的设计决策:当没有其他人同时运行时,没有理由使用锁。
如果内核没有编译CONFIG_SMP,但设置了CONFIG_PREEMPT,则自旋锁只是禁用了抢占,这足以防止任何竞争。对于大多数目的,我们可以认为抢占相当于SMP,不必单独担心它。
但是在源中没有内核版本或日期。有人能确认它是否仍然适用于最新的Linux内核吗?
我阅读了一些相关主题:自旋锁和内核抢占。我做了更多的谷歌搜索和阅读,但这次得到的都是过时和矛盾的答案。所以我想试试stackoverflow。
我的疑问/问题是:
a) Linux kernel默认情况下在内核空间中是可抢占的吗?如果是,这种抢占是否仅限于进程,还是中断处理程序也可以被抢占?
b) Linux内核(在ARM上)是否支持嵌套中断?如果是,每个中断处理程序(top half)是否有自己的堆栈,还是它们共享相同的4k/8k内核模式堆栈?
c) 如果我禁用SMP(CONFIG_SMP)和抢占(CONFIG_PREEMPT),那么我的驱动程序和中断处理程序中的自旋锁是否有意义?
d) 内核如何处理在执行top-half时引发的中断,即它们是否被禁用或掩码?
经过一些谷歌搜索,我发现:
对于没有编译CONFIG_SMP且没有编译CONFIG_PREEMPT的内核,自旋锁根本不存在。这是一个非常好的设计决策:当没有其他人同时运行时,没有理由使用锁。
如果内核没有编译CONFIG_SMP,但设置了CONFIG_PREEMPT,则自旋锁只是禁用了抢占,这足以防止任何竞争。对于大多数目的,我们可以认为抢占相当于SMP,不必单独担心它。
但是在源中没有内核版本或日期。有人能确认它是否仍然适用于最新的Linux内核吗?