处理器间中断使用

时间:2013-02-26 14:08:20

标签: interrupt

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

我确实给了代码

    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不会唤醒,因为中断被禁用。 但要完全确定必须了解更多。

我的问题是: Inter Processor Interrupt(IPI)是可屏蔽的还是不可屏蔽的? 我的意思是最常见的“流行”实现?

请原谅我的愚蠢问题。找到答案并不是很困难。我会寻求它。 我的意思是中断引脚号(告诉可屏蔽,我猜测)。


我自己的回答 - 对吗? 我研究了这个问题,因为没有其他人喜欢它,接下来的想法:

对于重要的实时应用程序,我们已经有很长一段时间看门狗定时器(硬件中断cpu以某种方式回答“我还活着”)。 例如,如果主计算机关闭,我们有主控制计算机和备用计算机负责系统。

Linux怎么样? 什么样的看门狗 - 我们有一个? 我们可以在有或没有看门狗的情况下编译Linux内核。

Linux看门狗的作用是什么? 在许多()x86 / x86-64类型的硬件上,有一个功能使我们能够生成“看门狗NMI中断”。 甚至可以通过将“0”写入/ proc / sys / kernel / nmi_watchdog来在运行时禁用NMI监视程序。 如果系统中的任何CPU没有执行周期本地定时器中断超过5秒,APIC会尝试通过不可屏蔽中断来修复该情况(cpu执行处理程序,并终止进程) ! (SCC Linux与NMI不同。)

我的答案(在原始问题中)是基于没有看门狗的系统! 在一般水平上回答并基于某些固定系统给出示例是有问题的。答案可能正确与否,具体取决于cpu和配置及设置。

无论如何,谈论NMI确实有道理吗?是吗?

1 个答案:

答案 0 :(得分:1)

如果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访问权限。程序可以做什么没有限制。

处理器拥有特权指令有两个原因,主要目的是保护操作系统免受可能意外做某事以降低或劫持整个机器的错误程序的影响。第二个目的是限制故意恶意程序做同样的事情。