Міжпроцесорне переривання

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Міжпроцесорне переривання (англ. inter-processor interrupt, IPI) — спеціальний тип переривання, за допомогою якого один процесор може надсилати спеціальні повідомлення іншим процесорам багатопроцесорної обчислювальної системи. Прикладами таких повідомлень або запитів можуть бути

  • запит MMU на синхронізацію кешів (таких як TLB) на інших процесорах, у випадку, коли один з процесорів змінив відображення (англ. mapping) пам'яті;
  • старт або зупинка процесорів або ядер.

Історія

[ред. | ред. код]

Спеціальна версія M65MP операційної системи OS/360 використовувала так зване «пряме керування» (англ. Direct Control feature) машини IBM System/360, щоб згенерувати переривання у іншому процесорі.[1] Більш формалізований інтерфейс у вигляді спеціальної інструкції SIGNAL PROCESSOR з'явився у IBM System/370[2], і продовжує використовуватися у z/Architecture.

Архітектура x86

[ред. | ред. код]

У IBM PC-сумісних комп'ютерах, що мають контролер переривань APIC, надсилання міжпроцесорних переривань часто здійснюється саме за допомогою APIC. Коли процесорові треба надіслати переривання до іншого процесора, вектор переривань і ідентифікатор LAPIC цільового процесора програмується у спеціальний регістр ICR (англ. Interrupt Command Register) «свого» контролера APIC. Після цього «свій» APIC надсилає повідомлення цільовому контролерові APIC, який викликає переривання потрібного процесора чи ядра.

Архітектура ARM

[ред. | ред. код]

У сучасних процесорах архітектури ARM надсилання міжпроцесорних переривань здійснюється за допомогою контролера переривань GIC.[3] Зокрема, механізм IPI потрібен для запуску процесорних ядер: після початкового запуску системи команди виконує лише одне «основне» ядро (англ. primary core); всі інші ядра знаходяться у стані «чекання на переривання» (у цей стан ядро переводиться інструкцією WFI, англ. Wait For Interrupt). Для того, щоб запустити допоміжне ядро, у GIC треба запрограмувати початкову адресу виконання, а потім (теж за допомогою GIC) надіслати цільовому ядру програмно-генероване переривання (англ. Software Generated Interrupt, SGI).[3]

Приклади використання у операційних системах

[ред. | ред. код]

У багатопроцесорній системі під керуванням Microsoft Windows процесор може переривати інший процесор з наступних причин (на додачу до вже наведених вище):

  1. запит на диспетчеризацію переривання (DISPATCH_LEVEL), що в підсумку запускає новий потік виконання;
  2. точка зупину налагоджувача ядра[en].

У Microsoft Windows міжпроцесорні переривання мають IRQL 29.[4]

Див. також

[ред. | ред. код]

Джерела

[ред. | ред. код]
  1. IBM System/360 Operating System Introduction (PDF) (англ.). IBM. June 1971. Архів оригіналу (PDF) за 2 квітня 2020. Процитовано 27 січня 2020.
  2. IBM System/370 Extended Architecture. Principles of Operation (PDF) (англ.). IBM. March 1983. Архів оригіналу (PDF) за 29 вересня 2019. Процитовано 28 січня 2020.
  3. а б Cortex-A Series Programmer’s Guide. 4.0 (англ.). ARM. Архів оригіналу за 28 червня 2020. Процитовано 29 червня 2022.
  4. Matt (28 квітня 2002). Understanding IRQL (англ.). Архів оригіналу за 14 жовтня 2019. Процитовано 6 грудня 2014.
Помилка цитування: Тег <ref> з назвою "Lnx", визначений у <references>, не використовується в попередньому тексті.