next up previous contents index
Next: Anpassung von Terminals Up: L3 Referenzhandbuch Previous: Was sind L3 Protokolle?

Die Systemaufrufe

Einführung

Die Systemaufrufe stellen die unterste Ebene dar, auf der Leistungen von L3 in Anspruch genommen werden können. Dabei wird dem L3 Systemkern durch Interrupt 7 mitgeteilt, daß ein Systemaufruf ansteht. Die Identifikation des Systemaufrufs erfolgt stets durch Auswertung des Registers AL, in dem der Code des Aufrufs steht. Ein- und Ausgabeparameter werden in den beim jeweiligen Systemaufruf beschriebenen Registern übergeben.

Es handelt sich bei allen Operationen um Basisleistungen des L3 Systemkerns. Die involvierten Datentypen sind also Basistypen, die bereits auf Ebene des Systemkerns bekannt sind: Prozesse, Datenräume, Botschaften und die Inhalte des Prozeßkontrollblocks (PCB).

Objekte des Typs Prozeß werden durch den Datentyp Prozeßbezeichner identifiziert. Ein Prozeßbezeichner, in der Beschreibung der Systemaufrufe als PRCID bezeichnet, bestehend aus (INT CONST process number, version number). Diese vom Systemkern für jeden Prozeß vergebene Kombination von Prozeß- und Versionsnummer stellt sicher, daß Prozesse innerhalb des L3 Systems auch über die Zeit eindeutig identifizierbar bleiben. Die Prozeßnummer beschreibt die Stellung des Prozesses im Gesamtsystem. Die Nummern 1 bis 42h bezeichnen Kern- und Treiberprozesse, die Nummern ab 43h bezeichnen Tasks. Die Versionsnummer garantiert die Eindeutigkeit des Prozeßbezeichners über die Zeit. Wenn ein Prozeß gelöscht wird und »an gleicher Stelle« ein Prozeß erzeugt wird, so wird durchaus die gleiche Prozeßnummer wieder zugeteilt. Die Versionsnummer wird jedoch hochgezählt, so daß nicht die Situation entstehen kann, daß ein Prozeß Botschaften erhält, die für seinen (zeitlichen) Vorgänger bestimmt waren.

Für die Parameterübergabe eines Prozeßbezeichners vom oder an den Systemkern sind zwei Doppelworte, mithin zwei 80386 Register erforderlich.

Objekte des Typs Datenraum werden durch Datenraumbezeichner (DSID) identifiziert. Da Datenräume nur innerhalb einer Task eindeutig bezeichnet sein müssen, reicht eine einfache Numerierung. Es gibt schließlich keine Möglichkeit, an die Datenräume einer anderen Task »heranzukommen« (Autonomieprinzip). Datenraumbezeichner sind also ganze Zahlen, Doppelworte. Die Parameterübergabe erfolgt somit über ein 80386 Register.

Um Zugriff auf den Inhalt eines Datenraums zu erhalten, ist es nötig, daß der Datenraum in den linearen Adreßraum des Prozesses abgebildet (»gemappt«) wird.

Die Objekte der Intertask Kommunikation, sind die Botschaftsvektoren, strukturierte Datenobjekte folgender Gestalt: ein Botschaftsvektor ist ein String von 32 Doppelworten. In diesen String werden in beliebiger Mischung und Anordnung Einträge für Botschaftsobjekte der Typen INT, Bytesequenz (z.B. TEXT) oder DATASPACE gemacht. Ein Eintrag für INT und DATASPACE ist ein Doppelwort, ein Bytesequenz-Eintrag zwei Doppelworte lang. Eine Botschaft kann einen bis sechzehn Integer, einen bis sechzehn Datenräume, einen bis sieben Texte oder beliebige Mischungen daraus bis zur maximalen Eintragslänge von sechzehn Doppelworten aufnehmen.

Der Aufbau des Botschaftsvektors

Der Botschaftsvektor ist ein 128 Byte langer Abschnitt im Prozeßkontrollblock einer Task.

MDV  RDV  B1  B2 .... B15  B16  E1  E2 .... E13  E14

Die Doppelworte 'MDV' und 'RDV' beschreiben den Datentyp der Objekte in den folgenden Botschaftsabschnitten. B1 bis B16 sind Botschaftsabschnitte, E1 bis E14 Eigenadressen.

MDV: Message Dope Vector
Der Message Dope Vektor beschreibt die Typen der zu sendenden Datenobjekte in den Botschaftsabschnitten B1 bis B16. Für jeden Abschnitt B1 bis B16 muß in zwei Bit der Datentyp festgehalten werden, als den der Empfänger den Inhalt des Botschaftsabschnitts zu interpretieren hat. Verschlüsselung der Datentypen von Botschaftsabschnitten:

int msg:
0
string msg:
1
ds msg:
2
nil msg:
3

