Hinweise fr Programmierer: =========================== Programme, die VMEM V1.1 verwenden, k”nnen nur dann gestartet werden, wenn VMEM.PRG installiert werden konnte. Andernfalls werden alle Funktionsaufrufe mit einem Fehlercode zurckgewiesen. Deshalb sollte man unmittelbar nach der Konfiguration den Fehlercode auf 0 abprfen und andernfalls das Programm mit einer Fehlermeldung abbrechen. Vor der Konfiguration des virtuellen Speichers sollten bestimmte Parameter vom Anwender erfragt werden. Dies ist vor allem bei der Wahl der Partition fr die tempor„re Datei, bei der Gr”že des Cache-Speichers sowie bei der maximalen Gr”že des virtuellen Speichers sinnvoll. Nach der Konfiguration sollte man es vermeiden, Dateien auf die Partition zu kopieren, auf der sich die tempor„re Datei befindet, da man ansonsten w„hrend der Laufzeit einen _NULL-Zeiger bei einem VM_ALLOC-Aufruf erhalten k”nnte, falls nicht mehr gengend freier Platz zur Verfgung steht. Der Speicherbedarf im Hauptspeicher berechnet sich nach folgender Formel: 3 * maximale Anzahl Seiten im virtuellen Speicher + 4 * Anzahl Seiten im Cache + Gr”že des Caches in Bytes + Gr”že einer Seite des virtuellen Speichers ---------------------------------------------------- = Gr”že des zus„tzlichen Speicherbedarfs in Bytes Dieser Speicher wird bei dem VM_CONFIG-Aufruf automatisch angefordert und geh”rt somit zum aktuellen Programm hinzu. Es ist derzeit nicht m”glich, aus dem laufenden Programm heraus ein anderes, VMEM-nutzendes Programm aufzurufen. Wird dies nicht beachtet, so ist mit dem Verlust der gesamten Daten im virtuellen Speicher zu rechnen!! Fr bestimmte Parameter sind nur die in der Datei VMEM.H definierten Werte zul„ssig. Vor allem die Werte fr READ_MODE und WRITE_MODE fr die Funktion VM_ADDRESS sind unbedingt beizubehalten, da andere Werte fr ein grožes Chaos sorgen wrden. Beim Zugriff auf die Daten des virtuellen Speichers ist folgendes zu beachten: Wenn man mittels VM_ADDRESS einen Zeiger auf einen bestimmten Speicherbereich erhalten hat, so ist nach Aufruf einer anderen VMEM-Funktion dieser Zeiger als ungltig anzusehen, da sich der Inhalt des Caches ver„ndert haben k”nnte. Des- halb sollte man vor dem n„chsten Zugriff auf den Cache wieder VM_ADDRESS auf- rufen. Wenn die Cache-Verwaltung feststellt, daž sich die betreffenden Seiten immer noch im Cache befinden, so erfolgt kein Zugriff auf die Platte und man hat nur eine geringe Verz”gerung. Man muž jedoch beachten, daž man einen ande- ren Zeiger bekommen kann, da die Verwaltung den Cache reorganisieren kann. Die maximale Gr”že des virtuellen Speichers betr„gt 65536*32768 Bytes (oder anders ausgedrckt: 2 Gigabyte !!) Da diese Datenmenge von keinem bisher er- h„ltlichen Programm erzeugt wird und die brauchbarste Seitengr”že 4 KByte betr„gt, ist die sinnvolle Obergrenze derzeit bei 256 MByte. Da eine DIN A4 Seite, die mit 256 Graustufen gescannt wurde, ca. 8 MByte (ungepackt) belegt, ist eine virtuelle Speicherverwaltung trotz der langsameren Zugriffsgeschwin- digkeit von enormen Vorteil, da sie auf jedem Atari ST und TT mit Festplatte einsetzbar ist. Die einzige Voraussetzung ist etwas Platz auf der Platte, um die tempor„re Datei, die den virtuellen Speicher beinhaltet, anlegen zu k”nnen. Die Wahl der Seitengr”že ist abh„ngig von dem gewnschten Einsatzgebiet: soll VMEM z.B. in einem Zeichenprogramm eingesetzt werden, so ist SIZE_32768 die ideale Gr”že, da auf die Zeichnung selbst meistens linear zugegriffen wird. Wenn man aber eine Datenbank mit VMEM aufbaut und ein Datensatz z.B. 300 Byte belegt, sollte man SIZE_1024 w„hlen. Generell gilt: wenn auf Daten im virtuellen Speicher zusammenh„ngend zuge- griffen wird, so sind grože Seiten praktischer. Fr einen wahlfreien Zugriff eignen sich hingegen kleine Seiten, da besonders bei vielen Zugriffen viele Seiten aus dem Cache ausgelagert werden mssen und die geringe Gr”že einer Seite das Ein- und Auslagern beschleunigt. ****************************************************************************** Funktionsbersicht (Version 1.1): ================================= Hinweis: in der Datei VMEM.H finden sich s„mtliche Definitionen VM_CONFIG: int vm_config (TAB *parameter) ---------- Mit dieser Funktion wird der virtuelle Speicher sowie der fr die Verwaltung n”tige Hauptspeicher konfiguriert und initialisiert. Hierzu bergibt man die folgenden Informationen mit Hilfe der Struktur TAB: TAB { WORD version; WORD count_page; WORD cache_size; WORD page_type; int fill_value; int drive_no; }; version: enth„lt die Versionsnummer des TAB-Parameterblocks (derzeit 256 bzw. 0x100). Auf diese Art und Weise ist es m”glich, auch in sp„teren Versionen von VMEM das Programm unver„ndert laufen zu lassen, da VMEM sich an der Versionsnummer orientiert. Diese Variable sollte deshalb vorerst immer den Wert 256 erhalten. count_page: bestimmt die maximale Anzahl an Seiten im virtuellen Speicher. Je gr”žer dieser Wert ist, desto gr”žer kann auch der virtuelle Speicher werden. Jedoch erh”ht sich damit auch der zus„tzliche Speicherbedarf, da fr jede Seite ein Byte belegt wird. cache_size: bestimmt die Anzahl der Seiten, die in den Cache passen. Man sollte diesen Wert nicht zu klein w„hlen, da man ansonsten keine grožen Bl”cke mittels VM_ADDRESS ansprechen kann. Der Cache sollte in der Lage sein, 10% des virtuellen Speichers aufnehmen zu k”nnen. Das Minimum betr„gt 4 Seiten. page_type: hiermit w„hlt man die Gr”že einer Seite aus. Je gr”žer eine Seite ist, desto gr”žer kann man den virtuellen Speicher machen. Man muž aber beachten, daž eine Seite von 32 KByte mehr Zeit ben”tigt zum Ein- und Auslagern als eine 4 KByte-Seite. Diese Variable sollte deshalb vorerst den Wert SIZE_4096 erhalten, da die anderen Werte nur in einigen bestimmten F„llen Vorteile bieten. fill_value: bestimmt den Fllwert einer Seite, falls das erste Mal darauf zu- gegriffen wird. Man kann somit bestimmte Seiten mit einem Fllwert belegen, ohne auf diese Seiten jemals einen Schreibzugriff gemacht zu haben (praktisch z.B. fr leere Stellen in einer Grafik). drive_no: legt das Laufwerk fest, auf dem die tempor„re Datei angelegt werden soll. Das Laufwerk A und B ungeeignet sind, beginnt die Z„hlung bei 3 (= Laufwerk C). Auf diesem Laufwerk sollte noch soviel Platz sein, um die VM_ALLOC-Aufrufe erfllen zu k”nnen. Man muž also nicht Platz fr den gesamten virtuellen Speicher haben, jedoch sollte man Dateien, die vom aktuellen Programm er- stellt werden, nicht unbedingt auf die gleiche Partition speichern. Wenn man jedoch alle VM_ALLOC-Aufrufe get„tigt hat, so ist die tempor„re Datei in ihrer maximalen Gr”že vorhanden und der ver- bleibende Restspeicher der Partition kann genutzt werden. Deshalb sollte man, falls m”glich, direkt nach der Konfiguration den be- n”tigten virtuellen Speicher anfordern. Ergebnis der Funktion: = 0: der virtuelle Speicher und die Verwaltungsinformation konnte konfiguriert und installiert werden, alles ist OK. > 0: das Programm kann nicht weitermachen, da VMEM.PRG nicht installiert worden ist. Alle folgenden Aufrufe liefern -1 zurck. < 0: Falls der Code zwischen -1 und -255 liegt, so ist ein TOS-Fehler aufgetreten. Andernfalls handelt es sich hierbei um einen in der Datei VMEM.H n„her spezifizierten Fehler. Es gibt leider keinen allgemeingltigen Tip, wie grož man den Cache und den Hauptspeicher machen soll. So kann es sinnvoll sein, einen 1 MByte Haupt- speicher und einen 512 Kbyte Cache anzulegen, um eine m”glichst geringe Anzahl an Festplattenzugriffen zu erreichen. Aber auch ein Hauptspeicher mit 2 MByte kann mit einem Cache von nur 20 Kbyte genutzt werden. Je gr”žer der Cache ist, desto geringer wird i.A. die Anzahl der Plattenzugriffe. VM_INFO: V_INFO *vm_info (void) -------- VM_INFO liefert nach einem VM_CONFIG-Aufruf einige Daten. Diese Daten stehen in der Struktur V_INFO, die in der Datei VMEM.H wie folgt definiert ist: V_INFO { WORD version; WORD count_page; WORD count_blocks; WORD free_blocks; int fill_value; long cache_size; WORD cache_count; long page_size; long max_size; /* Maximalgr”že des virtuellen Speichers */ long max_alloc; /* Maximalgr”že eines einzelnen Blocks */ int drive_no; long drive_free; }; version: Versionsnummer des installierten VMEM-Steuerprogramms. Format: 0x100 oder 256 entspricht V1.00, 0x101 oder 257 ist V1.1 usw. Diese Versionsnummer dient derzeit nur zur Information. count_page: ist der Parameter, der bei VM_CONFIG im Feld bergeben wurde. count_blocks: enth„lt die Anzahl der maximal m”glichen VM_ALLOC-Aufrufe. Falls nach Aufrufen weitere VM_ALLOC folgen, so werden diese mit _NULL beantwortet. Derzeit sind maximal 256 Aufrufe m”glich, bevor mindestens ein VM_FREE-Aufruf erfolgen muž. free_blocks: gibt die Anzahl der noch m”glichen Aufrufe an. Falls der Wert gleich 0 ist, so muž vorher mindestens ein VM_FREE-Aufruf er- folgen. fill_value: ist der bei VM_CONFIG im Feld bergebene Fllwert. cache_size: gibt die Gr”že des Caches in Bytes an. Man kann die Gr”že des Caches auch nach folgender Formel berechnen: Gr”že = Anzahl Cache-Seiten * Gr”že einer Seite in Bytes cache_count: ist die bei VM_CONFIG im Feld bergebene Anzahl an Seiten, die fr den Cache verwendet werden sollen. page_size: gibt die Gr”že einer Seite in Bytes an. max_size: gibt die maximale Gr”že des virtuellen Speichers in Bytes an. max_alloc: bestimmt die maximale Gr”že eines Blockes, der durch VM_ALLOC belegt werden kann. drive_no: ist die Nummer des Laufwerks, auf dem die tempor„re Datei an- gelegt wurde. drive_free: gibt den freien Speicher des Laufwerks in Bytes an, auf dem die tempor„re Datei angelegt wurde. Ergebnis der Funktion: Zeiger auf eine Struktur vom Typ V_INFO Alle in V_INFO aufgefhrten Werte haben rein informativen Charakter. Wichtig fr den Programmierer sind eigentlich nur die Parameter , und . VM_CLOSE: void vm_close (void) --------- Nach Beendigung aller Arbeiten sollte man die tempor„re Datei sowie den fr die Verwaltungsinformation belegten Speicher freigeben. Dies erfolgt mit Aufruf der Prozedur VM_CLOSE. Nach VM_CLOSE ist nur noch VM_CONFIG zul„ssig. VM_CLRCACHE: void vm_clrcache (void) ------------ Mit dieser Funktion wird der Cache neu initialisiert. Dabei werden Seiten, die sich noch im Cache befinden, herausgeschrieben. Ein Aufruf dieser Funktion ist dann sinnvoll, wenn z.B. in einem Zeichenprogramm ein neues Bild bearbeitet werden soll, da somit die Daten des vorherigen Bildes aus dem Cache entfernt werden. Wichtig: die im Cache befindlichen Daten werden nicht gel”scht, da sie vorher in die tempor„re Datei gesichert werden. Diese Funktion sollte man nur ab und zu verwenden, da sie die eigentliche Aufgabe des Caches (Vermeidung von Plattenzugriffen) negativ beeinflužt. VM_ALLOC: V_ADR vm_alloc (long size) --------- Wenn der bergebene Parameter kleiner als 0 ist, so wird die Gr”že des gr”žten zusammenh„ngenden freien Speicherblocks bestimmt und zurckgegeben. Ansonsten wird auf volle Seiten aufgerundet. Dies bedeutet, daž eine Anforderung von 10 Byte und eine Anforderung von 2 KByte bei einer Seitengr”že von 4 KByte immer eine volle Seite belegt. Danach wird versucht, einen Block der neuen Gr”že zu allokieren. Falls dies nicht m”glich ist (z.B. zu wenig Speicher), dann wird _NULL zurckgeliefert. Andernfalls erh„lt man eine Adresse des virtuellen Speichers, wobei kein Zeiger, sondern ein LONG (genau genommen: V_ADR) bergeben wird. VM_FREE: int vm_free (V_ADR address) -------- Mit dieser Funktion kann man einen vorher mit VM_ALLOC belegten Speicherbereich wieder freigeben. Als Ergebnis erh„lt man OK, falls der Block freigegeben werden konnte, und NOT_OK, falls ein Block mit dieser Adresse nicht existierte. VM_ADDRESS: char *vm_address (V_ADR address, long *window_size, int mode) ----------- Um ein "Fenster" zu setzen, verwendet man die Funktion VM_ADDRESS. Dabei wird versucht, einen aus Bytes bestehenden Speicherbereich in den Cache einzulagern. Falls dies nicht m”glich ist, weil entweder
zu nah am Ende des Speicherblocks oder gr”žer als der Cache ist, dann wird der Parameter mit dem gr”žtm”glichen Wert versorgt. Deshalb sollte man nach Aufruf von VM_ADDRESS nicht mehr als die in bergebene Anzahl an Bytes adressieren, da ansonsten andere Daten ver„ndert werden k”nnten. Normalerweise sollte der Wert von h”chstens halb so grož wie der Cache sein.
gibt die Startadresse im virtuellen Speicher an, ab der man Bytes lesen oder schreiben m”chte. Wenn man die Bytes nur lesen m”chte, so sollte man auf READ_MODE setzen, da dies die Verwaltung des Caches informiert, daž diese Seiten nicht ver„ndert wurden. Ver„ndert man dennoch den Inhalt, so sind diese Seiten im weiteren Verlauf nicht mehr konsistent. Wenn man jedoch Bytes schreiben m”chte, so muž man auf WRITE_MODE setzen. Im Falle eines Fehler erh„lt man ILLEGAL_ADDRESS, falls auf einen nicht vor- handenen Speicherbereich zugegriffen wird, ILLEGAL_COUNT, falls die gewnschte Gr”že des Fensters kleiner oder gleich 0 ist, und ILLEGAL_MODE, falls fr ein anderer Wert als READ_MODE oder WRITE_MODE angegeben wurde. Wenn die Seiten ohne Probleme in den Cache eingelagert werden konnten, so wird als Ergebnis ein Zeiger auf das erste Byte im Cache, das man mit
spe- zifiziert hat, zurckgeliefert. Auf keinen Fall darf man Daten adressieren, die unterhalb des als Ergebnis er- haltenen Zeigers liegen. Auch die Daten, die ab + sich befinden, sind tabu. VM_FILL: long vm_fill (V_ADR address, long count, int value) -------- Um bestimmte Stellen des virtuellen Speichers schnell mit einem bestimmten Wert zu fllen, sollte man VM_FILL verwenden. Hierzu bergibt man die Startadresse im virtuellen Speicher sowie die Anzahl der Bytes und den gewnschten Fllwert. Wenn fr -1 bergeben wird, so wird der Speicherbereich von
bis zum Ende des Speicherblocks mit gefllt. Ansonsten wird unter Be- rcksichtigung von gefllt. Sollte dabei das Ende des Speicherblocks erreicht werden, so wird an dieser Stelle abgebrochen. Als Ergebnis erh„lt man entweder eine Fehlermeldung (ILLEGAL_ADDRESS fr eine falsche Adresse bzw. ILLEGAL_COUNT falls kleiner als -1 ist) oder man erh„lt die Anzahl der geschriebenen Bytes. VM_LOAD: long vm_load (V_ADR source, char *destination, long count) -------- Mit der Funktion VM_LOAD kann man einen zusammenh„ngenden Speicherbereich aus dem virtuellen Speicher in den physikalischen Speicher kopieren. Hierbei gelten fr und die gleichen Einschr„nkungen wie fr
und bei VM_FILL. Zu beachten ist noch, daž einen gltige Zieladresse ber- geben wird. VM_SAVE: long vm_save (char *source, V_ADR destination, long count) -------- Die Funktion VM_SAVE ist das direkt Gegenstck zu VM_LOAD. Hierbei wird ein zu- sammenh„ngender Speicherbereich in den virtuellen Speicher kopiert. Auch hier gelten fr und die gleichen Einschr„nkungen wie fr die Parameter bei VM_FILL. Die beiden Funktionen VM_LOAD und VM_SAVE sind besonders gut zum schnellen Aus- tausch von Daten zwischen dem physikalischen und dem virtuellen Speicher ge- eignet (z.B. beim Einsatz in einer UNDO-Funktion eines Zeichenprogrammes). VM_READ: long vm_read (int handle, long count, V_ADR dest) -------- Das Einlesen von Daten aus einer Datei in den virtuellen Speicher erfolgt mit VM_READ. Hierzu muž die Datei mit der GEMDOS-Funktion Fopen ge”ffnet worden sein. Danach bergibt man das erhaltene Dateihandle, die Anzahl der zu lesen- den Bytes sowie die Zieladresse im virtuellen Speicheran die Funktion. Fr die Parameter und gelten die Einschr„nkungen von VM_FILL. Als Ergebnis erh„lt man entweder eine VMEM-Fehlermeldung (ILLEGAL_ADDRESS oder ILLEGAL_COUNT), eine TOS-Fehlermeldung (-1 bis -255) oder die Anzahl der ge- lesenen Bytes. VM_WRITE: long vm_write (int handle, long count, V_ADR source) --------- Um einen Bereich des virtuellen Speichers in eine Datei sichern zu k”nnen, ver- wendet man VM_WRITE. Die Parameter haben hier die gleiche Bedeutung wie bei VM_READ. stammt entweder von einem Fopen oder Fcreate - Aufruf. Als Ergebnis erh„lt man entweder eine VMEM-Fehlermeldung (ILLEGAL_ADDRESS oder ILLEGAL_COUNT), eine TOS-Fehlermeldung (-1 bis -255) oder die Anzahl der ge- schriebenen Bytes. ****************************************************************************** Fehlermeldungen von VMEM: ========================= ILLEGAL_FUNCTION: Die gewnschte Funktion ist nicht vorhanden WRONG_CACHE_SIZE: Die angegebene Cache-Gr”že ist nicht sinnvoll WRONG_PAGE_TYPE: Der angegebene Seitentyp existiert nicht OUT_OF_MEMORY: Der physikalische Speicher ist nicht grož genug, um den Cache und die Verwal- tungsinformationen aufzunehmen FILE_ERROR: Es ist ein Fehler beim Zugriff auf die Datei aufgetreten (= TOS-Fehler -1) NOT_ENOUGH_SPACE bzw. _NULL: Auf der Partition, auf der sich die tempor„re Datei befindet, ist nicht mehr gengend Platz frei, um weitere VM_ALLOC-Aufrufe zu erfllen NOT_OK: Ein freizugebender Speicherblock mit dieser Adresse existiert nicht ILLEGAL_ADDRESS: Die virtuelle Adresse zeigt auf einen nicht vorhandenen Speicherbereich ILLEGAL_COUNT: Die angegebene Anzahl ist kleiner oder gleich 0 ILLEGAL_FATSIZE: Das Ziellaufwerk fr die tempor„re Datei verwendet eine FAT, die nicht aus 16-Bit-Eintr„gen besteht ****************************************************************************** Benutzung von VMEM in eigenen Programmen: ========================================= Ein Programm, das VMEM nutzen will, sollte ungef„hr folgenden Aufbau haben: ... ... Abfrage der Anwenderspezifischen VMEM-Daten (Partition, Gr”že, usw.) Initialisierung des VM_CONFIG-Parameterblocks Aufruf von VM_CONFIG Falls der Rckgabewert ungleich 0 ist, Fehler melden und Programm beenden ... ... Speicheranforderung(en) mittels VM_ALLOC Falls der Zeiger den Wert _NULL hat, Fehler melden und Programm beenden ... ... Zugriff(e) auf den virtuellen Speicher (VM_ADDRESS, VM_FILL, VM_LOAD, VM_SAVE, VM_READ, VM_WRITE) Rckgabewerte der Funktionen auf Fehler abprfen und eventuell abbrechen (VM_CLOSE nicht vergessen !!) ... ... Freigeben des belegten Speichers mittels VM_FREE (unmittelbar vor VM_CLOSE ist dies nicht notwendig) ... ... Entfernen der tempor„ren Datei sowie des belegten Hauptspeichers fr die Verwaltungsinformation mittels VM_CLOSE ... ... Ab jetzt darf kein Zugriff mehr auf VMEM-Funktionen mit Ausnahme von VM_CONFIG erfolgen !!! ... ... ****************************************************************************** Linken von Programmen mit VMEM-Funktionen: ========================================== Beim Linken von Programmen, die VMEM benutzen, muž die Datei VMEM.LIB (Pure- Format) verwendet werden. Man kann auch die Datei VMEM.S (Assembler-Source der Bibliothek) verwenden. Diese Bibliothek beinhaltet die eigentlichen Auf- rufe der VMEM-Funktionen fr den Pure C - Compiler. Fr andere Compiler muž man die Aufrufe wahrscheinlich umschreiben. Hinweise, was man dabei beachten muž, stehen am Anfang der Datei VMEM.S.