我一直在进行模块工作,但是会随机崩溃(通常在启动后10小时内)。
内核日志信息可能因每次崩溃而异,但有些情况下我会得到以下信息:
<4>huh, entered c90390a8 with preempt_count 0000010d, exited with c0340000?
生成此日志的代码来自2.6.14内核,即kernel/timer.c:
int preempt_count = preempt_count();
fn(data);
if (preempt_count != preempt_count()) {
printk(KERN_WARNING "huh, entered %p "
"with preempt_count %08x, exited"
" with %08x?\n",
fn, preempt_count,
preempt_count());
BUG();
}
要发生这种情况,必须发生什么(显然是 preempt_count 改变了,但是可能会导致这种情况的原因是什么)?
崩溃的另一个症状是,我在从工作队列执行 i2c 时看到 scheduling while atomic
(这肯定不应该是原子操作,对吧?)。这可能是什么原因造成的?
我觉得这篇文章可能是一个很大的风险,但我真的只是想找到任何可以排除故障的东西。