Allgemeines
Anwendungsgebiet: | Memory Pool Technik; siehe "Gemeinsamer Speicherbereich für mehrere Anwender (Memory Pool)" |
Makrotyp: | S-Typ, MF-Format 1: Standardform/L-/E-Form; siehe "S-Typ-Makroaufrufe" |
Ein Anwender kann explizit (zusammenhängenden) Speicherplatz in einem Memory Pool anfordern, wobei gilt:
der Aufrufer muss Pool-Teilnehmer sein (ENAMP),
der zugeteilte Speicherbereich kann von jedem Pool-Teilnehmer wieder freigegeben werden,
auf den zugeteilten Speicherbereich kann jeder Pool-Teilnehmer zugreifen.
Makrobeschreibung
Mit dem Makro REQMP wird zusammenhängender Speicherbereich in einem Memory-Pool angefordert. Die Zuteilung erfolgt in Speicherseiten (4 KB). Die Bytes der Seite(n) sind mit X'00' überschrieben (Ausnahme: die Seite wurde bereits angefordert).
Hinweise
Ein Memory Pool wird über den Pool-Namen oder über seine Kurzkennung (siehe ENAMP) angesprochen.
REQMP wird abgewiesen, wenn für den Memory Pool mit CSTMP Schreibschutz vereinbart wurde.
Residenter Memory Pool: REQMP wird abgewiesen, wenn die Anzahl der angeforderten Seiten den Wert des Operanden RESIDENT-PAGES im Kommando START- oder LOAD-EXECUTABLE-PROGRAM überschreitet.
Größe des Memory Pools und Belegung der Speicherseiten (frei oder nicht frei) können mit MINF abgefragt werden.
Makroaufrufformat und Operandenbeschreibung
REQMP |
{ {MPNAME=name / MPNAMAD={adr / (r)}[,MPNAMLN={länge / (r)}]} [,SCOPE={LOCAL / GROUP / USER_GROUP / GLOBAL}] / MPID={adr / (r)}} [,ADDR=adr / (r)] [,BSIZE=anzahl / (r)] ,ALIGN=4KB / HW_PAGE [,PARMOD=24 / 31] [,MF=L / (E,..)] |
MPNAME=
beschreibt den Namen des Memory Pools (Verbindung mit Operand SCOPE beachten).
name
Name des Memory Pools.
MPNAMAD=
beschreibt die Adresse des Feldes mit name (Verbindung mit Operand SCOPE beachten).
adr
symbolische Adresse (Name) des Feldes
(r)
r = Register mit dem Adresswert des Feldes.
MPNAMLN=
bezeichnet die Länge des unter MPNAMAD angegebenen Namens. Wenn nicht spezifiziert: Längenattribut des Feldes adr oder 54 Byte, wenn MPNAMAD=(r) angegeben wurde.
länge
Länge in Byte.
(r)
r = Register, das länge enthält.
SCOPE=
beschreibt den Geltungsbereich (Teilnehmerkreis) des Memory Pools. Die Angabe dient der Identifizierung des Memory Pools und muss immer in Verbindung mit den Operanden MPNAME bzw. MPNAMAD spezifiziert werden.
LOCAL
Der Memory Pool kann nur von dem Teilnehmer benutzt werden, der den Memory Pool eingerichtet hat.
GROUP
Teilnehmer können alle Tasks unter der Benutzerkennung des Teilnehmers sein, der den Memory Pool eingerichtet hat.
USER_GROUP
Teilnehmer können alle Tasks sein, deren Benutzerkennungen der gleichen Benutzergruppe angehören wie die Benutzerkennung des einrichtenden Teilnehmers. Der Operandenwert setzt die Existenz von Benutzergruppen voraus und kann daher nur angegeben werden, wenn die Funktionseinheit SRPMOPT des Software-Produkts SECOS im System vorhanden ist. Vor einem Makroaufruf mit SCOPE=USER_GROUP muss deshalb mit dem Makro GETUGR (siehe Handbuch „SECOS“ [14]) geprüft werden, ob SRPMOPT zur Verfügung steht; abhängig vom Ergebnis (Returncode) ist im Programm zu reagieren.
GLOBAL
Teilnehmer können alle im System laufenden Tasks sein.
MPID=
beschreibt die Adresse eines Feldes (Länge = 4 Byte) mit der Kurzkennung für den Memory Pool (siehe auch ENAMP). Die Kurzkennung identifiziert den Memory Pool eindeutig. Die Angabe der Kurzkennung beschleunigt die Verarbeitung.
adr
symbolische Adresse (Name) des Feldes mit der Kurzkennung.
(r)
r = Register mit dem Adresswert des Feldes.
ADDR=
bezeichnet die Anfangsadresse des Speicherbereichs, der zugeteilt werden soll. Die Adresse muss auf eine 4-KB-Grenze ausgerichtet sein. Der gesamte Bereich muss im angegebenen Memory Pool liegen.
Voreinstellung: der erste unbenutzte und zusammenhängende Bereich innerhalb des Memory Pools. Der Bereich kann auf eine spezielle Grenze (64-KB-/1-MB-Grenze) ausgerichtet werden, wenn die Anforderung eine bestimmte Anzahl Speicherseiten überschreitet.
adr
Anfangsadresse.
(r)
r = Register mit der Anfangsadresse.
BSIZE=
bezeichnet die Größe des angeforderten Speicherbereichs in Speicherseiten (4 KB).
Voreinstellung: BSIZE=1; wird auch angenommen, wenn BSIZE=0 spezifiziert wurde.
anzahl
Anzahl der Speicherseiten.
(r)
r = Register, das anzahl enthält.
ALIGN=
gibt die Ausrichtung des gewünschten Speicherbereichs an.
4KB
Der gewünschte Speicherbereich soll auf einer 4-KByte-Grenze beginnen.
HW_PAGE
Der gewünschte Speicherbereich soll auf einer Seitengrenze beginnen, die durch die Hardware vorgegeben ist. In diesem Fall müssen die Operanden BSIZE (in 4-KByte-Einheiten) und ADDR (als Anfangsadresse), sofern verwendet, ein Vielfaches der Hardware-Seitengröße sein.
Hinweis
Die Hardware-Seitengröße kann mit dem Makro NSIINF INFO=PAGESIZE ermittelt werden. Sie beträgt auf allen aktuell unterstützten Servern 4 KB, d.h. zwischen ALIGN=4KB und ALIGN=HW_PAGE besteht derzeit kein Unterschied.
MF=
Zur allgemeinen Beschreibung des Operanden MF, der dazugehörenden Operandenwerte und der evtl. nachfolgenden Operanden (z.B. für einen Präfix) siehe Abschnitt „S-Typ-Makroaufrufe“. Die gültigen MF-Werte sind zu Beginn der Makrobeschreibung bei „Makrotyp“ angegeben und aus dem Aufrufformat ersichtlich.
PARMOD=
steuert die Makroauflösung. Es wird entweder die 24-Bit- oder die 31-Bit-Schnittstelle generiert.
Wenn PARMOD nicht spezifiziert wird, erfolgt die Makroauflösung entsprechend der Angabe für den Makro GPARMOD oder der Voreinstellung für den Assembler (= 24-Bit-Schnittstelle).
24
Die 24-Bit-Schnittstelle wird generiert; Datenlisten benutzen 24-Bit-Adressen (Adressraum <= 16 MB).
31
Die 31-Bit-Schnittstelle wird generiert. Datenlisten benutzen 31-Bit-Adressen (Adressraum <= 2 GB) und beginnen mit dem Standardheader.
Rückinformation und Fehleranzeigen
Nach Funktionsausführung wird die Anfangsadresse des zugewiesenen Speichers in Register R1 übergeben.
R15:
+---------------+ | | | | | |b|b|0|0|0|0|a|a| +---------------+
Über die Ausführung des Makros REQMP wird ein gegliederter Returncode (aa=primärer RC, bb=sekundärer RC) im Register R15 übergeben.
aa = X'00': normale Ausführung,
aa = X'04': Funktion nicht ausgeführt.
X'bb' | X'aa' | Erläuterung |
X'00' | X'00' | Normale Ausführung. Speicherseiten wurden zugeteilt. |
X'18' | X'00' | Normale Ausführung. Innerhalb des angeforderten Bereichs war schon mindestens |
X'04' | X'04' | Funktion nicht ausgeführt. Aufrufer ist kein Memory-Pool-Teilnehmer (kein |
X'14' | X'04' | Funktion nicht ausgeführt. Unzureichender Speicherplatz:
|
X'18' | X'04' | Funktion nicht ausgeführt. Ungültiger Speicherbereich:
|
X'1C' | X'04' | Funktion nicht ausgeführt. Operandenfehler:
|
X'24' | X'04' | Funktion nicht ausgeführt. Berechtigungsfehler:
|
31-Bit-Schnittstelle:
Bei fehlerhafter Ausrichtung oder Initialisierung des Standardheaders werden im Register R15 zusätzlich die Returncodes X'0001FFFF' / X'0003FFFF' / X'0004FFFF' übergeben; siehe Tabelle „Standard-Returncodes“ (Standardheader).
Im Standardheader wird kein Returncode übergeben.