【问题标题】:x86 PIC, is it correct for QEMU to raise interrupts on all CPUs?x86 PIC,QEMU 在所有 CPU 上引发中断是否正确?
【发布时间】:2014-05-07 01:02:34
【问题描述】:

我最近不得不解决 x86 PIC 的专有操作系统问题,其中操作系统预期的计时器仅在 CPU0 上中断。我启用了 IO-APIC 来解决这个问题并进行 CPU 控制,因此中断只发送到 CPU0。问题解决了。

有人告诉我,我们的硬件坏了做这样的事情。即仅在使用 PIC 时在所有 CPU 上引发定时器中断。有问题的“硬件”是 QEMU/KVM。

QEMU/KVM 有问题吗?操作系统是否做出了无效假设?

我怀疑 QEMU/KVM 这样做是完全正确的,操作系统应该能够处理 CPU 上的定时器中断!= 0...

【问题讨论】:

  • 你的意思是它同时中断每个CPU,还是任何一个CPU都可以出现中断?它绝对不应该同时传给他们所有人。我有点记得总是触发同一个 CPU,但我认为显示 any 是合理的,特别是如果它实际上是一个模拟 PIC 的 IO-APIC。
  • 我看到的是 99.99% 的时间计时器会到达 CPU0。之后它会随机命中 CPU1-7。我的想法是偶尔 CPU0 会很忙,这会导致 QEMU/KVM 为中断选择另一个目标。有问题的错误只发生在加载时,所以看起来很有可能。
  • 这听起来绝对像一个 IO-APIC。它发送到 CPU 0,除非它在那个时刻禁用了中断。如果你真的希望它去 CPU 0,你可以使用 APIC 来转发它,但最好只配置 IO-APIC。
  • 如果我记得的话,我会在今天晚些时候发布一个基于此的答案,因为我们可能知道原因。
  • 在上述情况下,QEMU/KVM 中没有启用 APIC。这是唯一的 PIC 解决方案。我确实实施了 APIC/IO-APIC 来解决这个问题;但我的问题是,这种行为对于仅限 PIC 的盒子是否正确。 PIC 不支持 SMP,因此它将中断传递给下一个准备好的 CPU 似乎是合理的。

标签: x86 pic qemu kvm apic


【解决方案1】:

我认为这是真的,PIC 通常只向 CPU 0 提供中断,包括定时器中断。大多数操作系统不会尝试使用 PIC 进行 SMP,因为 CPU1 无法获得或接收任何中断(包括用于进程调度的某种定时器中断);例如,带有“noapic”的 Linux 会禁用除 C​​PU0 之外的所有内容。我认为这个操作系统在 qemu 中遇到了一个奇怪的角落。

【讨论】:

    猜你喜欢
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    相关资源
    最近更新 更多