RDV: Receive Dope Vector
Der Receive Dope Vektor beschreibt die Typen der zu empfangenden Datenobjekte in den Botschaftsabschnitten B1 bis B16. Für jeden Abschnitt B1 bis B16 wird in zwei Bit der Typ festgehalten (s.o.). Nach Empfang einer Botschaft kann durch Abgleich des bei der Botschaftsübermittlung mitübertragenen MDV und des selbst erzeugten RDV geprüft werden, ob die Sendung den eigenen Erwartungen entspricht und verarbeitet werden kann.

B1 bis B16: Botschaftsabschnitte
Die Botschaftsabschnitte enthalten die eigentlichen Botschaften in Form von Integer Einträgen. Die Einträge unterliegen folgender Systematik:

Sender vor der Sendung:

int msg:
Der Abschnitt Bx enthält die Zahl.
ds msg:
Der Abschnitt Bx enthält den Datenraumbezeichner.
string msg:
Der Abschnitt Bx+1 enthält die Startadresse des Bytestring in der Task. Der Abschnitt Bx enthält die Stringlänge.

Nach erfolgreicher Sendung ist ein gesendeter Datenraum gelöscht. INTs oder Strings werden als Kopien versendet.

Empfänger nach der Sendung:

int msg:
Der Abschnitt Bx enthält die Zahl.
ds msg:
Der Abschnitt Bx enthält den Datenraumbezeichner des empfangenen Datenraums.
string msg:
Der Abschnitt Bx enthält die Stringlänge des Bytestrings. Der Abschnitt Ex+1 enthält die Adresse.

Da der Empfänger im Falle der string msg eine Fremdadresse erhält, muß noch die Angabe eines geeigneten Platzes im eigenen Adreßraum folgen. Nur zu diesem Zweck werden die Eigenadressen E1 bis E14 benötigt.

E1 bis E14: Eigenadressen
In diesem Abschnitt werden für string msg die Adresse und die akzeptierte Länge für den jeweiligen Bytestring im eigenen Adreßraum festgehalten.

Dieser Abschnitt des Botschaftsvektors wird also nur benutzt, wenn Bytestrings empfangen werden sollen.

Botschaftstransfer im V86 Modus

Falls aus dem virtuellen 8086 Modus heraus Botschaften gesendet oder empfangen werden sollen, muß der Botschaftsvektor selbst verwaltet werden. Dazu muß eine Datenstruktur der oben beschriebenen Gestalt in einem gesonderten Segment, auf das das Register GS zeigt, aufgebaut werden.

GS:0 ->        MDV  RDV  B1  B2 .... B15  B16  E1  E2 .... E13  E14

Thematische Gliederung der Systemaufrufe

tabular12252

tabular12257

tabular12262

tabular12267

Systemaufrufe

copy dataspace

Code: 0
Wirkung: Von einem existierenden Datenraum wird eine Kopie angelegt, deren Datenraumbezeichner in Register EAX geliefert wird. Der zu kopierende Datenraum braucht nicht »geöffnet« (gemappt) zu sein, er darf aber geöffnet sein. Insbesondere kann auch der leere Datenraum nilspace als Quelle herangezogen werden, um einen neuen Datenraum vor Benutzung zu »initialisieren«.

Register vor INT 7
 AL : 0 
EBX : DSID source ds 
ECX : 
EDX : 
ESI : 
EDI :

Register nach INT 7
EAX : DSID dest ds 
EBX : 
ECX : 
EDX :

Parameter: 'source ds' ist der Datenraumbezeichner des Datenraums, der kopiert werden soll. 'dest ds' ist der Datenraumbezeichner der Kopie.

delete dataspace

Code: 1
Wirkung: Löscht einen Datenraum. Der durch seinen Datenraumbezeichner spezifizierte Datenraum ist danach für den aufrufenden Prozeß nicht mehr zugreifbar (adressierbar). Der zu löschende Datenraum muß nicht geöffnet (gemappt) sein, er darf aber geöffnet sein. Als Resultat wird ein Datenraumbezeichner geliefert, der in jedem Prozeß garantiert ungültig ist. Dieser Bezeichner liefert für jede Operation außer delete dataspace einen Fehler.

Register vor INT 7
 AL : 1 
EBX : DSID dataspace 
ECX : 
EDX : 
ESI : 
EDI :

Register nach INT 7
EAX : DSID no dataspace 
EBX : 
ECX : 
EDX :

Parameter: 'dataspace' ist der Datenraumbezeichner des Datenraums, der gelöscht werden soll.

'no dataspace' ist der immer ungültige Datenraumbezeichner.

copy pages to dataspace

Code: 2
Wirkung: Faules Kopieren von Datenraumseiten (Pages) aus dem Quelldatenraum in den Zieldatenraum. Beide Datenräume müssen gemappt sein. Sowohl für Quelldatenraum, als auch für Zieldatenraum wird eine Startadresse angegeben, ab der kopiert werden soll. Diese Adresse muß in beiden Fälle »page aligned«, d.h. ohne Rest durch 4096 teilbar sein. Im Zieldatenraum wirkt die Kopie überschreibend.

