Next: Anpassung von Terminals
Up: L3 Referenzhandbuch
Previous: Was sind L3 Protokolle?
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 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.
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
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: Anpassung von Terminals
Up: L3 Referenzhandbuch
Previous: Was sind L3 Protokolle?
Michael Hohmuth
Sun Mar 31 04:49:53 MET DST 1996