-
ERFINDUNGSHINTERGRUND
-
Erfindungsgebiet
-
Die
Erfindung betrifft im allgemeinen Vorrichtungen und Verfahren zum
Bereitstellen von Unterbrechungen in Computersystemen und insbesondere
Unterbrechungssystemen in Computersystemen, die objektorientierte
Software einsetzen.
-
Beschreibung des Stands der
Technik
-
Computersysteme
arbeiten im allgemeinen, indem sie eine Abfolge von spezifischen
Anweisungen ausführen,
die in „Programmen" enthalten sind,
die im Speicher gespeichert sind. Der Computer muß jedoch auch
auf zufällig
auftretende externe und interne Ereignisse, die „Unterbrechungen" genannt werden,
antworten, wie etwa das Drücken
einer Taste auf einer Tastatur durch einen Nutzer oder das Signalisieren
eines Druckers, daß er
mehr Daten zum Drucken benötigt.
Der Computer muß die
normale Verarbeitung unterbrechen und zeitweise den Steuerfluß von dem
gespeicherten Programm zu einem anderen Programm abgeben, das „Unterbrechungssteuerungsfunktion" genannt wird.
-
Die
Unterbrechungsbearbeitung wird durch die Betriebssystem(„OS")-Software sowohl
von Computer ausgeführt,
die traditionelle Software ausführen,
die als „prozedurale
Programmierung" bezeichnet
wird, als auch von neueren Systemen, die Software verwenden, die
mittels objektorientierter Programmiertechniken entwickelt wurde.
Objektorientierte Unterbrechungsbehandlungssysteme haben eine Anzahl
von Beschränkungen,
die sowohl die Übertragbarkeit
als auch die Leistung des OS beeinträchtigen. Das bedeutet, daß es erstrebenswert
wäre, ein
Unterbrechungssystem bereitzustellen, um es zu ermöglichen,
Betriebssysteme mit vielen verschiedenen CPU zu verwenden. Darüber hinaus
wäre es
erstrebenswert, erhöhte
Geschwindigkeit und Effizienz bei der Steuerung von Unterbrechungen
durch das Betriebssystem bereitzustellen. Die Vorrichtungen und
Verfahren der vorliegenden Erfindung sind entworfen, um alle diese
gegenwärtigen
Beschränkungen
zu überwinden,
um ein übertragbares
und sehr leistungsfähiges
Unterbrechungsbehandlungssystem anzugeben.
-
Das
US-Patent 5 568 644 offenbart
ein Computersystem mit einer Unterbrechungsdispatcher-Vorrichtung. Die
Dispatcher-Vorrichtung ist zum Ermitteln von Unterbrechungsquellen
von Einrichtungen vorgesehen, die eine Unterbrechungsanforderung
an den Prozessor des Computersystems ausgegeben hat. Die Unterbrechungsvorrichtung
umfaßt
einen Unterbrechungsquellenbaum und einen Unterbrechungsdispatcher.
Jede Ebene des Unterbrechungsquellenbaums stellt eine Charakterisierung
einer Einrichtung dar, welche die Unterbrechung erzeugt (Unterbrechungsquelle).
Der Unterbrechungsdispatcher durchquert den Unterbrechungsquellenbaum,
um die Unterbrechungsquelle zu identifizieren und ein Unterbrechungsbearbeitungsprogramm oder
Unterbrechungsroutinen für
die erwähnte
Einrichtung aufzurufen.
-
Das
US-Patent 5 680 624 offenbart
eine objektorientierte hardware-unabhängige Schnittstelle zur Bearbeitung
von Unterbrechungen, die von I/O-Einrichtungen hervorgerufen werden.
Die Unterbrechungen, die von Einrichtungen hervorgerufen werden,
werden mit einem Unterbrechungsverwaltungsprogramm und Unterbrechungsbedienungsprogrammen
auf zwei Ebenen bearbeitet, nämlich
in einer Eltern/Kind-Beziehung. Durch die Verwendung eines solchen
Designs verschwindet die Notwendigkeit für eine Konfigurationsdatenbank.
Die Unterbrechungsbedienungsprogramme werden auf Anforderung eines
zugehörigen
Zugriffsverwaltungsprogramms installiert und/oder entfernt.
-
ERFINDUNGSABRISS
-
Zusätzliche
Merkmale und Vorteile der Erfindung werden in der Beschreibung angegeben,
die nun folgt, und werden teilweise aus der Beschreibung deutlich
oder können
durch die Anwendung der Erfindung erlernt werden. Die Ziele und
weitere Vorteile der Erfindung werden durch die Verfahren, Vorrichtungen
und gefertigten Produkte, die in der schriftlichen Beschreibung
und ihren Ansprüchen
sowie in den beigefügten Zeichnungen
beschrieben sind, verwirklicht und realisiert.
-
Um
diese und andere Vorteile zu erreichen, und in Übereinstimmung mit dem Ziel
der Erfindung, wie er ausgeführt
und allgemeinen beschrieben ist, stellt die Erfindung ein Verfahren
zur Verarbeitung von Unterbrechungen in einem objektorientierten
Computersystem mit einer CPU, einem Speicher, der einen Microkernel
enthält,
mehreren Einrichtungen, die Quellen bilden, die in der Lage sind,
Unterbrechungen zu erzeugen, mehreren Treibern, wovon jeder mit
wenigstens einer der Quellen verknüpft ist, und einer Systemdatenbank bereit.
Das Verfahren umfaßt
die Schritte des Erzeugens eines Einrichtungseintrages in der Datenbank
für jede der
Einrichtungen, des Erzeugens eines Unterbrechungsquellenbaums in
der Datenbank mit mehreren Quellenbaumeinträgen, von denen jeder ein Objekt
enthält,
das eine der Quellen darstellt, und des Implementierens einer Unterbrechungsregistrierungsschnittstelle,
was Verfahren umfaßt,
die Softwarekomponenten zur Unterbrechungsbehandlung installieren
und entfernen, die mit jeder Quelle in einem entsprechenden Quellenbaumeintrag
verknüpft
sind. Das Verfahren umfaßt
weiter die Schritte des Querverweisens von jedem der Einrichtungseinträge auf einen
entsprechenden der Quellenbaumeinträge, des Antwortens auf eine
von einer Einrichtung erzeugte Unterbrechung, indem die Ausführung eines
einzelnen Unterbrechungsdispatchers veranlaßt wird, und durch Identifizieren
der Einrichtung an den Unterbrechungsdispatcher und des Bearbeitens
der Unterbrechung mit einem Bedienungsprogramm, das von dem Unterbrechungsdispatcher
aufgerufen wird und der identifizierten Einrichtung entspricht.
-
Unter
einem anderen Gesichtspunkt umfaßt die Erfindung eine Vorrichtung
zur Verarbeitung von Unterbrechungen in einem objektorientierten
Computersystem mit einer CPU, mehreren Einrichtungen, die Quellen
bilden, die in der Lage sind, Unterbrechungen zu erzeugen, und mehreren
Treibern, von denen jeder mit wenigstens einer der Quellen verknüpft ist.
Die Vorrichtung umfaßt
mehrere Softwarekomponenten zur Unterbrechungsbehandlung, die von
den Treibern unterstützt
werden, von denen jeder mit einer Unterbrechungsquelle verknüpft ist;
einen Speicher, der eine Datenbank mit Einrichtungseinträgen für jede der
Einrichtungen enthält
und einen Unterbrechungsquellenbaum, der mehrere Unterbrechungsquellenbaumeinträge enthält, von
denen jeder ein Objekt enthält,
das wenigstens eine der Quellen darstellt und auf einen entsprechenden Einrichtungseintrag
querverweist, wobei jeder der Unterbrechungsquellenbaumeinträge einen
Verweis auf wenigstens eine der Softwarekomponenten zur Unterbrechungsbehandlung
aufweist; und einen einzelnen Unterbrechungsdispatcher zum Antworten
auf eine Unterbrechung, die von der CPU identifiziert wurde, durch
Ausführung
einer entsprechenden Softwarekomponente zur Unterbrechungsbehandlung,
die von einem Unterbrechungsquellenbaumeintrag spezifiziert wird,
welcher der identifizierten Einrichtung entspricht.
-
Es
versteht sich, daß sowohl
die vorangegangene allgemeine Beschreibung als auch die folgende
detaillierte Beschreibung beispielhaft und erläuternd sind und eine weitere
Erklärung
der Erfindung, wie sie beansprucht ist, bereitstellen sollen.
-
Die
beigefügten
Zeichnungen sind enthalten, um ein besseres Verständnis der
Erfindung bereitzustellen, und sind in dieser Patentschrift eingeschlossen
und bilden ein Teil von ihr, stellen eine Ausführung der Erfindung dar und
dienen zusammen mit der Beschreibung dazu, die Prinzipien der Erfindung
zu erklären.
-
KURZE BESCHREIBUNG DER ZEICHNUNGEN
-
Bei
den Zeichnungen ist:
-
1 ein
Hardware-Blockdiagramm eines Computersystems, das die vorliegende
Erfindung verkörpert;
-
2 ein
Diagramm der objektorientierten Software des Computersystems von 1;
-
3 ein
Diagramm, das ein Beispiel der Beziehung zwischen Unterbrechungsquellen
zeigt;
-
4 ein
Diagramm, das einen Abschnitt eines Unterbrechungsquellenbaums zeigt,
der zu dem Beispiel von 3 gehört;
-
5 ein
Beispiel einer Bus-Unterbrechungsquelleneintrags ist;
-
6 ein
Diagramm, welches das Querverweisen zwischen dem Unterbrechungs-
und dem Einrichtungsnamensraum zeigt;
-
7 ein
Diagramm, das die Beziehung zwischen der Software und verschiedenen
Ebenen des Unterbrechungsquellenbaums darstellt;
-
8 ein
Diagramm, das die Synchronisation der Unterbrechungsbehandlung darstellt;
-
9 ein
Diagramm, welches das Konzept der zurückgestellten Unterbrechungsbehandlung
darstellt;
-
10 ein
Diagramm, das einen Unterbrechungsdispatcher und seine Beziehung
zu Laufzeit- und
Microkernel-Software zeigt;
-
11 ein
Diagramm, das Bus- und Vorrichtungsunterbrechungssteuerungen zeigt;
-
12 Diagramm
ist, das die Unterbrechungsquellen-Klassenhierarchie zeigt; und
-
13 Diagramm
ist, das Verbesserungen der Leistung einer Ethernet-Lese-Unterbrechungsoperation
durch die vorliegende Erfindung darstellt.
-
DETAILLIERTE BESCHREIBUNG
DER BEVORZUGTEN AUSFÜHRUNGEN
-
Die
Erfindung ist in einem objektorientierten Betriebssystem enthalten.
Die offenbarte Ausführung
ist in der Java-Programmierumgebung implementiert, die durch Sun
Microsystems Inc. bereitgestellt wird. Die Erfindung ist jedoch
nicht in dieser Hinsicht beschränkt
und kann in anderen Computersystemen umfaßt sein, wie vom Fachmann ersehen
wird. Sun, Sun Microsystems, das Sun-Logo, Java und Java-basierte
Warenzeichen sind Warenzeichen oder eingetragene Warenzeichen von
Sun Microsystems Inc. in den U.S.A. und anderen Ländern.
-
Nun
wird auf eine Implementierung im Detail Bezug genommen, die mit
der vorliegenden Erfindung übereinstimmt,
wie in den Zeichnungen dargestellt ist. Wo immer dies möglich ist,
werden die gleichen Bezugszeichen in allen Zeichnungen und der folgenden
Beschreibung verwendet, um die gleichen oder ähnliche Teile zu bezeichnen.
-
Die 1 zeigt
eine Computersystem 10, das zur Verwendung mit der vorliegenden
Erfindung geeignet ist. Das Computersystem 10 umfaßt eine
Hauptprozessoreinheit (CPU) 12, die beispielsweise einen
Sun SPARC, einen Motorola Power PC oder einen Intel Pentium aufweisen
kann. Das Computersystem 10 kann eine breite Auswahl von
Computereinrichtungen darstellen. Zum Beispiel kann das System 10 einen
Standard-Personalcomputer darstellen, wie er allgemein privat oder
im Büro
verwendet wird. Alternativ kann das System 10 ein viel
spezialisiertes „intelligentes" System, wie etwa
eine Set-Top-Box zur Verwendung in einem hochauflösenden Fernsehgerät, oder
ein multifunktionales Mobiltelefon sein.
-
Eine
CPU 12 ist mit einem Speicher 14 verbunden, der
verschiedene Arten von Speicher, wie etwa Arbeitsspeicher (RAM)
und Festwertspeicher (ROM), umfaßt. Die CPU 12 ist
auf mit einem Erweiterungsbus 16 verbunden, der beispielsweise
ein PCI-Bus sein kann. Verschiedene Arten von Eingangs- und Ausgangseinrichtungen 19, 20 und 22 sind
mit dem Bus 16 verbunden. Die Eingangseinrichtung 18 kann
beispielsweise ein Modern oder eine Netzwerkschnittstellenkarte
sein, die das System 10 mit einer Telefonleitung oder einem lokalen
Netzwerk verbindet. Die Eingangseinrichtung 20 kann beispielsweise
eine Tastatur sein und die Ausgangseinrichtung 22 kann
beispielsweise ein Drucker sein. Das System 10 kann optional
eine Massenspeichereinrichtung 24 umfassen, wie etwa eine
Festplatte, die über
einen I/O-Bus 26 angeschlossen ist, der beispielsweise
ein SCSI-Bus sein kann. Das System 10 umfaßt auch
eine direkte Speicherzugangs(DMA)-Steuerung 23, die von
der CPU 12 gesteuert wird und eine direkte Datenübertragung
zwischen dem Speicher 14 und dem PCI-Bus 16 bereitstellen
kann.
-
Bezieht
man sich nun auf 2, so wird ein Diagramm von
Software gezeigt, die im Speicher 14 von 1 gespeichert
ist. Die 2 zeigt Software, die logisch
in einer Abfolge von Schichten angeordnet ist. Eine oberste Schicht 30 ist „plattform-unabhängig." Der Begriff „Plattform" bezieht sich im
allgemeinen auf eine CPU, physischen Speicher und dauerhaft verbundene
Einrichtungen und Busse. Demnach ist die Software, die in der plattform-unabhängigen Schicht 32 enthalten
ist, in einer solchen Art geschrieben, daß sie mit jeder Plattform,
basierend auf jeder CPU, die entweder existiert oder in der Zukunft
entwickelt wird, ohne Modifikationen verwendet werden kann. Eine
zweite Schicht 34 ist plattformabhängig. Demnach muß die Software
der Schicht 34 für
die spezielle Plattform des Computersystems 10 angepaßt werden.
-
Die
plattform-unabhängige
Schicht 32 umfaßt
eine Anwendungsprogrammschicht 36, die spezifische Operationen
für den
Nutzer ausführt,
wie etwa Desktop-Publishing, Behandlung eines Telefonanrufs oder
Datenbankverwaltung. Die Anwendungsschicht 36 ist mit einem
Laufzeitsystem 38 verbunden, das eine Komponente umfaßt, die
als „Java
Virtual Machine" (JVM)
bezeichnet wird. Die JVM ist eine Softwarekomponente, die Anweisungen
in Form von maschinenunabhängigen
Bytecodes empfangt, die von Anwendungsprogrammen erzeugt werden,
und die Bytecodes interpretiert. Die JVM ist mit einer besonderen
Plattform verbunden, um erwünschte
Funktionen auszuführen.
Die offenbarte Ausführung
verwendet eine Java Virtual Machine, aber andere Arten von virtuellen
Maschinen sind verwendbar, wie dem Fachmann bekannt ist. Der Betrieb
der JVM ist dem Fachmann bekannt und wird beispielsweise in dem
Buch Java! von Tim Ritchey, das von New Riders Publishing in Indianapolis,
Indiana herausgebracht wird, und The Java Virtual Machine Specification von
Lindham und Yellin, Addison-Wellesley, 1997 behandelt.
-
Eine
Laufzeitschicht 40 umfaßt auch einen Einrichtungsschnittstellenabschnitt 42,
der den Betrieb von Einrichtungen, wie etwa Bussen 16 und 26 und
Einrichtungen 18, 20, 22 (1)
unterstützt.
Insbesondere umfaßt
die Einrichtungsschnittstelle 42 Einrichtungsverwaltungsprogramme 46 und
verschiedene Verwaltungsprogramme 48. Die Einrichtungsschnittstelle 42 umfaßt auch
Einrichtungstreiber 50, die objektorientierte Programme
sind, die für
jede der Einrichtungen 18, 20 und 22 geschrieben
sind. Man beachte, daß die
Einrichtungstreiber 50 in der plattform- unabhängigen Schicht 32 umfaßt sind,
und daher, wenn sie einmal geschrieben sind, verwendet werden könne, um
die Einrichtungen 18, 20 und 22 auf irgendeiner
Plattform, sowohl einer existierenden als auch einer, die in der
Zukunft entwickelt wird, zu verwenden. Ähnlich umfaßt die Einrichtungsschnittstelle 42 plattform-unabhängige Bus-Verwaltungsprogramme 53,
die objektorientierte Programme sind, die für Busse, wie etwa den PCI-Bus 16 und
den SCSI-Bus 26 von 1, geschrieben
sind. Die Einrichtungsschnittstelle 42 umfaßt Speicherklassen 52.
-
Die
Einrichtungsschnittstelle 42 umfaßt auch einen Systemlader 54 und
eine Systemdatenbank, die den Betrieb des Computersystems unterstützen. Die
Systemdatenbank 56 erlaubt es Anwendungssoftware, Konfigurationsinformation
auf dem Computersystem 10 zu speichern und abzurufen. Insbesondere
enthält
die Systemdatenbank 56 Konfigurationsinformation für Einrichtungen,
die anwesend sind, die System-Softwaredienste installiert sind,
die Nutzer- und Gruppeneigenschaften ausgewählt wurden und jede benötigte anwendungsspezifische
Information. In der beschriebenen Ausführung wird die Systemdatenbank
als Java-Systemdatenbank („Java
System Database,” JSD)
bezeichnet.
-
Das
Laufzeitsystem 38 umfaßt
zusätzliche
Funktionen 58, die Operationen unterstützen, wie etwa Eingang/Ausgang,
Netzwerkoperationen, Graphik, Drucken, Multimedia etc.
-
Die
plattformabhängige
Schicht 34 umfaßt
eine Plattformschnittstelle 60, eine OS-spezifische Schicht 61,
einen Microkernel 62 und eine Bootschnittstelle 64.
Die Plattformschnittstelle 60 umfaßt Funktionsbibliothek-Bedienungsprogramme
der virtuellen Maschine 66, die in der Java-Programmiersprache
geschrieben sein können,
um Unterstützung
für System-Funktionsaufrufe
bereitzustellen, die von der virtuellen Maschine 40 empfangen
werden. Die Plattformschnittstelle 60 umfaßt weiter
Unterbrechungsklassen 68, die auch in der Java-Programmiersprache
geschrieben sind und Unterbrechungsoperationen des Computersystems 10 und des
Bus-Verwaltungsprogramms 44 unterstützen. Schließlich umfaßt die Plattformschnittstelle 60 Direkter-Speicherzugangs(DMA)-Klassen 70 und
Speicherklassen 72, die beide in der Java-Programmiersprache geschrieben
sind.
-
Der
Microkernel 62 besteht aus Softwarekomponenten, die in
einer Sprache geschrieben sind, die für die CPU spezifisch ist („native
Sprache") und die
grundlegende maschinennahe Hardwarefunktionen der CPU 12 unterstützt, wie
etwa Ressourcenzuteilung, Unterbrechungsvorgänge, Sicherheit etc. Insbesondere
umfaßt der
Microkernel 62 eine Mehrzahl von Kernelfunktionen 74 einschließlich Threadverwaltung,
Ausnahmen, Zeitsteuerung, physische Speicherverwaltung, Hardware-Unterbrechungsbearbeitung,
Plattformsteuerung, Prozeßverwaltung,
Bibliothek-Verwaltung, I/O-Unterstützung und Bildschirmfunktionen.
Diese Funktionen können durch
den Chorus-Microkernel ausgeführt
werden, der im Handel von Sun Microsystems erhältlich ist. Der Microkernel 62 umfaßt auch
Debug-Funktionen 76, native Unterbrechungsmethoden 78,
native DMA-Methoden 80 und native Speichermethoden 82.
-
Die
letzte Komponente der plattform-unabhängigen Schicht 34 ist
die Bootschnittstelle 64. Die Bootschnittstelle 64 sorgt
für das
Laden und Initialisieren der Software in den Speicher 14 (1),
wenn das Computersystem 10 anfangs hochgefahren wird. Die
Bootschnittstelle 64 kann Software laden, die beispielsweise in
einer Floppydisk oder dem Massenspeicher 24 (1)
gespeichert ist oder von einem Netzwerk über die Eingangseinrichtung 18 empfangen
wird.
-
Als
nächstes
wird eine allgemeine Beschreibung eines Verfahrens zur Verarbeitung
von Unterbrechungen beschrieben. Wenn die Software für das Computersystem 10 geladen
ist, konstruieren die Bootschnittstelle 64 und die Bus-Verwaltungsprogramme 44 eine
Systemdatenbank. Die Systemdatenbank umfaßt einen Einrichtungsnamensraum
und einen Unterbrechungsnamensraum. Der Einrichtungsnamensraum wird ebenfalls
von der Bootschnittstelle 64 und den Bus-Verwaltungsprogrammen 44 erzeugt
und enthält
Einträge in
Form von Objekten für
die CPU, für
jeden der Busse und für
jede der Einrichtungen des Computersystems 10. Der Unterbrechungsnamensraum
wird von der Softwarekomponente zur Unterbrechungsbehandlung 45 erzeugt
und enthält
einen Eintrag in Form eines Objekts für jede der Unterbrechungsquellen,
also für
jede Einrichtung oder jeden Bus, der oder die fähig ist, eine Unterbrechung
zu erzeugen.
-
Die
Objekte des Unterbrechungsnamensraums sind in Form eines Unterbrechungsquellenbaums
organisiert, in dem jedes Objekt ein Unterbrechungsquelleneintrag
(ISE) ist. Jeder Eintrag des Einrichtungsnamensraums wird mit einem
ISE, das heißt
einem Eintrag in dem Unterbrechungsnamensraum, querverwiesen.
-
Jeder
ISE umfaßt
einen Verweis auf eine oder mehrere Komponenten des Unterbrechungsbearbeitungsprogrammcodes.
Diese Komponenten umfassen Unterbrechungsbedienungsprogramme, Unterbrechungsermöglicher,
Unterbrechungsverhinderer und Unterbrechungsbestätiger, die von den Einrichtungstreibern
zugeführt
werden.
-
Wenn
eine Unterbrechung auftritt, erzeugt der Microkernel einen Unterbrechungsvektor,
der die Einrichtung identifiziert, welche die Unterbrechung hervorgerufen
hat, einen Unterbrechungsdispatcher ausführen läßt und den Dispatcher mit dem
Unterbrechungsvektor versorgt. Der Unterbrechungsdispatcher versieht
den Einrichtungsnamensraum der Systemdatenbank mit Verweisen und
ermittelt den Eintrag darin, der zu der Einrichtung gehört, die
von dem Unterbrechungsvektor identifiziert wird. Der Unterbrechungsdispatcher
ermittelt dann den ISE, der auf die identifizierte Einrichtung querverweist
und ermittelt das Unterbrechungsbedienungsprogramm, das von dem
ISE spezifiziert wurde, um die Unterbrechung von der identifizierten
Einrichtung zu verarbeiten. Der Unterbrechungsdispatcher läßt dann
das ermittelte Unterbrechungsbedienungsprogramm ausführen.
-
Das
Material unten stellt einen Überblick über die
Unterbrechungsklassen und -schnittstellen bereit, die einen Teil
der vorliegenden Erfindung bilden und die den oben beschriebenen
Vorgang implementieren. Der erste Abschnitt beschreibt, wie eine
Unterbrechungsquelle (d. h. eine Einrichtung, ein Bus oder eine
CPU) abstrakt dargestellt und dann Treibern bekanntgegeben wird.
Der zweite Überblicksabschnitt
beschreibt, die Arten von Programmcode mit einer Einrichtung, die
eine Unterbrechung auslöst,
verknüpft
werden können
und wie Programmcode registriert wird, um Unterbrechungen zu verarbeiten
und zu verwalten. Der dritte Überblicksabschnitt
beschreibt, wie Unterbrechungsbedienungsprogramme koordiniert und
synchronisiert werden. Der vierte Überblicksabschnitt beschreibt,
wie Unterbrechungsbedienungsprogramme in Antwort auf eine Unterbrechung
zugeteilt werden.
-
Abstrahieren von Unterbrechungsquellen
-
Unterbrechungsquellenobjekte
-
Eine
Unterbrechung ist ein Mittel, durch das eine Einrichtung Aufmerksamkeit
von Software, wie etwa einem Einrichtungstreiber, anfordert. Eine
Einrichtung kann in der CPU eingebettet sein, direkt mit dem externen
Bus der CPU verbunden sein oder mit einem anderen Erweiterungsbus
wie dem PCI verbunden sein. Die vorliegende Erfindung repräsentiert
jede Einrichtung, die zur Unterbrechung fähig ist, als eine Unterbrechungsquelle.
-
Unterbrechungsquellen
sind mit anderen Unterbrechungsquellen verknüpft. Eine Einrichtung auf dem Bus
der CPU unterbricht beispielsweise die CPU auf einer CPU-spezifischen
Ebene. Die Unterbrechungsebene der CPU ist eine Quelle der Unterbrechung,
wie auch die Einrichtung selbst. Wenn eine Einrichtung auf einem
PCI-Bus eine Unterbrechung erzeugt, wird das Signal über eine
oder mehrere Bus-Brücken
weitergeleitet, bis die CPU selbst unterbrochen wird.
-
Die
Topologie der Unterbrechungsweiterleitung und die Einrichtungstopologie ähneln einander,
sind aber nicht immer identisch. Wegen der möglichen Unterschiede zwischen
der Einrichtungs- und
Unterbrechungstopologie wird eine eigene Klasse von Objekten benötigt, um
eine Unterbrechungsquelle zu repräsentieren.
-
Die
vorliegende Erfindung erzeugt Unterbrechungsquellenobjekte, um die
CPU, jede der CPU-Ebenen und
jede der Bus-Einrichtung-Kombinationen, die eine Ebene verwendet,
zu repräsentieren. 3 stellt
das Konzept eines Unterbrechungsquellenobjekts für die CPU, jede der CPU-Ebenen
(2 in diesem Fall), eine Bus-Unterbrechungsquelle und zwei Einrichtungsunterbrechungsquellen
dar.
-
Organisation der Unterbrechungsquellenobjekte
-
Die
Unterbrechungsklassen der vorliegenden Erfindung verwalten den Satz
von bekannten Unterbrechungsquellen. Der Satz von aktiven und möglichen
Unterbrechungsquellenobjekten sind in einer hierarchischen Weise
in dem Unterbrechungsnamensraum der JSD organisiert.
-
Unterbrechungsquellenbaum (IST)
-
Der
Unterbrechungsnamensraum (im folgenden als der Unterbrechungsquellenbaum
(oder IST) bezeichnet) wird in der Java-Systemdatenbank (JSD) im
voraus erzeugt. Jeder JSD-Eintrag in dem Unterbrechungsquellenbaum
repräsentiert
eine Einrichtung, die fähig
ist, Aufmerksamkeit über
eine Unterbrechung anzufordern. Jede Ebene des IST repräsentiert
eine feinere und feinere Granularität der Unterbrechungsquellen von
der CPU (die Baumwurzel) über
die CPU-Ebenen und Busse (Elterneinträge) bis schließlich zu
den Einrichtungen (Blatteinträge).
-
Die
Repräsentation
von Unterbrechungsquellen mittels eines Baumes, der sich vom Einrichtungsbaum
unterscheidet, hat seine Vorteile. Die Unterbrechungsweiterleitung
folgt beispielsweise nicht immer der Verbindung von der Einrichtung
zum Bus. Manche Plattformen benötigen
Software, um Unterbrechungsinformationen weiterzuleiten und zu decodieren,
während
andere komplizierte Hardwarehilfseinrichtungen aufweisen.
-
Das
Design von Einrichtungstreibern und Bus-Verwaltungsprogrammen, um
alle die verschiedenen Kombinationen von Unterbrechungs-Decodierungs-
und Dispatchlogik zu verarbeiten ist eine beinahe unlösbare Aufgabe.
Der IST wirkt als ein Puffer, der übertragbare Einrichtungstreiber-
und Bus-Verwaltungssoftware von der Unterbrechungshardware der Plattform
isoliert und schützt.
-
Jede
Plattform kann einen unterschiedlich geformten Baum benötigen, um
die Logik und den Fluß der Unterbrechungsverarbeitung
zu vermitteln. Der IST erlaubt es Plattformdesignern, die neuesten
und besten Unterbrechungscontroller zu verwenden, ohne die Sorge,
daß ein
Treiber abstürzt.
Einrichtungstreiber greifen nie auf Unterbrechungscontroller zu,
die mit einer CPU (d. h. einem PIC) oder einem Bus-Brückencontroller verbunden
sind.
-
Die 4 zeigt,
wie das vorangegangene Beispiel von verknüpften Unterbrechungsquellen
(siehe 3) in dem IST repräsentiert ist.
-
Unterbrechungsquelleneinträge (ISE)
-
Jede
Unterbrechungsquelle wird mittels eines JSD-Eintrags repräsentiert,
der als ein Unterbrechungsquelleneintrag (ISE) bezeichnet wird.
ISE sind Java-Objekte, auf die (manchmal gleichzeitig) sowohl von
Java als auch von nativem Programmcode zugegriffen wird.
-
Eine
Unterbrechungsquelleneintrag bildet eine Subklasse der SystemEntry-Klasse
der JSD.
import java.system.database. Entry;
public InterruptSourceEntry
extends SystemEntry implements interruptRegistration (...)
-
Die
JSD implementiert eine Unterbrechungsregistrierungsschnittstelle,
die aus Methoden besteht, die vom Treiber gelieferten Programmcode
installiert und entfernt.
-
Wenn
ein ISE erzeugt wird, um einen Bus zu repräsentieren, muß die maximale
Anzahl von zugehörigen
Kinder(oder Einrichtungs-)-ISE festgelegt werden. Das vorherige
Erzeugen von freien Kinder-„Steckplätzen” bringt
eine Anzahl von Vorteilen für
den nativen Programmcode mit sich, der auf einen ISE auf der Hardware-Unterbrechungsebene
zugreifen muß.
-
Der
erste Vorteil für
den nativen Programmcode liegt darin, daß aller Speicher, der mit dem
Objekt verbunden ist, leicht verriegelt werden kann, um Seitenfehler
zu verhindern. Die meisten Microkernel können die Behandlung von Seitenfehlern
auf der Unterbrechungsebene nicht unterstützen.
-
Zweitens
kann ein Bus-ISE Verweise auf Einrichtungs-ISE in einem vorher erzeugten
Vektor speichern, anstatt den Verbundlistenansatz von SystemEntry
zu verwenden. Die Verwendung eines Vektors in einem ISE erlaubt
es, daß die
Bus-Verwaltungsprogramme die Kindereinrichtungen numerieren und
diese Nummer als einen Vektorindex verwenden. Dies ist auf der Hardware-Unterbrechungsebene
besonders wichtig. Das Indizieren in einen Vektor mittels JNI ist
viel einfacher als das Betreiben einer Verbundliste.
-
Die 5 stellt
einen Vektor von Kinder-ISE eines Bus-ISE dar.
-
Konstruktion des IST
-
Der
IST wird dynamisch gebaut, wenn das JavaOS die Plattform initialisiert.
Zuerst erzeugt das Plattform-Verwaltungsprogramm die Wurzel des
Unterbrechungsnamensraums und installiert sich selbst als Verwaltungsprogramm
dieses Namensraums (Siehe die JSD-Spezifikation bezügliche des
Namensraum-Verwaltungsprogramms). Als nächstes erzeugt das Plattform-Verwaltungsprogramm
einen einzelnen Wurzel-CPU-Unterbrechungsquelleneintrag (ISE) und
fährt dann
fort, um ein Kinder-ISE für
jede der CPU-Unterbrechungsebenen (die auf dieser Plattform zur
Unterbrechung fähig
sind) zu erzeugen.
-
Koordinierung des Einrichtungs-
und des Unterbrechungsnamensraums
-
Wenn
das Einrichtungsverwaltungsprogramm Einrichtungen mit Treibern und
Busse mit Bus-Verwaltungsprogrammen
verbindet, wächst
der Baum, und Bedienungsprogramme werden installiert. Das Plattform-Verwaltungsprogramm
und jeder der Bus-Verwaltungsprogramme, der aktiviert wird, läßt den Baum durch
das Hinzufügen
von Kinder-Unterbrechungsquelleneinträgen wachsen. Jeder neue Kinder-ISE
querverweist mittels einer JSD-Eigenschaft auf einen Einrichtungseintrag
in dem Einrichtungsnamensraum. Die 6 stellt
dar, wie der Einrichtungs- und
der Unterbrechungsnamensraum aufeinander querverweisen.
-
IST-Topologie und -Verwaltung
-
Das
Plattform-Verwaltungsprogramm, jeder der Bus-Verwaltungsprogramme
und jeder Treiber beeinflussen sich mit den ISE und dem IST in irgendeiner
Weise.
-
Das Plattform-Verwaltungsprogramm
erzeugt CPU und CPU-Ebenen
-
Das
Plattform-Verwaltungsprogramm erzeugt den Unterbrechungsnamensraum
und erzeugt dann ein einzelnes CPU-Objekt und mehrere Objekte auf
CPU-Ebene. Jede JavaOS-Plattform wird mit eingebauten Bedienungsprogrammen
(nativ und in Java) für
jede der CPU-Ebenen geliefert.
-
Das Bus-Verwaltungsprogramm
läßt den IST
wachsen und schrumpfen
-
Bus-Verwaltungsprogramme,
einschließlich
des CPU-Bus-Verwaltungsprogramms (d. h. des Plattform-Verwaltungsprogramms),
pflegen den IST auf Veranlassung der Treiber und anderer Bus-Verwaltungsprogramme.
Für jede
der Einrichtungen unter der Steuerung eines Bus-Verwaltungsprogramms wird mindestens
ein Eintrag in der IST erzeugt, um die Unterbrechungsquelle dieser
Einrichtung zu repräsentieren.
-
Die Einrichtungstreiber verwenden
Einträge
in den ISE
-
Treiber
konstruieren Unterbrechungsquellenobjekte und weisen das passende
Bus-Verwaltungsprogramm
an, es in dem IST zu installieren. Die 7 stellt
dar, welcher Programmcode welche Ebenen des IST verwaltet.
-
Unterbrechungsprogrammcode-Registrierung
-
Dieser
zweite Überblicksabschnitt
beschreibt, wie Programmcode in Bedienungsprogrammen registriert
wird und Unterbrechungen behandelt.
-
Unterbrechungsprogrammcode-Arten
-
Vier
Arten von Programmcode können
in einem Unterbrechungsquelleneintrag registriert werden:
Unterbrechungsbedienungsprogramme,
Unterbrechungsermöglicher,
Unterbrechungsverhinderer und Unterbrechungsbestätiger.
-
Ein
Unterbrechungsbedienungsprogramm wird in Antwort auf eine Unterbrechung
ausgeführt.
Seine Aufgabe ist es, die Anforderung von Aufmerksamkeit durch die
Einrichtung zu befriedigen, alle Echtzeitdaten zu sichern und die
Steuerung so schnell wie möglich
an das Betriebssystem zurückzugeben.
Die vorliegende Erfindung sieht drei Arten von Unterbrechungsbedienungsprogrammen
vor, wie unten ausgeführt
ist.
-
Ein
Unterbrechungsermöglicher
bringt die Einrichtung in einen Zustand, in dem Unterbrechungen möglich oder
unmaskiert sind. Ein CPU-Unterbrechungsermöglicher gibt alle Unterbrechungen
frei, die den CPU-Unterbrechungscontroller (intern oder extern)
teilen. Ein Ermöglicher
auf CPU-Ebene demaskiert nur eine einzige Ebene von Unterbrechungen.
Ein Bus- oder Einrichtungsermöglicher
demaskiert nur diese Unterbrechungen von dem Bus oder der Einrichtung.
-
Ein
Unterbrechungsverhinderer bringt die Einrichtung in einen Zustand,
in dem Unterbrechungen unmöglich
oder maskiert sind.
-
Ein
Unterbrechungsbestätiger
teilt der Hardware die Tatsache mit, daß das OS und/oder der Einrichtungstreiber
die Unterbrechung behandelt (oder bestätigt) hat. Die Bestätigung kann
stattfinden bevor oder nachdem ein Bedienungsprogramm tatsächlich zugeteilt
ist.
-
Unterbrechungsbedienungsprogramme
-
Die
vorliegende Erfindung weist drei Ebenen der Unterbrechungsverarbeitung
auf, wobei jede Ebene ein Bedienungsprogramm und einen Ausführungskontext
für diese
Art von Bedienungsprogramm definiert. Der Microkernel beobachtet
zwei der drei Ebenen von Unterbrechungsverarbeitung. Die dritte
(Java-zentrische) Ebene der Unterbrechungsverarbeitung wird von
der Java Virtual Machine mittels Java-Threads unterstützt.
-
Jede
Art von Bedienungsprogramm, das mit einer Unterbrechungsverarbeitungsebene
verknüpft
ist, läuft
in ihrem eigenen besonderen Ausführungskontext.
Eine einzige Unterbrechungsquelle kann keine, beliebige oder alle
dieser Arten von Bedienungsprogramm zugewiesen haben, um Unterbrechungen
zu bearbeiten, die als Gruppe von Unterbrechungsbedienungsprogrammen
arbeiten.
-
Jede
Ebene von Unterbrechungsverarbeitung kann ihren Zustand und ihre
Daten jeder anderen Ebene mittels des Unterbrechungsquelleneintrags
als eines gemeinsamen Datenaustauschpunktes mitteilen. Zwei dieser
Unterbrechungsverarbeitungsebenen sind zurückgestellt. Eine zurückgestellte
Unterbrechungsebene ist für
Nicht-Echtzeit-Bearbeitung wünschenswert
und wird nur durch nativen Programmcode ausgelöst.
-
Die
drei Arten von Unterbrechungsbearbeitung sind:
- • Native
Echtzeit-Unterbrechungsbearbeitung auf der ersten Ebene
- • Native
zurückgestellte
Unterbrechungsbearbeitung auf der zweiten Ebene
- • Zurückgestellte
Java-Unterbrechungsbearbeitung auf der dritten Ebene
-
Bedienungsprogramme auf der
ersten Ebene
-
Die
erste Art von Unterbrechungsbedienungsprogrammen ist ein natives
Unterbrechungsbedienungsprogramm, das auf der CPU-Unterbrechungsebene
ausgeführt
wird. Dieses Bedienungsprogramm besteht auf nativem Programmcode,
der von 'C' kompiliert sein
kann. Dieses Bedienungsprogramm gehorcht den 'C'-Aufrufkonventionen,
die für
den Prozessor definiert sind, auch dann, wenn das Bedienungsprogramm
aus Assemblersprache besteht.
-
Beim
Einspringen in das Bedienungsprogramm der ersten Ebene hat der Microkernel
bereits die Prozessorregister gespeichert und kann auf einen separaten
Unterbrechungsstack umgeschaltet haben. Die Wahl, auf welchem Stapelspeicher
die Bedienungsprogramme der ersten Ebene ausgeführt werden, liegt beim Microkernel.
-
Viele
Microkernel weisen einen Unterbrechungsstack pro CPU für diesen
Zweck zu. Andere führen das
Bedienungsprogramm einfach auf dem Stack des laufenden Threads aus,
wobei sie den Stack nach der Fertigstellung der Verarbeitung des
Bedienungsprogramms abwickeln.
-
Der
Programmcode in dieser Art von Bedienungsprogramm wird ausgeführt, wenn
er von dem Microkernel aufgerufen wird. Der Ausführungskontext der Unterbrechungsebene
sieht die folgenden Unterstützungsdienste
für das
Bedienungsprogramm der ersten Ebene vor. Ein Unterbrechungsbedienungsprogramm der
ersten Ebene kann JNI (Java Native Interface) verwenden um:
- • Daten
in dem Unterbrechungsquellenobjekt zu lesen und zu schreiben.
- • Den
IST zu durchqueren und anschließend
andere Unterbrechungsbedienungsprogramme der ersten Ebene aufzurufen.
- • Dem
Objekt zu signalisieren, damit wartende Threads auf der zweiten,
dritten oder Hauptausführungsebene
laufen können.
-
Die
Aufgabe eines Bedienungsprogramms der ersten Ebene liegt darin,
die unmittelbaren Echtzeit-Anforderungen
einer Einrichtung zu erfüllen,
wie etwa das Lesen von Daten von einer Einrichtung mit begrenzten Pufferkapazitäten.
-
Nach
der Erfüllung
der Echtzeit-Anforderungen einer Einrichtung kann ein Unterbrechungsbedienungsprogramm
der ersten Ebene veranlassen, daß ein Bedienungsprogramm der
zweiten oder dritten Ebene von dem Microkernel in eine Warteschlange
gestellt werden. Ein Bedienungsprogramm der ersten Ebene kann wählen, ob
es den Zustand oder die Daten an zurückgestellte Bedienungsprogramme
der zweiten und dritten Ebene durch das Unterbrechungsquellenobjekt
mittels JNI weitergibt, um Daten in dem Objekt abzurufen oder zu
setzen.
-
Der 'C'-Funktionsprototyp des Bedienungsprogramms
entspricht dem eines nativen Methodenprototyps einer Unterbrechungsquelle
mit einem einzigen langen Parameter, der die aktuelle Zeit seit
dem Hochfahren in Mikrosekunden enthält. Das Bedienungsprogramm
gibt eine ganze Zahl zurück,
die signalisiert, ob die Unterbrechung von dem Bedienungsprogramm
bearbeitet wurde oder nicht. Ein natives Unterbrechungsbedienungsprogramm
auf CPU-Ebene ist wie folgt definiert:
typedef long firstLevelHandler(void*ise,
int64_t when);
-
Mehrere
Unterbrechungsbedienungsprogramme der ersten Ebene können gleichzeitig
ausgeführt werden,
jede auf einer unterschiedlichen Ebene. Dies gilt für eine einzelne
CPU und auch bei einem SMP-System. Bei einem SMP-System serialisiert
der Microkernel jedoch die Ausführung
jeder der Unterbrechungsebenen, so daß die 2 CPU nicht versuchen,
das gleiche Bedienungsprogramm gleichzeitig auszuführen.
-
Die
Unterbrechungsbedienungsprogramme der ersten Ebene sind der Programmcode
mit der höchsten
Priorität
in dem System, welche andere Unterbrechungsbedienungsprogramme und
Threads abblocken. Demnach sollte die Zeit, die in einem Unterbrechungsbedienungsprogramm
der ersten Ebene verbracht wird, auf ein Minimum beschränkt werden.
-
Bedienungsprogramme der zweiten
Ebene
-
Die
zweite Art von Unterbrechungsbedienungsprogrammen wird im Kontext
eines nativen Unterbrechungsthreads ausgeführt. Dieses Bedienungsprogramm
besteht auch aus nativem Programmcode, der 'C'-Aufrufkonventionen
befolgt, und ist als eine native Methode mit einem einzigen Parameter
strukturiert.
-
Wie
ein Bedienungsprogramm der ersten Stufe hat ein Bedienungsprogramm
der zweiten Stufe eine begrenzte Anzahl von Unterstützungsdiensten
zu seiner Verfügung.
Native Bedienungsprogramme (der ersten und zweiten Stufe) können nur
JNI verwenden, um ISE-Daten abzurufen und zu setzen und um andere
native Methoden aufzurufen, die mit dem gleichen ISE verknüpft sind.
-
Ein
Unterbrechungsbedienungsprogramm der zweiten Ebene ist in einer
Warteschlange, um unter zwei Umstanden ausgeführt zu werden. Ein Unterbrechungsbedienungsprogramm
der ersten Stufe kann ein Bedienungsprogramm der zweiten Stufe in
eine Warteschlange stellen oder, wenn kein Bedienungsprogramm der
ersten Ebene existiert, kann der Microkernel automatisch das Bedienungsprogramm
der zweiten Ebene in Antwort auf eine Unterbrechung in eine Warteschlange
stellen.
-
Ein
natives Unterbrechungsbedienungsprogramm der zweiten Ebene ist wie
folgt definiert:
typedef long secondLevelHandler(void*ise,
int64_t when);
-
Der
native Unterbrechungsthread wird während des Registrierungsvorgangs
des Bedienungsprogramms der zweiten Ebene durch den Microkernel
erzeugt. Der Stack, der für
einen nativen Thread zugewiesen ist, weist mindestens die Länge einer
Seite auf.
-
Die
Unterbrechungsbedienungsprogramme der zweiten Ebene werden nach
den Unterbrechungsbedienungsprogrammen der ersten Ebene ausgeführt und
können
Bedienungsprogramme der dritten Ebene und andere Java- oder native
Threads blockieren.
-
Bedienungsprogramme der dritten
Ebene
-
Ein
Java-Unterbrechungsbedienungsprogramm wird im Kontext eines Java-Threads
ausgeführt
und kann daher die gesamten Ressourcen der Sprache, des JavaOS und
des JDK verwenden.
-
Das
Java-Unterbrechungsbedienungsprogramm kann im Kontext irgendeines
Java-Threads ausgeführt
werden, inklusive eines vorher erzeugten Java-Systemthreads.
-
Ein
Unterbrechungsbedienungsprogramm der dritten Ebene wird in die Warteschlange
gestellt, um unter den folgenden Bedingungen ausgeführt zu werden.
Wenn kein Ebenen-Bedienungsprogramm für eine Unterbrechungsquelle
existiert, stellt der Microkernel das Unterbrechungsbedienungsprogramm
der dritten Ebene in die Warteschlange, wenn die Einrichtung unterbricht.
-
Ein
Unterbrechungsbedienungsprogramm der dritten Ebene kann auch ausgeführt werden,
wenn es von einem Unterbrechungsbedienungsprogramm der ersten oder
zweiten Ebene in die Warteschlange gestellt wird. Die Unterbrechungsbedienungsprogramme
der dritten Ebene werden nach den Unterbrechungsbedienungsprogrammen
der ersten und zweiten Ebene ausgeführt, und können andere Threads mit niedriger
Priorität
ausführen.
-
Eine
Java-basierte Unterbrechungsbedienungsprogrammethode der dritten
Ebene in der DeviceInterruptSource-Klasse wird wie folgt definiert
und wird von den abgeleiteten spezifischen Treiberklassen überschrieben,
um effektiv zu arbeiten.
-
-
Schnittstellen für Unterbrechungsprogrammcode
-
Bedienungsprogramme,
Ermöglicher,
Verhinderer und Bestätiger
müssen
alle bei einem Unterbrechungsquellenobjekt registriert sein, bevor
sie vom JavaOS erkannt werden. Wenn ein neuer Eintrag in dem IST
hinzugefügt
wird, erbt der ISE den registrierten Programmcode seines Vorfahren.
Später
wird Programmcode registriert, der für das Kind spezifisch ist.
-
Java-Schnittstellen
sind für
jede Art von Unterbrechungsbehandlungsprogrammcode definiert. Interrupt
Handler Interfaces
-
Die
DeviceInterruptSource Klasse implementiert die DeviceInterruptManager-Schnittstelle.
Die setFirstLevelIntrHandler-Methode dieser Schnittstelle hat einen
ganzzahligen Parameter, der verwendet wird, um eine ganzzahlige
Variable zu setzen, die zum Speichern der 'C'-Adressen
der nativen Unterbrechungsbedienungsprogramme der ersten Ebene vorgesehen
sind. Eine Kinder-Klasse
von DeviceInterruptSource, die eine Unterbrechungsbedienungsprogramm
der ersten Ebene benötigt,
sollte ihre native Methode aufrufen, um die Adressen der Unterbrechungsbedienungsprogramme
der ersten Ebene abzurufen. Daraufhin sollte sie die setFirstLevelIntrHandler-Methode
aufrufen, um diesen Wert in dem ISE zu speichern. Sobald dieser
ISE in dem IST eingefügt
ist, können
die CpuLevelInterruptSource-Klassenmethoden das Unterbrechungsbedienungsprogramm
der ersten Ebene für
diese Einrichtung mittels des 'C'-Funktionszeigers, der in dem ISE gespeichert
ist, aufrufen.
-
Die
Unterbrechungsbedienungsprogramme der zweiten Stufe werden ähnlich zu
den Unterbrechungsbedienungsprogrammen der ersten Stufe gehandhabt.
-
Das
Java-basierte Unterbrechungsbedienungsprogramm der dritten Ebene,
handleThirdLevelInterrupt, weist eine Füllimplementierung in der DeviceInterruptSource-Klasse
auf, die in den Kinder-Klassen überschrieben
wird.
-
Unterbrechungsverwaltungsschnittstellen
-
- public interface InterruptEnabler (...)
- public interface InterruptDisabler (...)
- public interface InterruptAcknowledger (...)
-
Unterbrechungsebenenbehandlung
-
Unterbrechungsbedienungsprogramme
der ersten Ebene sind notwendig, wenn eine Einrichtung Daten verlieren
kann, wenn sie nicht in einer zeitnahen Weise abgefertigt wird.
Die Dauer eines Unterbrechungsbedienungsprogramms der ersten Ebene
sollte in Mikrosekunden gemessen werden.
-
Unterbrechungsbedienungsprogramme
der zweiten Ebene sind nützlich,
wenn ausführliche
Echtzeitverarbeitung ausgeführt
wird, wie es etwa in Multimediaanwendungen notwendig ist.
-
Unterbrechungsbedienungsprogramme
der dritten Ebene sind nützlich,
wenn Nicht-Echtzeit-Verarbeitung
ausgeführt
wird, wie etwa Maus- und Tastatur-Ereignisbehandlung. Die Unterbrechungsbedienungsprogramme
der dritten Ebene können
aufgrund der Notwendigkeit, sich mit dem Garbage-Collector der virtuellen Maschine
zu synchronisieren, vereinzelte Latenzzeiten erfahren. Wenn diese
Latenzzeiten für
die Verwaltung der Einrichtung nicht akzeptabel sind, sollte ein
Unterbrechungsbedienungsprogramm der zweiten Ebene verwendet werden.
-
Es
ist die Aufgabe des Treibers, auszuwählen, wann jede Ebene der Unterbrechungsbearbeitung
verwendet werden soll. Die vorliegende Erfindung vereinfacht stark
die Aufgabe der Synchronisation mehrerer Ebenen der Unterbrechungsbearbeitung.
-
Synchronisation der Unterbrechungsbedienungsprogramme
-
Bei
der Unterbrechungsbehandlung tritt das Problem der Synchronisation
auf. Die vorliegende Erfindung erlaubt es, daß der nicht an Unterbrechungsebenen
gebundene Programmcode mit allen drei Ebenen der Unterbrechungsbearbeitung
synchronisiert wird. Wir untersuchen zuerst Synchronisation der
Bedienungsprogramme der zweiten und dritten Ebene.
-
Jeder
Thread, der Bedienungsprogramme der zweiten und dritten Ebene ausführt, erwirbt
den Java-Monitor,
der mit dem ISE verbunden ist, bevor das Bedienungsprogramm ausgeführt wird.
Ein Treiber kann so verhindern, daß ein Bedienungsprogramm ausgeführt wird,
indem es lediglich den Monitor des ISE erwirbt. Wenn ein Unterbrechungsbedienungsprogramm
schon ausgeführt
wurde, blockiert der Treiber, bis das Bedienungsprogramm den Monitor
freigibt. Wenn der Monitor frei war, erwirbt der Treiber den Monitor
und blockiert alle weiteren Erwerbungsversuche durch ein Bedienungsprogramm,
bis der Treiber den Monitor freigibt.
-
Die
Synchronisation mit Programmcode, der nicht im Kontext eines Threads
ausgeführt
wird (d. h. Bedienungsprogramme der ersten Ebene), erfordert es,
daß der
Treiber die Unterbrechungsquelle selbst freigibt oder sperrt. Jedes
Unterbrechungsquellenobjekt implementiert eine Schnittstelle, die Freigabe-
und Sperrmethoden für
diesen Zweck enthalten.
-
Die 8 stellt
die Verwendung von Java-Monitoren bei der Unterbrechungsbearbeitung
dar.
-
Stellen eines zurückgestellten
Unterbrechungsbedienungsprogramms in die Warteschlange
-
Native
Unterbrechungsbedienungsprogramme der ersten und zweiten Ebene können wählen, Arbeit auf
einer Per-Unterbrechungs-Basis auf höhere Unterbrechungsebenen zurückzustellen.
Ein einfaches Verfahren wird benötigt,
um es Treibern zu erlauben, Arbeit zurückzustellen.
-
Um
Arbeit von einer niedrigeren Unterbrechungsebene auf eine höhere Unterbrechungsebene
zurückzustellen,
benachrichtigt ein Unterbrechungsbedienungsprogramm nur das laufende
Unterbrechungsquellenobjekt. Das Benachrichtigen des Unterbrechungsquellenobjekts
veranlaßt,
daß die
virtuelle Maschine Threads reaktiviert, die auf die Unterbrechung
warten.
-
Beispielsweise
kann ein Unterbrechungsbedienungsprogramm in dem Kontext eines vorher
erzeugten Java-Systemthreads oder im Kontext irgendeines anderen
Threads laufen. Der wartende Thread unterhält eine Schleife, etwa wie
folgt:
-
Die 9 stellt
das Konzept der zurückgestellten
Unterbrechungsbehandlung dar:
-
Unterbrechungsdispatchen
-
Dieser
Abschnitt des Dokuments beschreibt die Bearbeitung von Unterbrechungen
mittels dreier Ebenen von Bedienungsprogrammen.
-
Dispatchen
von Unterbrechungsbedienungsprogrammen benötigt Zugriff auf den IST. Auf
den IST kann durch die nativen Methoden der CpuLevelInterruptSource-Klasse
während
der Plattforminitialisierung zugegriffen werden.
-
Der
native Anteil der Unterbrechungsklasse stellt sicher, daß jeder
Eintrag in dem Baum (ein Java-Objekt)
in dem Java-Heap für
die Dauer seiner Laufzeit verriegelt ist. Ein Zeiger auf das ISE,
der die CPU repräsentiert,
ist in einer statischen Variable zur Verwahrung und zum Zugriff
durch die nativen Unterbrechungsdispatcher gespeichert, wenn er
aufgerufen wird, um eine Unterbrechung zu behandeln.
-
Unterbrechungsdispatcher
-
Der
Unterbrechungsdispatcher des JavaOS ist eine Komponente von nativem
Programmcode, das Unterbrechungsbedienungsprogramme der ersten und
zweiten Ebene ausführt.
Der Unterbrechungsdispatcher liegt über dem Microkernel und registriert
sich eigentlich als ein Bedienungsprogramm aller Unterbrechungsvektoren,
die der Microkernel exportiert. Die 10 zeigt
den Unterbrechungsdispatcher, der über dem Microkernel liegt.
-
Der
Microkernel hat keine Kenntnis vom IST. Der Unterbrechungsdispatcher,
der sich dem Microkernel präsentiert
hat das einzige Bedienungsprogramm aller Unterbrechungen. Dieses
Design verlangt wenig von einem darunter liegenden Microkernel außer einer
einfachen Schnittstelle, um CPU-Vektor-Unterbrechungsbedienungsprogramme
zu installieren und zu entfernen.
-
Die
folgende 'C'-Schnittstelle unterstützt den
Unterbrechungsdispatcher:
void (*native_handler) (int level);
void
set_native_intr_handler (int level, native_handler func);
-
Der „level"-Parameter gibt eine
CPU-Ebene (oder einen CPU-Vektor) an. Der „func"-Parameter gibt ein natives Unterbrechungsbedienungsprogramm
an. Übergeben
eines Null-Bedienungsprogramms
entfernt das Bedienungsprogramm. Der Microkernel übergibt
die aktuelle Unterbrechungsebene an das native Bedienungsprogramm
als den einzigen Parameter.
-
Bus- und Einrichtungsunterbrechungsbehandlung
-
Jeder
Bus und jede Einrichtung weist ein zugehöriges Unterbrechungsbedienungsprogramm
auf. Bus-Unterbrechungsbedienungsprogramme führen eine spezielle Decodierungsfunktion
aus, die eigentlich die Bedienungsprogramm-Aufruflogik, die von
dem Unterbrechungsdispatcher verwendet wird, erhöht.
-
Die
Aufgabe eines Bus-Bedienungsprogramms liegt darin, zu ermitteln,
das Einrichtungs-Unterbrechungsbedienungsprogramm
als nächstes
aufgerufen werden soll. Das Einrichtungs-Unterbrechungsbedienungsprogramm wird
von dem Bus-Unterbrechungsbedienungsprogramm mittels JNI aufgerufen.
Im Fall von übereinander
liegenden Bussen können
mehrere Bus-Unterbrechungsbedienungsprogramme
aufgerufen werden, um eine Unterbrechung zu decodieren. Schließlich wird
Einrichtungsbedienungsprogramm aufgerufen, der die Unterbrechung
der Einrichtung wirklich bearbeitet.
-
Bus-
und Einrichtungs-Unterbrechungsbedienungsprogramme können auf
allen Ebenen der Unterbrechungsbearbeitung existieren, abhängig von
den Plattformanforderungen und Leistungsüberlegungen. Die Bearbeitung
ist jedoch immer die gleiche. Bus-Unterbrechungsbedienungsprogramme ermitteln
die Quelle der Unterbrechung auf einem bestimmten Bus. Einrichtungs-Unterbrechungsbedienungsprogramme
bearbeiten die Unterbrechung. Der einzige Unterschied auf jeder
der Ebenen ist der Ausführungskontext:
Unterbrechung oder Thread, nativ oder Java.
-
Die 11 stell
Bus- und Einrichtungs-Unterbrechungsbedienungsprogramme dar.
-
Die 12 stellt
die InterruptSource Klassenhierarchie dar.
-
Leistungsverbesserungen
-
Die
vorliegende Erfindung ermöglicht
es, daß Threads
auf Java-Ebene Unterbrechungen direkt bearbeiten, indem sie lediglich
auf ein InterruptSource-Objekt warten. Dieses Programmodell beseitigt
die Notwendigkeit, auf ein speziell reservierten Systemthread auf
Java-Ebene zu wechseln, um ein Bedienungsprogramm aufzurufen.
-
Netzwerktreiber
vom Stand der Technik installieren beispielsweise ein Unterbrechungsbedienungsprogramm,
das einen „Leser"-Thread in dem Treiber
aktiviert. Die vorliegende Erfindung erlaubt es, daß der „Leser"-Thread direkt auf
die Unterbrechung wartet, anstatt sich darauf zu verlassen, daß der spezielle
Unterbrechungssystemthread ausgeführt wird. Die 13 zeigt
Leistungsverbesserungen für
eine Ethernet-Leseunterbrechung.
-
Der
folgende Abschnitt beschreibt detaillierter die Klassen und Schnittstellen
der vorliegenden Erfindung. Klassen- und Schnittstellenzusammenfassung
public interface
InterruptSourceEntry extends Entry |
Methode
oder Konstruktor | Funktion |
public
boolean isEnabled ( ). | Ist
diese Unterbrechungsquelle freigegeben? |
interface
InterruptHandlers extends FirstLevelInterruptHandler, SecondLevelInterruptHandler,
ThirdLevelInterruptHandler |
Methode
oder Konstruktor | Funktion |
Eine
Sammlung von Bedienungsprogrammschnitt-stellen | CpuLevel-
und Bus-Unterbrechungsquellen deklarieren Implementierungen für alle diese
Bedienungsprogramme. Keinen nativen Programmcode zu liefern ist
OK, solange wie das System nicht versucht, die Methoden aufzurufen.
Wenn dies geschieht, wird eine NativeMethodNotFoundExeption geworfen.
Standard-„Null"-Bedienungsprogramme
der ersten und zweiten Ebene werden geliefert, um diesen Zustand
zu verhindern. |
public
boolean insert (Entry child); | Überschreiben
der Einfügemethode
der JSD Abtasten des Vektors von Kinder, um nach einem verfügbaren Steckplatz
zu suchen. Wenn kein Steckplatz gefunden wird, Einfügen scheitern
lassen. JSD anweisen, einen Eintrag in die JSD zu setzen (super.insert(child)).
Wenn dies scheitert, Fehler zurückgeben.
Kind in den Kinder-Vektor der Eltern einfügen. Native Methode initChild()
aufrufen, um irgendwelche Initialisierungen auf nativer Seite auszuführen, einschließlich von
JNI-Aufrufen, um andere native Methoden zu suchen. |
public
boolean isEnabled ( ); public boolean isSrcEnabled = false; | Ist
diese Unterbrechungsquelle freigegeben? Boolescher Wert, der den
aktuellen Zustand der Unterbrechungsquelle enthält |
abstract
class InterruptSource extends SystemEntry implements InterruptSourceEntry |
Methode
oder Konstruktor | Funktion |
InterruptSource
(InterruptSource parent, String name, int maxChildsources); | Konstruieren
einer InterruptSource. Einfügen
dieser Quelle unter 'Eltern' in die JSD. Wenn
diese Unterbrechungsquelle ein Vorfahre von zukünftigen Unterbrechungsquellen
sein wird, maximale Anzahl von Kindersteckplätzen liefern. Der Konstruktor
verwendet 'maxChildSources', um einen Vektor
von InterruptSources zuzuteilen. Einfügen dieses Kindes in den Kinder-Vektor
des Vorfahren. Vektorzugriff auf die Kinder ist eine Optimierung,
so daß man
keine JSD-Cursors verwenden muß,
um die Liste von Kinder-Unterbrechungsquellen zu durchlaufen. Das
Plattformverwaltungsprogramm erzeugt CPU- und CPULevel-Unterbrechungsquellen-Objekte,
die diesen Konstruktor verwenden. Die letzte Aktion des Konstruktors
besteht darin, die native init()-Methode aufzurufen, um Initialisierung
auf nativer Seite durchzuführen.
Beispielsweise unterbrechen Pins die Quelle auf dem Heap, so daß die native
Seite sicher auf Unterbrechungsebene arbeiten kann. |
Interruptsource
(String name, int maxChildSources); | Identisch
wie oben, außer
daß nicht
in die JSD oder den Kinder-Vektor der Vorfahren eingefügt wird.
Voraussichtlich verwenden Bus-Verwaltungsprogramme und Einrichtungstreiber
diesen Konstruktor. Das Bus-Verwaltungsprogramm
fügt dann
einen Eintrag in die JSD ein. |
public
void inheritFromParent (InterruptS ource child); | Kopieren
der Unterbrechungsverwaltungsroutinen (Ermöglicher, Verhinderer und Bestätiger) vom
Vorfahren zum Kind. Bus-Verwaltungsprogramme können dieses Merkmal verwenden,
um Standardverwaltungsroutinen auf Kinder und somit auf Enkel zu übertragen
(d. h. übereinander
liegende Bus-Verwaltungsprogramme) |
public
boolean insert (Entry child); | Überschreiben
der Einfügemethode
der JSD. Abtasten des Vektors von Kinder, um nach einem verfügbaren Steckplatz
zu suchen. Wenn kein Steckplatz gefunden wird, Einfügen scheitern
lassen. JSD anweisen, einen Eintrag in die JSD zu setzen (super.insert(child)).
Wenn dies scheitert, Fehler zurückgeben.
Kind in den Kinder-Vektor der Eltern einfügen. Native Methode initChild()
aufrufen, um irgendwelche Initialisierungen auf nativer Seite auszuführen, einschließlich von
JNI-Aufrufen, um andere native Methoden zu suchen. |
public
boolean isEnabled ( ); private boolean isSrcEnabled = false; | Ist
diese Unterbrechungsquelle freigegeben? Boolescher Wert, der den
gegenwärtigen
Zustand der Unterbrechungsquelle enthält |
public class
CpuInterruptSource extends InterruptSource implements |
Methode
oder Konstruktor | Funktion |
public
CpuInterruptSource (int nLevels); | Konstruieren
eines CpuInterruptSource-Objekts. Der Name ist der gleiche wie der
Name der CPU in dem Einrichtungsbaum. Zudem eine x-Ref-Eigenschaft
hinzufügen,
die als „Einrichtung" bezeichnet wird und
auf den CPU-Eintrag in dem Einrichtungsbaum zeigt. nLevels wird als 'maxChildSources' an den InterruptSource-Konstruktor übergeben. |
public
native int getCpuInterruptLevelCount ( ); | Zurückgeben
die ganzzahlige Summe der Anzahl von Unterbrechungsebenen, die von
dieser CPU unterstützt
werden. Wird vom Plattformverwaltungsprogramm aufgerufen und das
Ergebnis wird an den Cpu-InterruptSource-Konstruktor übergeben. |
private native boolean
initCpu ( ); | Durchführen einer
einmaligen CPU-Unterbrechungsverwaltungs-Initialisierung
(CPU- und plattformabhängig). Wird
vom Konstruktor aufgerufen. |
public
native boolean enableInterrupt ( ) | Gibt
CPU-Unterbrechungen frei (alle Ebenen) |
public
native boolean disableInterrupt ( ) | Sperrt
CPU-Unterbrechungen (alle Ebenen) |
public
native void acknowledgeInterrupt ( ) | Bestätigt eine
CPU-Unterbrechung – kann
interne oder externe Unterbrechungscontroller verwenden (Plattform-/CPU-spezifisch).
Kann völlig
untätig
sein. |
InterruptManagement |
public class
CpuLevelInterruptSourceextends InterruptSource |
Methode
oder Konstruktor | Funktion |
public
CpuLevelInterruptSource (CpuInterruptSource cpu, int level, int
maxChildrensSharigngLevel); | Konstruieren
eines CpuLevelInterruptSource-Objekts, um die Unterbrechungsebene
#'level' dieser CPU zu repräsentieren.
Der Name dieses Eintrags wird zu „cpu.getName() + Level" + level. Speichern
von level als ganze Zahl, so daß nativer
Programmcode Zugriff hat. Die Plattform liefert die maximale Anzahl
von Kindereinrichtungen, die zum gleichzeitigen Teilen dieser Unterbrechungsebene
fähig sind. |
public
int getLevel0; | Zurückgeben
der Unterbrechungsebene, die mit dieser Quelle verbunden ist. |
private
native boolean initCpuLevel ( ) | Einmalige
Initialisierung der Unterbrechungsebene einer CPU. CPU- und plattformspezifisch.
Kann untätig
sein. Wird vom Konstruktor aufgerufen. |
private
int levelNumber; | Enthält die Unterbrechungsebene
vom Konstruktor. |
public
static native int maxDevicesForLevel (int level); | Die
für die
Plattform spezifische Methode gibt die maximale Anzahl von Einrichtungen
wieder, die diese Unterbrechungsebene zur gleichen Zeit teilen können. Das
Ergebnis wird vom PlatformManager als ein Parameter für den Konstruktor
verwendet. |
public
boolean handleThirdLevelInterrupt (long when); | Unterbrechungsbedienungsprogramm
der dritten Ebene für
diese Ebene Wird vom Systemunterbrechungsthread in Antwort auf eine
Unterbrechung auf dieser Ebene aufgerufen. Dieses Bedienungsprogramm der
dritten Ebene ruft Bedienungsprogramme der dritten Ebene von allen
Kindern auf. |
public
native boolean handleSecondLevelInterrupt (long when); | Unterbrechungsbedienungsprogramm
der zweiten Ebene für
diese Ebene. Wird vom nativen Systemunterbrechungsthread aufgerufen. |
public
native boolean handleFirstLevelInterrupt (long when); | Unterbrechungsbedienungsprogramm
der ersten Ebene für
diese Ebene. |
public
native boolean enableInterrupt ( ); | Gibt
Unterbrechungen auf CPU-Ebene frei, indem sie diese Ebene in dem
Unterbrechungscontroller der CPU oder der Plattform demaskiert. |
public
native boolean disableInterrupt ( ); | Sperrt
Unterbrechungen auf CPU-Ebene, indem sie diese Ebene in dem Unterbrechungscontroller
der CPU oder der Plattform maskiert. |
public
native void acknowledgeInterrupt ( ); | Bestätigt eine
Unterbrechung auf CPU-Ebene. Eine für die CPU oder den Unterbrechungscontroller
spezifische Operation. |
implements
InterruptManagement, InterruptHandlers public class DeviceInterruptSource
extendsInterruptSource |
Methode
oder Konstruktor | Funktion |
public
DeviceInterruptSource (String deviceName); | Konstruieren
einer DeviceInterruptSource für
die ausgewählte
benannte Einrichtung. Der Name wird vom Bus-Verwaltungsprogramm
beim Hochfahren des Treibers erhalten. Weiter Hinzufügen einer
x-Ref-Eigenschaft, die als „Einrichtung" bezeichnet wird
und auf den Einrichtungseintrag in dem Einrichtungsbaum zeigt. |
public
DeviceInterruptSource (String deviceName, int maxChildren); | Der
BusInterruptSource-Konstruktor ruft diesen Konstruktor auf. |
public
boolean handleThirdLevelInterrupt (long when); | Unterbrechungsbedienungsprogramm
der dritten Ebene für
diese Einrichtung. Subklassen überschreiben
diese Standardmethode. |
protected
int firstLevelIntrHandler; | Dieser
wird mittels der setFirstLevelIntrHandler-Methode auf die Adresse
der nativen Unterbrechungsbedienungsprogramm-Funktion der ersten
Ebene gesetzt. |
protected
int secondLevelIntrHandler; | Dieser
wird mittels der setSecondLevelIntrHandlerMethode auf die Adresse
der nativen Unterbrechungsbedienungsprogramm-Funktion der zweiten
Ebene gesetzt. |
implements
DeviceInterruptManager;Runnable public abstract class BusInterruptSource
extends DeviceInterruptSource implements InterruptManagement |
Methode
oder Konstruktor | Funktion |
Bus
InterruptSource (Entry bus, int maxSources); | Konstruieren
einer BusInterruptSource für
den ausgewählten
Bus. Zudem eine x-Ref-Eigenschaft hinzufügen, die als „Einrichtung" bezeichnet wird
und auf den Einrichtungseintrag in dem Einrichtungsbaum zeigt. Die
ganzzahlige 'maxSources'-Zahl definiert die
maximale Anzahl von Kindereinrichtungs-Unterbrechungsquellen, die
dieser Bus behandelt. Mittels dieser ganzen Zahl erzeugt der Konstruktor
einen Vektor von InterruptSources. |
public
abstract boolean enableInterrupt ( ); | Zwingen
einer Subklasse, eine busspezifische Unterbrechungsermöglichermethode
zu implementieren. Kann einfach den Ermöglicher des Vorfahren erben. |
public
abstract boolean disableInterrupt ( ); | Zwingen
einer Subklasse, eine busspezifische Unterbrechungsverhinderermethode
zu implementieren. Kann einfach den Verhinderer des Vorfahren erben. |
public
abstract boolean acknowledgeInterrupt ( ); | Zwingen
einer Subklasse, eine busspezifische Unterbrechungsbestätigungsmethode
zu implementieren. Kann einfach den Bestätiger des Vorfahren erben. |
public interface
FirstLevelInterruptHandler |
Methode
oder Konstruktor | Funktion |
public
boolean handleFirstLevelInterrupt (long when); | Prototyp
für ein
natives Unterbrechungsbedienungsprogramm der ersten Ebene. Dem Bedienungsprogramm
werden zwei Parameter übergeben.
Der erste Parameter ist das übliche
Handle für
dieses Objekt. Der zweite ist ein Zeitstempel in Mikrosekunden. |
public interface
SecondLevelInterruptHandler public boolean |
Methode
oder Konstruktor | Funktion |
handleFirstLevelInterrupt
(long when); | Prototyp
für ein
natives Unterbrechungsbedienungsprogramm der ersten Ebene. Dem Bedienungsprogramm
werden zwei Parameter übergeben.
Der erste Parameter ist das übliche
Handle für
dieses Objekt. Der zweite ist ein Zeitstempel in Mikrosekunden. |
public interface
InterruptEnabler |
Methode
oder Konstruktor | Funktion |
public
boolean enableInterrupt ( ); | Gibt
wahr zurück,
wenn die Unterbrechung schon freigegeben war, und sonst falsch.
Gibt Unterbrechungen von dieser Quelle frei. |
public interface
InterruptDisabler |
Methode
oder Konstruktor | Funktion |
public
boolean disableInterrupt ( ); | Gibt
wahr zurück,
wenn die Unterbrechung schon freigegeben war, und sonst falsch.
Sperrt Unterbrechungen von dieser Quelle. |
public interface
InterruptAcknowledger |
Methode
oder Konstruktor | Funktion |
public
void acknowledgeInterrupt ( ); | Bestätigt Quelle
der Unterbrechung bevor und/oder nachdem die Unterbrechung gehandhabt
wurde. Die Wahl ob vorher oder nachher ist von der Einrichtung und
der Hardware abhängig. |
-
Die
oben beschriebenen Klassen werden auf einem computerlesbaren Medium
gespeichert, wie etwa Floppydisks, einer CD-ROM oder einer optischen
Disk. Alternativ werden sie einem Computersystem 10 in
einem Festwertspeicher bereitgestellt werden oder werden in Form
einer Computerdaten-Trägerwelle über ein Netzwerk
bereitgestellt.