Register vor INT 7
 AL : 2 
EBX : DSID source ds 
ECX : DSID dest ds 
EDX : ADDR from page 
ESI : ADDR to page 
EDI : INT pages

Register nach INT 7
EAX : 
EBX : 
ECX : 
EDX :

Parameter: 'source ds' ist der Datenraumbezeichner des Datenraums, aus dem Seiten kopiert werden. 'dest ds' ist der Datenraumbezeichner des Datenraums in den Seiten kopiert werden. 'from page' ist die Startadresse, ab der 'pages' Seiten kopiert werden. Die Adresse muß »page aligned« sein, d.h. ohne Rest durch 4096 teilbar. 'to page' ist die Zieladresse, an die 'pages' Seiten kopiert werden. Die Adresse muß »page aligned« sein, d.h. ohne Rest durch 4096 teilbar. 'pages' ist die Anzahl der Seiten, die kopiert werden sollen.

dataspace exists

Code: 3
Wirkung: Prüft, ob der gegebenene Datenraumbezeichner einen existierenden Datenraum bezeichnet. Der fragliche Datenraumbezeichner wird in Register EBX übergeben. Falls der Datenraum existiert wird in EAX eine 1 geliefert, sonst 0.

Register vor INT 7
 AL : 3 
EBX : DSID dataspace 
ECX : 
EDX : 
ESI : 
EDI :

Register nach INT 7
EAX : BOOL exists 
EBX : 
ECX : 
EDX :

Parameter: 'dataspace' ist der Datenraumbezeichner für den überprüft wird, ob er einen gültigen Datenraum bezeichnet. 'exists' liefert den Wert 1, falls der Bezeichner einen gültigen Datenraum bezeichnet, sonst 0.

next dataspace page

Code: 5
Wirkung: Liefert die Seitennummer der nächsten benutzten Seite (Page) des bezeichneten Datenraums. Die Suche startet bei der spezifizierten Seite 'from page'. Falls dafür der Wert -1 angegeben wird, so wird die erste benutzte Seite des Datenraums geliefert. Die Suche nach der nächsten benutzten Seite, die an der letzten benutzten Seite startet, liefert wiederum den Wert -1.

Register vor INT 7
 AL : 5 
EBX : DSID dataspace 
ECX : ADDR from page 
EDX : 
ESI : 
EDI :

Register nach INT 7
EAX : INT next used page 
EBX : 
ECX : 
EDX :

Parameter: 'dataspace' ist der Datenraumbezeichner des Datenraums. 'from page' ist die Seitennummer der Seite, ab der gesucht werden soll. 'next used page' ist die Seitennummer der nächsten belegten Seite.

copy pages

Code: 6
Wirkung: Faules Kopieren von Datenraumseiten (Pages) innerhalb eines Datenraumes. Der Datenraum muß gemappt sein. Sowohl die Startadresse, ab der kopiert werden soll, als auch die Zieladresse müsse »page aligned«, d.h. ohne Rest durch 4096 teilbar sein. Die Kopie wirkt überschreibend.

Register vor INT 7
 AL : 6 
EBX : DSID dataspace 
ECX : ADDR from page 
EDX : ADDR to page 
ESI : INT pages 
EDI :

Register nach INT 7
EAX : 
EBX : 
ECX : 
EDX :

Parameter: 'source ds' ist der Datenraumbezeichner des Datenraums, in dem Seiten kopiert werden. 'from page' ist die Startadresse, ab der 'pages' Seiten kopiert werden. Die Adresse muß »page aligned« sein, d.h. ohne Rest durch 4096 teilbar. 'to page' ist die Zieladresse, an die 'pages' Seiten kopiert werden. Die Adresse muß »page aligned« sein, d.h. ohne Rest durch 4096 teilbar. 'pages' ist die Anzahl der Seiten, die kopiert werden sollen.

open dataspace

Code: 7
Wirkung: Der angeforderte Datenraum wird in den linearen Adreßraum des Prozesses »gemappt«. Für den Eintrag in die Mapping Liste des Prozeßkontrollblocks wird ein bound Eintrag, der praktisch eine Referenz auf den neu eröffneten Datenraum darstellt angelegt (s.u.). Falls kein Mapping möglich ist, wird der aufrufende Prozeß durch Systemaufruf 48 (set error) benachrichtigt.

Register vor INT 7
 AL : 7 
EBX : DSID dataspace 
ECX : INT size 
DS:EDX : bound 
ESI : 
EDI :

Register nach INT 7
EAX : new bound (low) 
EBX : new bound (high) 
ECX : 
EDX :

Parameter: 'dataspace' ist der Datenraumbezeichner des Datenraums, der gemappt werden soll. 'size' ist der Platzbedarf, der für diesen Datenraum eingefordert wird. Der gegebene Wert wird automatisch auf das nächst höhere Vielfache von 16 MB gerundet. Der Maximalwert beträgt ein Gigabyte.

