x86 PIC, правильно ли QEMU вызывает прерывания на всех процессорах?

Недавно мне пришлось обойти проприетарную проблему ОС с x86 PIC, когда ожидаемый таймер ОС прерывает ТОЛЬКО на CPU0. Я включил IO-APIC, чтобы обойти это, и управлял процессором, чтобы прерывания поступали только к CPU0. Проблема решена.

Мне сказали, что наше оборудование сломано, чтобы делать такие вещи. т. е. поднять прерывания таймера на всех процессорах, когда используется только PIC. Речь идет об «аппаратном обеспечении» QEMU/KVM.

Виноват ли здесь QEMU/KVM? ОС делает неверные предположения?

Я подозреваю, что QEMU/KVM делает это совершенно правильно, и ОС должна иметь возможность обрабатывать прерывания таймера на ЦП! = 0...


person Neil McGill    schedule 07.05.2014    source источник
comment
Вы имеете в виду, что он прерывает каждый процессор одновременно или что прерывание может появиться на любом отдельном? Это определенно не должно идти ко всем из них сразу. Я что-то помню о постоянном запуске одного и того же процессора, но я думаю, что было бы разумно показать любой, особенно если это на самом деле IO-APIC, эмулирующий PIC.   -  person ughoavgfhw    schedule 07.05.2014
comment
То, что я видел, было 99,99% времени, когда таймер достигал CPU0. После этого он случайным образом попадал в CPU1-7. Я думал, что иногда CPU0 будет занят, и это заставит QEMU/KVM выбрать другую цель для прерывания. Рассматриваемая ошибка возникла только при загрузке, так что это кажется вероятным.   -  person Neil McGill    schedule 07.05.2014
comment
Это определенно звучит как IO-APIC. Он отправляет на ЦП 0, если в этот момент прерывания не отключены. Если вы действительно хотите, чтобы он перешел на ЦП 0, вы можете использовать APIC для его пересылки, но на самом деле лучше просто настроить IO-APIC, как у вас есть.   -  person ughoavgfhw    schedule 07.05.2014
comment
Если я помню, я опубликую ответ на основе этого позже сегодня, так как мы, вероятно, знаем причину.   -  person ughoavgfhw    schedule 07.05.2014
comment
В приведенном выше случае APIC не был включен в QEMU/KVM. Это было решение только для PIC. Я реализовал APIC/IO-APIC, чтобы решить эту проблему; но на самом деле мой вопрос заключался в том, правильно ли это поведение для коробки только для PIC. PIC не поддерживает SMP, поэтому кажется разумным, что он будет доставлять прерывания следующему готовому ЦП.   -  person Neil McGill    schedule 07.05.2014


Ответы (1)


Я думаю, что это правда, PIC обычно доставляет прерывания только CPU 0, включая прерывания таймера. Большинство операционных систем не будут пытаться использовать SMP с PIC, поскольку ЦП1 не может получить или получить какие-либо прерывания (включая какие-либо прерывания таймера для планирования процессов); например, Linux с «noapic» отключает все, кроме CPU0. Я думаю, что эта ОС попала в странный угловой случай в qemu.

person hwertz    schedule 03.05.2016