一个教育原则是:没有愚蠢的问题。这背后的基本思想是人们通过提问来学习。我被要求:“你能在编程层面展示和解释如果每个任务都可以执行所有指令会发生什么坏事吗?”
我确实给出了代码
main(){
_asm_("cli;");
while(1);
}
并解释它(系统冻结了好-UP)
然后我被问到:“是否可以举一个例子,即使完成了清除中断,系统也不会冻结?”
我确实修改了前面的例子:
我确实给出了代码
main(){
_asm_("cli;");
i=i/0;
while(1);
}
并解释了它。
简单地说:如果我们有需求分页 i=i/0首先会导致页面错误(数据页面不存在),并且可以安排其他任务运行在磁盘读取期间启用的中断,然后除以零将丢弃此任务永远。
但答案是基于UP。SMP 呢?我必须说答案是不完整的。它仍然很容易构建:
int i;
main(){
for(i=0;i<100;i++)// Suppose we have less than 100 CPUs
if(fork())
{ sleep(5);//The generating task has (most probable) time to do all forks
_asm_("cli;");
while(1);
}
}
这将禁用所有 CPU 的中断,因为每个 CPU 都会运行一个有毒任务。
到目前为止,一个愚蠢的问题确实向初学者揭示了许多值得学习的东西:特权指令、分页、故障处理、DMA 期间的调度、fork ......但是关于第一个运行的程序仍然存在一个小疑问(我感到羞耻)在 SMP 上。
一个 CPU 会永久失效吗?其他 CPU 继续并可以发送re_schedule() IPI 消息。那会发生什么?很容易推测冻结的 CPU 不会唤醒,因为中断被禁用。但要完全确定必须知道更多。
我的问题是:处理器间中断 (IPI) 是可屏蔽的还是不可屏蔽的?我的意思是在最常见的“流行”实现中?
原谅我愚蠢的问题。找到答案并不难。我会寻找它。我的意思是中断引脚号(我猜是可以屏蔽的)。
我自己的答案 - 正确吗?我研究了这个问题,因为没有其他人喜欢它,因此产生了以下想法:
对于重要的实时应用程序,我们长期以来一直使用看门狗定时器(硬件中断 cpu 以某种方式回答“我还活着”)。例如,如果主计算机出现故障,我们有主控计算机和备用计算机来处理系统。
Linux 呢?什么样的看门狗——我们有吗?我们可以在有或没有看门狗的情况下编译 Linux 内核。
Linux 看门狗是做什么的?在许多(!)x86/x86-64 类型的硬件上,有一个特性使我们能够生成“看门狗 NMI 中断”。甚至可以通过向 /proc/sys/kernel/nmi_watchdog 写入“0”来在运行时禁用 NMI 看门狗。如果系统中的任何 CPU 超过 5 秒没有执行周期本地定时器中断,APIC 会尝试通过不可屏蔽的中断来修复这种情况(cpu 执行处理程序,并杀死进程)!(SCC Linux 与 NMI 不同。)
我的答案(在原始问题中)是基于没有看门狗的系统!在一般水平上回答并基于某些固定系统给出示例是有问题的。答案可能正确或不正确,具体取决于 cpu 和配置和设置。
无论如何,谈论 NMI 确实有意义吗?做到了?