Bemerkung: Ein Prozeß kann prinzipiell 16383 Datenräume besitzen. Der Prozeßkontrollblock erlaubt jedoch nur gleichzeitiges Mapping von 234 Datenräumen. Bei Abbildung eines Datenraums in den linearen Adreßraum des Prozesses wird daher ein Eintrag in die Mapping Liste des PCB gemacht. Dieser Eintrag ist als Zeiger auf den gemappten Datenraum zu interpretieren.

close dataspace

Code: 8
Wirkung: Der bezeichnete Datenraum wird aus dem linearen Adreßraum des Prozesses entfernt.

Register vor INT 7
 AL : 8 
EBX : DSID dataspace 
ECX : 
EDX : 
ESI : 
EDI :

Register nach INT 7
EAX : 
EBX : 
ECX : 
EDX :

Parameter: 'dataspace' ist der Datenraumbezeichner des Datenraums, der »unmappt« werden soll.

associated segment

Code: 9
Wirkung: Liefert die lineare Adresse der ersten benutzten Seite des bezeichneten Datenraum, falls dieser Datenraum gemappt ist, sonst 0xffffffff.

Register vor INT 7
 AL : 9 
EBX : DSID dataspace 
ECX : 
EDX : 
ESI : 
EDI :

Register nach INT 7
EAX : ADDR address 
EBX : 
ECX : 
EDX :

Parameter: 'dataspace' ist der Datenraumbezeichner des Datenraums, dessen erste benutzte Adresse im linearen Adreßraum des erfragt werden soll. 'address' enthält die Adresse, falls der Datenraum gemappt ist, sonst 0xffffffff.

associated dataspace

Code: 10
Wirkung: Liefert den Datenraumbezeichner des Datenraums, der an die angegebene lineare Adresse gemappt ist. Falls der Adresse kein Datenraum geordnet werden kann, wird '0', der Bezeichner von nilspace geliefert.

Register vor INT 7
 AL : 10 
EBX : ADDR address 
ECX : 
EDX : 
ESI : 
EDI :

Register nach INT 7
EAX : DSID dataspace 
EBX : 
ECX : 
EDX :

Parameter: 'address' enthält die lineare Adresse, zu der der assoziierte Datenraum gesucht wird. 'dataspace' ist der Datenraumbezeichner des Datenraums, dessen Mapping die fragliche Adresse enthält. Falls es keinen solchen Datenraum gibt, wird DSID nilspace ('0') geliefert.

next dataspace

Code: 11
Wirkung: Liefert den Datenraumbezeichner des nächsten existierenden Datenraums.

Die Datenräume sind zyklisch geordnet:

next dataspace (nilspace) = std dataspace
next dataspace (last dataspace) = nilspace

Auf diese Weise läßt sich einfach der Standarddatenraum identifizieren. Desweiteren können auch alle Datenräume der Task leicht durchmustert werden.

Register vor INT 7
 AL : 11 
EBX : DSID dataspace 
ECX : 
EDX : 
ESI : 
EDI :

Register nach INT 7
EAX : DSID next dataspace 
EBX : 
ECX : 
EDX :

Parameter: 'dataspace' ist der Datenraumbezeichner des Datenraums, zu dem der nächste Datenraum gefunden werden soll. 'next dataspace' ist der Datenraumbezeichner des gesuchten Datenraums. Wie oben beschreiben sind die Datenräume zyklisch geordnet.

set access right

Code: 12
Wirkung: Verbietet oder erlaubt schreibenden Zugriff auf eine bestimmte Reihe von Seiten eines Datenraums. Der Datenraum muß im linearen Adreßraum der Task liegen (»gemappt sein«). Die Adressangabe für die erste zu Seite, die geschützt oder freigegeben werden soll, muß »page aligned«, d.h. ohne Rest durch 4096 teilbar sein.

Register vor INT 7
 AL : 12 
EBX : DSID dataspace 
ECX : ADDR from page 
EDX : INT pages 
ESI : INT access right 
EDI :

Register nach INT 7
EAX : 
EBX : 
ECX : 
EDX :

Parameter: 'dataspace' ist der Datenraumbezeichner des Datenraums, in dem ein Schreibschutz gesetzt oder gelöscht werden soll. 'from page' ist die Startadresse, ab der 'pages' Seiten geschützt werden. Die Adresse muß »page aligned« sein, d.h. ohne Rest durch 4096 teilbar. 'pages' ist die Anzahl der Seiten, die geschützt werden sollen. 'access right': 0 nur lesen der Seiten ist erlaubt. 1 lesen und schreiben ist erlaubt.

dataspace alias

