2012-11-16 5 views
5

Was ist der Zweck eines Prozessors, der einen Interprozessor-Interrupt an sich auf der IA-32-Architektur sendet?Zweck des Selbst-IPI auf IA-32

Gemäß dem Intel IA-32 Architecture Software Developer's Manual, Vol. No. 3, Ch. 10.1:

IPIs werden für Software-Selbstunterbrechungen, Unterbrechungsweiterleitung oder preemptive Scheduling verwendet.

Aber warum würden Sie eine Selbst-IPI verwenden, wenn der Prozessor sich auch mit einer INT-Anweisung unterbrechen kann? Diese Funktion scheint überflüssig zu sein.

Antwort

3

Ich denke, der große Grund ist Konsistenz: Wenn Sie Software für einen Multi-Core-Prozessor schreiben, und Sie möchten einen Interrupt an alle Kerne im System senden, würde es suck, eine IPI zu jedem anderen zu tun core, dann führe INT aus, um den aktuellen Kern zu unterbrechen, und natürlich wirst du auch die Handler für beide Interrupt-Quellen einrichten müssen ... Es ist einfach einfacher, IPI an alle zu senden.

Ein anderes Szenario könnte ein Mehrkernsystem sein, bei dem Sie Arbeit oder Nachrichten an einen "freien" Kern übergeben, um die Last zu bewältigen. Der "freie" Kern könnte der aktuelle Kern sein, wieder wollen Sie keinen speziellen Fall in der Software haben, nur weil Sie einen Interrupt an sich selbst senden.

+0

Beide Gründe sind falsch, denke ich. Jeder logische Prozessor (also jeder Kern) hat seinen eigenen lokalen APIC. Dies bedeutet, dass nur ein Eigen-IPI von dem bestimmten Kern empfangen wird, der es gesendet hat.Zweitens gibt es eine spezielle Ziel-Kurzschrift, die zum Senden einer IPI an alle lokalen APICS in einem System, das sich selbst enthält, verfügbar ist. – jmiller

+0

Bitte lesen Sie noch einmal, weil ich nur einen Grund für die Eigen-IPI (Konsistenz) und zwei Beispiele für die Konsistenz angegeben habe. –

2

Es gibt noch einen weiteren Grund für das Selbst-IPI.

Wenn Sie einen SMI-Handler initialisieren, wird er zuerst auf eine niedrige Adresse in RAM gesetzt. Der gesamte CPU-Status wird im SMI gespeichert. Alle CPUs verwenden jedoch anfangs den gleichen Statusbereich und die neue verschobene Adresse wird durch Manipulation einer Statusvariablen festgelegt.

In diesem Fall möchten Sie den ersten SMI zu einer Zeit an eine CPU senden. Wenn Sie es an alle senden, werden alle denselben Bereich für die Speicherung des Status verwenden, und das wird eine Katastrophe sein.

Es ist praktisch, die gleiche Initialisierungsroutine für die SMI-Handler-Verlagerung für alle CPUs zu verwenden, damit Sie den SMI-Typ für die Eingabe des SMI-Verschiebungscodes mit dem Self-IPI verwenden können.

Der BSP kann den SMI IPI selbst und dann einen AP zu der Zeit senden. Sie werden dann nacheinander in nicht in Konflikt stehende Bereiche verlegt.

Ich bin sicher, dass es viele andere Situationen gibt, in denen ein Self-IPI benötigt wird. Wenn sich die CPUs wie in dem anfänglichen SMI-Zustand einen kritischen Bereich teilen, ist der Eigen-IPI für die Konsistenz motiviert.

2

Ich vermute, Sie haben den Grund bereits seit 2 Jahren bekannt.

Aber hier ist mein Verständnis:

IPI blockiert werden kann, wenn IRQ deaktiviert ist, wird es durch die IOAPIC gehalten wird, bis der Kern bestimmt wieder aktiviert IRQ mit einer sti Anweisung. Ein int-Befehl fängt die CPU jedoch immer in einem niedrigeren Ringlevel ein, unabhängig davon, ob IRQ aktiviert ist oder nicht.

Also vielleicht ist Self-IPI benötigt, wenn der Kernel etwas tun will, aber nicht jetzt, wenn der IRQ deaktiviert ist. Daher sendet es sich selbst ein IPI, wodurch ein solcher Interrupt stattfindet, sobald der IRQ auf diesem Kern wieder aktiviert wird.

Verwandte Themen