5

一个教育原则是:没有愚蠢的问题。这背后的基本思想是人们通过提问来学习。我被要求:“你能在编程层面展示和解释如果每个任务都可以执行所有指令会发生什么坏事吗?”

我确实给出了代码

    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 确实有意义吗?做到了?

4

1 回答 1

2

如果 CPU 不限制对某些指令的访问,那么很容易意外或故意造成灾难。

push $0
push $0
lidt (%esp)
int $42

此代码序列将重置 x86 处理器。原因如下:

  • 该代码在 IDTR 寄存器中加载一个位于线性地址 0 的中断描述符表 (IDT),大小为一个字节。
  • 引发中断 42,它无法工作,因为它超出了 IDT 的 1 字节限制。
  • CPU 试图引发一般保护故障,中断 13。这也失败了,因为中断 13 超出了一个字节的限制。
  • CPU 尝试引发双重故障异常,中断 8。这也失败了,中断 8 超出了 IDT 的限制。

这被称为三重故障。CPU 执行关闭总线循环以告诉主板它现在忽略所有内容并停止执行。主板断言重置,重新启动机器。

与代码所能做的相比,这实际上可以忽略不计。代码序列可以轻松劫持机器并开始破坏硬盘驱动器上的所有数据,它可以将您的所有文件发送到互联网上的恶意服务器,它可以更改您的密码,启用远程访问,连接到恶意服务器并授予攻击者无限的 shell 访问权限。程序可以做什么是没有限制的。

处理器有特权指令有两个原因,主要目的是保护操作系统免受错误程序的影响,这些程序可能会意外地做一些事情来破坏或劫持整个机器。次要目的是限制故意的恶意程序做同样的事情。

于 2017-01-14T19:24:33.137 回答