Code: 13
Wirkung: Von einem existierenden Datenraum wird ein »Alias« angelegt. Ein Alias ist im Gegensatz zu einer Kopie logisch mit seinem Original gekoppelt. Somit kann beispielsweise die Kommunikation von »shared memory« durch Aliases realisiert werden. Ein Alias ist logisch einem Datenraum gleichwertig, erlaubt also alle üblichen Operationen. Die Löschung eines Alias hat jedoch keine Wirkung auf andere Aliases oder das Original. Die Löschung des Originals macht jedoch alle Aliases ungültig, der Eigentümer des Originals bleibt also entscheidender Besitzer. Falls irgendein Prozeß einen Schreibschutz auf ein Alias setzt oder löscht, so wirkt das auch auf andere Aliases und Original.

Falls irgend möglich, sollten die üblichen Methoden der Intertask Kommunikation benutzt werden!

Register vor INT 7
 AL : 13 
EBX : DSID dataspace 
ECX : 
EDX : 
ESI : 
EDI :

Register nach INT 7
EAX : DSID alias 
EBX : 
ECX : 
EDX :

Parameter: 'dataspace' ist der Datenraumbezeichner des Datenraums, von dem ein Alias angelegt werden soll. 'alias' ist der Datenraumbezeichner des Alias von 'dataspace'.

get dataspace params

Code: 14
Wirkung: Liefert Informationen über einen Datenraum. Diese globalen Informationen sind Typ des Datenraums, die Anzahl der belegten Seiten und die maximal zulässige Größe, die dieser Datenraum annehmen darf.

Register vor INT 7
 AL : 14 
EBX : DSID dataspace 
ECX : INT param 
EDX : 
ESI : 
EDI :

Register nach INT 7
EAX : INT param value 
EBX : 
ECX : 
EDX :

Parameter: 'dataspace' ist der Datenraumbezeichner des Datenraums, über den Informationen gewüscht werden. 'param': 0 Belegte Seiten des Datenraums 1 Zulässige Maximalgröße 2 Typ des Datenraums

set dataspace params

Code: 15
Wirkung: Ermöglicht die Einstellung von Typ des Datenraums und der maximal zulässigen Größe, die dieser Datenraum annehmen darf.

Register vor INT 7
 AL : 15 
EBX : DSID dataspace 
ECX : INT param 
EDX : INT param value 
ESI : 
EDI :

Register nach INT 7
EAX : 
EBX : 
ECX : 
EDX :

Parameter: 'dataspace' ist der Datenraumbezeichner des Datenraums, über den Informationen gewüscht werden. 'param': 1 Zulässige Maximalgröße 2 Typ des Datenraums 'param value' ist der neu gesetzte Wert.

myself id

Code: 16
Wirkung: Liefert den Prozeßbezeichner des Prozesses.

Register vor INT 7
 AL : 16 
EBX : 
ECX : 
EDX : 
ESI : 
EDI :

Register nach INT 7
EAX : PRCID myself (low DWORD) 
EBX : PRCID myself (high DWORD) 
ECX : 
EDX :

Parameter: 'myself' Prozeßbezeichner des aufrufenden Prozesses.

sys process id

Code: 17
Wirkung: Liefert den Prozeßbezeichner des durch 'sys prc short name' bezeichneten Prozesses. Kurznamen, die bis zu vier Zeichen lang sind, gibt es für Prozesse, die dem Systemkern zugehören und den SUPERVISOR. Unter Benutzung dieser Kurznamen läßt sich der Prozeßbezeichner in Erfahrung bringen. Dieser wiederum wird dann benutzt um Botschaften an einen solchen Prozess zu senden.

Register vor INT 7
 AL : 17 
EBX : sys prc short name 
ECX : 
EDX : 
ESI : 
EDI :

Register nach INT 7
EAX : PRCID sys process id (low DWORD) 
EBX : PRCID sys process id (high DWORD) 
ECX : 
EDX :

Parameter: 'sys prc short name' ist der Kurzname eines Systemprozesses. Kurznamen gibt es für SUPERVISOR und Treiberprozesse:

"SV" Supervisor "LPT1" Parallele Schnittstelle 1

'sys process id': Interner Prozeßbezeichner für den mit sys prc short name spezifizierten Prozeß. Falls dieser nicht gefunden wird, wird nilprocess (PRCID (0,0)) geliefert.

Bemerkung: Der Name 'short name' muß entsprechend den Konventionen rückwärts in das Register geschrieben werden. mov ebx, '1TPL' entspricht also LPT1 in Register EBX.

exists process

Code: 18
Wirkung: Prüft, ob der angegebene Prozeß existiert.

Register vor INT 7
 AL : 18 
EBX : PRCID process (low DWORD) 
ECX : PRCID process (high DWORD) 
EDX : 
ESI : 
EDI :

Register nach INT 7
EAX : exists 
EBX : 
ECX : 
EDX :

Parameter: 'process': Prozeßbezeicher. 'exists' : EAX enthält den Wert 1, falls 'process' existiert, sonst 0.

my task id

Code: 19
Wirkung: Liefert den Prozeßbezeichner der eigenen Task.

Register vor INT 7
 AL : 19 
EBX : 
ECX : 
EDX : 
ESI : 
EDI :

Register nach INT 7
EAX : PRCID my task id (low DWORD) 
EBX : PRCID my task id (high DWORD) 
ECX : 
EDX :

Parameter: 'my task id': Interner Prozeßbezeichner für die Task, die diesen Systemaufruf abgesetzt hat.

call process

Code: 28
Wirkung: Versucht einem Prozeß eine Botschaft zu senden und wartet nach erfolgter Sendung auf eine Antwort. call process ist eine atomare Aktion, d.h. es ist garantiert, daß keine Aktion nach Ende der Sendung und vor Beginn des Wartens auf die Antwort stattfindet. Falls der Empfänger nicht empfangsbereit ist, wird darauf gewartet, daß 'sendtimeout' abläuft, falls nach der Sendung keine Antwort kommt, wird bis zum Ablauf von 'receivetimeout' gewartet.

Register vor INT 7
 AL : 28 
EBX : lower DWORD of PRCID partner 
ECX : upper DWORD of PRCID partner 
EDX : send timeout 
ESI : receive timeout 
EDI : 0  oder  MSGVEC in GS:0

Register nach INT 7
EAX : result 
EBX : 
ECX : 
EDX :

Parameter: 'partner' ist der Prozeßbezeichner des Prozesses, dem die Botschaft gesendet werden soll. 'send timeout' ist die Zeitspanne, die maximal verstreichen darf, ohne daß der Versuch, die Sendung zuzustellen, wegen Erfolglosigkeit abgebrochen wird. 'receive timeout' ist die Zeitspanne, die maximal verstreichen darf, ohne daß der Versuch, die Antwort des Partners zu empfangen, wegen Erfolglosigkeit abgebrochen wird. 'result' liefert einen der folgenden Werte:

0 : communication ok 
1 : task not existing 
2 : send timeout 
3 : receive timeout 
5 : communication error

Bemerkung: Falls dieser Systemaufruf im virtuellen 8086 Modus benutzt wird, muß ein separates Segment auf das das Segmentregister GS zeigen muß, aufgebaut werden., Dieses Segment enthält dann einen Botschaftsvektor in der Struktur wie in 14.2 beschrieben.

send process

Code: 29
Wirkung: Versucht einem Prozeß eine Botschaft zu senden. Falls der Empfänger nicht empfangsbereit ist, wird bis zum Ablauf von 'sendtimeout' gewartet.

Register vor INT 7
 AL : 29 
EBX : PRCID partner (low DWORD) 
ECX : PRCID partner (high DWORD) 
EDX : send timeout 
ESI : 
EDI : 0  oder MSGVEC in GS:0

Register nach INT 7
EAX : result 
EBX : 
ECX : 
EDX :

Parameter: 'partner' ist der Prozeßbezeichner des Prozesses, dem die Botschaft gesendet werden soll. 'send timeout' ist die Zeitspanne, die maximal verstreichen darf, ohne daß der Versuch, die Sendung zuzustellen, wegen Erfolglosigkeit abgebrochen wird. 'result' liefert einen der folgenden Werte:

0 : communication ok 
1 : task not existing 
2 : send timeout 
5 : communication error

Bemerkung: Falls dieser Systemaufruf im virtuellen 8086 Modus benutzt wird, muß ein separates Segment auf das das Segmentregister GS zeigen muß, aufgebaut werden., Dieses Segment enthält dann einen Botschaftsvektor in der Struktur wie in 14.2 beschrieben.

receive process

Code: 30
Wirkung: Versucht von einem bestimmten Sender eine Botschaft zu empfangen (Geschlossenes Warten). Es wird bis zum Ablauf von 'receive timeout' auf das Eintreffen einer Sendung gewartet.

Register vor INT 7
 AL : 30 
EBX : PRCID partner (low DWORD) 
ECX : PRCID partner (high DWORD) 
EDX : receive timeout 
ESI : 
EDI : 0  oder MSGVEC in GS:0

Register nach INT 7
EAX : result 
EBX : 
ECX : 
EDX :

Parameter: 'partner' ist der Prozeßbezeichner des Prozesses, von dem die Botschaft empfangen werden soll. 'receive timeout' ist die Zeitspanne, die maximal verstreichen darf, ohne daß der Versuch, die Sendung zu empfangen, wegen Erfolglosigkeit abgebrochen wird. 'result' liefert einen der folgenden Werte:

0 : communication ok 
1 : task not existing 
3 : receive timeout 
5 : communication error

Bemerkung: Falls dieser Systemaufruf im virtuellen 8086 Modus benutzt wird, muß ein separates Segment auf das das Segmentregister GS zeigen muß, aufgebaut werden., Dieses Segment enthält dann einen Botschaftsvektor in der Struktur wie in 14.2 beschrieben.

wait process

Code: 31
Wirkung: Versucht von einem beliebigen Sender eine Botschaft zu empfangen (Offenes Warten). Es wird bis zum Ablauf von 'receive timeout' auf das Eintreffen einer Sendung gewartet.

Register vor INT 7
 AL : 31 
EBX : 
ECX : 
EDX : receive timeout 
ESI : 
EDI : 0  oder MSGVEC in GS:0

Register nach INT 7
EAX : result 
EBX : PRCID partner (low DWORD) 
ECX : PRCID partner (high DWORD) 
EDX :

Parameter: 'partner' ist der Prozeßbezeichner des Prozesses, der die Botschaft gesendet hat. 'receive timeout' ist die Zeitspanne, die maximal verstreichen darf, ohne daß der Versuch, eine Sendung zu empfangen, wegen Erfolglosigkeit abgebrochen wird. 'result' liefert einen der folgenden Werte:

0 : communication ok 
1 : task not existing 
3 : receive timeout 
5 : communication error

Bemerkung: Falls dieser Systemaufruf im virtuellen 8086 Modus benutzt wird, muß ein separates Segment auf das das Segmentregister GS zeigen muß, aufgebaut werden., Dieses Segment enthält dann einen Botschaftsvektor in der Struktur wie in 14.2 beschrieben.

get state

Code: 32
Wirkung: Liefert einen Auszug aus dem Prozeßkontrollblock eines Prozesses. Dieser sogenannte Statusvektor enthält Angaben über Rechenzeit, Speicherplatzbelegung, Kommunikationspartner etc.

Register vor INT 7
 AL : 32 
EBX : PRCID process id (low DWORD) 
ECX : PRCID process id (high DWORD) 
 DS :  EDX :<STATUSVECTOR statevec> 
ESI : 
EDI :

Register nach INT 7
EAX : 
EBX : 
ECX : 
 DS :  EDX :<STATUSVECTOR statevec>

Parameter: 'processid' Prozeßbezeichner 'statevec' Statusvektor:

Code: 34
Wirkung: Liefert die Anzahl der Datenräume einer Task.

Register vor INT 7
 AL : 34 
EBX : PRCID process id (low DWORD) 
ECX : PRCID process id (high DWORD) 
EDX : 
ESI : 
EDI :

Register nach INT 7
EAX : INT no of dataspaces 
EBX : 
ECX : 
EDX :

Parameter: 'taskid' Prozeßbezeichner der Task, deren Bestand an Datenräumen geprüft wird. 'no' Anzahl der Datenräume, die diese Task besitzt. Falls der Prozeßbezeichner keinen gültigen Prozeß bezeichnet, wird 0 geliefert.

block process

Code: 36
Wirkung: Blockiert den angegebenen Prozeß; d.h. er wird solange von der Zuteilung von Rechenzeit ausgeschlossen, bis er eine Botschaft oder einen Interrupt erhält. Dieser Systemaufruf erfordert mindestens das Privileg 1.

Register vor INT 7
 AL : 36 
EBX : PRCID process id (low DWORD) 
ECX : PRCID process id (high DWORD) 
EDX : 
ESI : 
EDI :

Register nach INT 7
EAX : 
EBX : 
ECX : 
EDX :

Parameter: 'taskid' Prozeßbezeichner des Prozesses, der blockiert werden soll.

unblock process

Code: 37
Wirkung: Entblockiert den angegebenen Prozeß; d.h. falls er von der Zuteilung von Rechenzeit ausgeschlossen war, wird diese Blockierung aufgehoben. Falls keine Blockade vorlag, hat der Aufruf keine Wirkung. Dieser Systemaufruf erfordert mindestens das Privileg 1.

Register vor INT 7
 AL : 37 
EBX : PRCID process id (low DWORD) 
ECX : PRCID process id (high DWORD) 
EDX : 
ESI : 
EDI :

Register nach INT 7
EAX : 
EBX : 
ECX : 
EDX :

Parameter: 'processid' Prozeßbezeichner des Prozesses, der entblockiert werden soll.

set priority

Code: 38
Wirkung: Legt die Priorität des angegebenen Prozesses neu fest. Dieser Systemaufruf erfordert mindestens das Privileg 1.

Register vor INT 7
 AL : 38 
EBX : PRCID process id (low DWORD) 
ECX : PRCID process id (high DWORD) 
EDX : INT priority 
ESI : 
EDI :

Register nach INT 7
EAX : 
EBX : 
ECX : 
EDX :

Parameter: 'processid' Prozeßbezeichner des Prozesses, dessen Priorität neu festgelegt wird. 'prio' neue Priorität dieses Prozesses. Dieser Wert, der zwischen 0 und 15 liegen darf, gibt an, jede wievielte mögliche Zeitscheibe der betroffene Prozeß erhalten soll. Folglich stellt 0 (keine Zeitscheibe auslassen) die höchste, 15?? (14 Zeitscheiben auslassen, 15te zuteilen) die niedrigste Priorität dar.

switch process

Code: 50
Wirkung: Der aufrufende Prozeß informiert den Systemkern, daß er in der aktuellen Zeitscheibe keine Rechenzeit mehr benötigt. Der Kern teilt dann sofort dem nächsten Prozeß die CPU zu.

Register vor INT 7
 AL : 50 
EBX : 
ECX : 
EDX : 
ESI : 
EDI :

Register nach INT 7
EAX : 
EBX : 
ECX : 
EDX :

Parameter: -

Bemerkung: Gerade Realprozesse (mit Priorität 0) sollten in jeder geeigneten Situation mit diesem Systemaufruf den Scheduler veranlassen, den Prozessor weiterzureichen.

Beispiel:
DO 
  mov   ebx,'GOL' 
  mov   al,sys_prc_id 
  int   7 
  mov   [log_prc],eax 
  mov   [log_prc+4],ebx 
  test  eax,eax 
  EXITNZ 
  mov   al,switch_prc 
  int   7 
REPEAT 
OD
set alarm

Code: 51
Wirkung: Der aufrufende Prozeß informiert den Systemkern, daß er im angegebenen Takt (alle x Millisekunden) einen Interrupt erhalten möchte. Der Interrupt wird als INT 2 (NMI) geliefert. Dieser NMI hat natürlich nichts mit dem Hardware NMI des Prozessors zu tun (der wird nur vom Systemkern behandelt).

Register vor INT 7
 AL : 51 
EBX : INT period 
ECX : 
EDX : 
ESI : 
EDI :

Register nach INT 7
EAX : 
EBX : 
ECX : 
EDX :

Parameter: 'period' Zeit in Millisekunden zwischen zwei Interrupts.

special operation

Code: 52
Wirkung: Der aufrufende Prozeß fordert mit diesem Aufruf vom Systemkern eine besondere in Register EBX textuell spezifizierte Leistung.

Register vor INT 7
 AL : 52 
EBX : TEXT spec 
ECX : 
EDX : 
ESI : 
EDI :

Register nach INT 7
EAX : 
EBX : 
ECX : 
EDX :

Parameter: 'spec' Kurzbezeichnung für die angeforderte Leistung. Die über diesen Systemaufruf abrufbaren Leistungen werden in einer gesonderten Beschreibung zu Hardwaretreibern für ein L3 System erörtert.

get real time

Code: 53
Wirkung: Der Aufrufer erhält vom Systemkern den aktuellen Wert der Systemuhr. Der Wert wird in Millisekunden geliefert. Er sollte beispielsweise zu Zeitmessungen herangezogen werden. Für Datum/Uhrzeitabfragen sollte get date time benutzt werden.

Register vor INT 7
 AL : 53 
EBX : 
ECX : 
EDX : 
ESI : 
EDI :

Register nach INT 7
EAX : lower DWORD of real time 
EBX : upper DWORD of real time 
ECX : 
EDX :

Parameter: 'real time' enthält den Wert »Millisekunden seit Christi Geburt« (1.Januar 1, 0:00 Uhr)

get date time

Code: 54
Wirkung: Der Aufrufer erhält vom Systemkern den aktuellen Wert der Systemuhr. Der Wert wird in BCD Codierung, passend für Datum/Uhrzeitabfragen geliefert.

Register vor INT 7
 AL : 54 
EBX : 
ECX : 
EDX : 
ESI : 
EDI :

Register nach INT 7
EAX : BCD time 
EBX : BCD date 
ECX : 
EDX :

Parameter: 'time':
Stunde   := h2 * 10 + h1 
Minute   := m2 * 10 + m1 
Sekunde  := s2 * 10 + s1 
Sommerzeit  :=  (d = 1)

'date':

c2 c1 y2 y1 m2 m1 d2 d1 
 
Jahrhundert := c2 * 10 + c1 
Jahr        := y2 * 10 + y1 
Monat       := m2 * 10 + m1 
Tag         := d2 * 10 + d1
control out

Code: 61
Wirkung: Gibt ein in Register BL übergebenes Byte aus. Es wird direkt in den Bildschirmspeicher geschrieben. Die erste Ausgabeposition ist (0,5), weitere Kontrollausgaben werden auf Position (2,5), (4,5) usw. bis maximal (78,10) ausgegeben. Maximal werden also 6 Bildschirmzeilen von den Kontrollausgaben überschrieben.

Register vor INT 7
 AL : 61 
 BL : BYTE char 
ECX : 
EDX : 
ESI : 
EDI :

Register nach INT 7
EAX : 
EBX : 
ECX : 
EDX :

Parameter: 'char' kann ein beliebiges ASCII Zeichen sein.


next up previous contents index
Next: Anpassung von Terminals Up: L3 Referenzhandbuch Previous: Was sind L3 Protokolle?

Michael Hohmuth
Sun Mar 31 04:49:53 MET DST 1996