@database VMM.guide @Width 72 @Node Main VMM.guide @Next "COPYRIGHT" VMM (Virtual Memory Manager für Amigas mit 68030 oder 68040) Dokumentation Version 2.1 $Date: 94/09/23 16:24:01 $ written by Martin Apel email: apel@gypsy.physik.uni-kl.de CONTENTS 0. @{" Copyright " Link "COPYRIGHT"} 1. @{" Einführung " Link "EINFÜHRUNG"} 2. @{" Installation " Link "INSTALLATION"} 3. @{" Änderungen " Link "ÄNDERUNGEN"} 4. @{" Das Konfigurationsfenster " Link "VMMPREFS"} 5. @{" Unterschiede 68030/68040 " Link "PROC_DIFFS"} 6. @{" Probleme " Link "PROBLEMS"} 7. @{" Fehler beseitigen " Link "FEHLERBESEITIGUNG"} 8. @{" Technical description " Link "TECHNICAL_DES"} 9. @{" VMM.library " Link "VMM_LIBRARY"} 10. @{" Externe Statistik-Programme" Link "EXT_STATS"} 11. @{" Bekannte Fehler " Link "BEKANNTE FEHLER"} 12. @{" Fehlermeldungen " Link "FEHLERMELDUNGEN"} 13. @{" Was die Zukunft so bringt " Link "ZUKUNFTSPLÄNE"} 14. @{" Danksagungen " Link "DANKSAGUNGEN"} 15. @{" Adresse des Autors " Link "ADRESSE"} @EndNode @Node "COPYRIGHT" "VMM.guide/COPYRIGHT" @Next "INTRODUCTION" @Prev "Main" @Toc "Main" VMM darf frei kopiert werden. Wenn Sie mir eine Aufmerksamkeit oder ein Dankeschön für meine Arbeit an VMM zukommen lassen möchten, fühlen Sie sich frei, mir Geschenke, Geld, Postkarten oder eine registrierte Version eines von Ihnen entwickelten Programmes zuzuschicken! VMM WICHTIG: Dieses Programm ist Copyright (c) by Martin Apel, aber es darf frei kopiert werden, solange folgendes beachtet wird: - Weder Programm noch Dokumentation dürfen verändert werden - Das Paket darf nur vollständig weitergegeben werden. - Eine Verbreitung darf über jeden beliebigen Weg erfolgen, jedoch darf dafür oder für das Programm selber keine Gebühr verlangt werden, die die Kosten für den Datenträger und/oder Porto übersteigen. - Eine Aufnahme in PD-Serien wie die Fish-Serie ist erlaubt, solange die Gebühren nicht von denen für eine Fish-Diskette abweichen. - Das Programm ohne schriftliche Erlaubnis des Autors keinem kommerziellen Produkt beigelegt werden. Indem Sie das Programm kopieren, weitergeben oder benutzen, erklären Sie sich mit obigen Bedingungen einverstanden. @EndNode @Node "EINFÜHRUNG" "VMM.guide/EINFÜHRUNG" @Next "INSTALLATION" @Prev "COPYRIGHT" @Toc "Main" 1. EINFÜHRUNG Selbst auf einem A4000 mit 6MB sehnte ich mich nach immer mehr RAM, oder, als Alternative, nach virtuellem Speicher. Der der 68040er eine MMU hat und ich schon lange herausfinden wollte, wie man sie programmiert, entschloß ich mich, selber einen Manager für virtuellen Speicher zu schreiben. Er simuliert bis zu 128MB Speicher, wobei die Größe frei wählbar ist. Version 2.1 unterstützt sowohl Rechner mit 68030er als auch 68040er. Das Paging kann entweder auf einer eigenen Partition, in eine Datei oder auf eine Pseudo-Partition, welche die geschwindigkeit einer 'echten' Partition und die Flexibilotät einer Datei bietet, erfolgen. Wie funktioniert virtueller Speicher ? In einer Umgebung mit virtuellem Speicher muß die CPU die logischen Adressen, mit denen Sie operiert, in physikalische Adressen umwandeln können. Diese Umwandlung erfolgt hardwaremäßig mittels einer MMU (Memory Managment Unit) für jeden einzelnen Speicherzugriff. Der physikalische Speicher wird in mehrere Kacheln (Pages) konstanter Größe eingeteilt, VMM benutzt entweder 4KB oder 8KB. Eine Kachel kann sich entweder im Hauptspeicher befinden oder auf der Festplatte. Immer wenn die CPU nun auf eine Kachel zugreifen möchte, die ausgelagert ist, tritt ein Pagefehler auf. VMM unterbricht dann den regulären Programmablauf, liest die ausgelagerte Kachel ein und legt Sie irgendwo im Speicher ab. Anschließend läuft alles wieder wie gewohnt weiter. Alles dies geschieht im Hintergrund und ohne daß die betreffenden Programme etwas davon mitbekommen. Der einzige Unterschied ist, daß Speicherzugriffe merklich langsamer geworden sind. Weitere Informationen zum Thema "Virtueller Speicher" erhalten Sie in folgenden Büchern: Operating systems - Design and implementation Andrew Tanenbaum Prentice Hall Operating system concepts Silberschatz, Galvin Addison Wesley Wie läuft das mit dem virtuellen Speicher auf dem Amiga? Leider unterstützt das Amiga-Betriebssystem nicht von Haus aus virtuellen Speicher, daher hat dieses Programm etwas von einem Hack. Ich habe versucht, alles so systemkonform wie möglich zu gestalten, aber unter bestimmten Umständen ist es durchaus möglich, daß VMM Ihren Rechner zum Absturz bringen kann. Dies ist weniger die Schuld von VMM als vielmehr die mangelnde Weitsicht der Amiga-Entwickler in Bezug auf virtuellen Speicher. VMM klinkt eine normale MemoryList in die Speicherverwaltung des Betriebssystems ein, damit der virtuelle Speicher wie jeder normale Speicher behandelt werden kann. Virtueller Speicher wird nur angefordert, wenn bei der Anforderung das MEMF_PUBLIC-Flag nicht gesetzt ist. Andernfalls könnten wichtige Systemdaten wie TaskControlBlocks oder IORequests ausgelagert werden, was ausgesprochen katastrophal wäre. Der Code-Teil von Programmen kann NICHT in den virtuellen Speicher ausgelagert werden, da die DOS-Laderoutinen immer das MEMF_PUBLIC-Flag setzen. @EndNode @Node "INSTALLATION" "VMM.guide/INSTALLATION" @Next "ÄNDERUNGEN" @Prev "INTRODUCTION" @Toc "Main" 2. INSTALLATION VMM benötigt mindestens OS2.0. Es gibt zwei Möglichkeiten, VMM zu installieren. Zum einen gibt es ein Skript für den Commodore-Installer, das Sie einfach durch einen Doppelklick starten können, zum andern können Sie die Dateien per Hand wie folgt auf Ihrer Festplatte installieren: Es gibt zwei Versionen des Programms, eine für eine Pagegröße von 4KB und eine für 8KB. Zunächst müssen Sie sich für eine der Größen entscheiden, normalerweise können Sie die 4KB-Version installieren, einige 68040er-Karten für den A2000 laufen jedoch nur mit 8KB-Pages. Ist bereits eine MMU-Tabelle installiert, müssen Sie die Größe verwenden, die diese Tabelle benutzt, sonst stürzt der Rechner ab. Mittels des Programmes "ShowPageSize" können Sie feststellen, welche Größen auf Ihrem System funktionieren. Wenn Sie sich für eine Größe entschieden haben, kopieren Sie das entsprechende Programm in Ihre "L:" Schublade und benennen Sie es in "VMM-Handler" um. Das Programm "VMM" kopieren Sie am besten in Ihre "WBStartUp" Schublade. Die Entwicklerdokumenation können Sie sich sonstwohin kopieren. Wenn Sie VMM das erste Mal benutzen, müssen Sie noch einige Parameter bezüglich der Kachelverwaltung (Paging) einstellen. Starten Sie zunächst VMM per Doppelklick oder von einer Shell aus. Eine Beispielkonfiguration wird mitgeliefert, sie heißt "VMM.prefs". Nachdem Sie ein Laufwerk angegeben haben, sollten Sie das ToolType "CX_POPUP=NO" setzen, damit VMM in Zukunft sofort startet. Während VMM läuft, können Sie das Fenster jederzeit wieder öffnen, indem Sie entweder einen HotKey drücken (voreingestellt ist: ralt rshift v), oder indem Sie VMM ein zweites Mal starten. Mittels der folgenden Argumente können Sie VMM beim Start von der Workbench oder einer Shell aus konfigurieren: CX_POPUP=YES!NO CX_PRIORITY= CX_POPKEY= QUIT (Beendet VMM, falls es läuft) @EndNode @Node "ÄNDERUNGEN" "VMM.guide/ÄNDERUNGEN" @Next "VMMPREFS" @Prev "INSTALLATION" @Toc "Main" 3. ÄNDERUNGEN @{" Änderungen von V1.0 nach V1.1" Link "Nach_1_1"} @{" Änderungen von V1.1 nach V1.2" Link "Nach_1_2"} @{" Änderungen von V1.2 nach V1.3" Link "Nach_1_3"} @{" Änderungen von V1.3 nach V2.0" Link "Nach_2_0"} @{" Änderungen von V2.0 nach V2.1" Link "Nach_2_1"} @EndNode @Node "Nach_1_1" "VMM.guide/Nach_1_1" @Prev "ÄNDERUNGEN" @Next "Nach_1_2" @Toc "Main" Seit Version 1.0 gab es doch schon einige größere Veränderungen und Erweiterungen: - Auf Systemen mit Festplatten mit einer anderen Unit als 0 gab es Probleme mit Zugriffen auf die falsche Partition. - Mittlerweile gibt es auch eine dynamische Speicheranforderung für die einzelnen Page-Frames. Immer wenn ein Pagefehler auftritt, wird eine neue Page angelegt, um die Festplattenzugriffe zu reduzieren. Wird Speicher für andere Zwecke dringender benötigt, gibt VMM wieder Speicher frei. - Das Paging kann jetzt auch in einzelne Dateien erfolgen. Leider ist dies wegen AmigaDOS relativ langsam. - VMM sollte nun auf allen 68040ern problemlos laufen, nötigenfalls wird eine eigene MMU-Tabelle angelegt. - Das Statistikfenster ist jetzt Fontsensitiv und zeigt mehr Informationen an. Ein eigenes Programm "VMMStat" wird mitgeliefert, so daß das Statistikfenster nicht die ganze Zeit offen sein muß. - Es sind bis zu 64MB virtueller Speicher verfügbar. - Es gibt zwei verschiedene Programmversionen, eine für 4KB-Pages und eine für 8KB-Pages. - Die Zugriffszeit wurde erheblich reduziert, indem die Kopfbewegungen des Auslagerungsgerätes minimiert werden. @EndNode @Node "Nach_1_2" "VMM.guide/Nach_1_2" @Prev "Nach_1_1" @Next "Nach_1_3" @Toc "Main" - In V1.1 wurde ein bestimmter Speicherbereich aus Sicherheitsgründen komplett gesperrt. Dies wurde nach erheblichen Problemen mit AdPro wieder rückgängig gemacht. - Ein kleines Programm namens "ShowPageSize" wurde hinuzgefügt, welches dem Benutzer die auf seinem System mögliche Pagegröße anzeigt. - Ein Fehler mit Pfadlängen, die länger als 20 Zeichen waren, wurde beseitigt. Jetzt können Dateipfade bis zu 80 Zeichen und Partitionsnamen bis zu 40 Zeichen lang sein. - Die Obergrenze für virtuellen Speicher wurde auf 128MB erweitert. - Eine spezielle Library wurde hinzugefügt. Sie enthält u.a. die Funktionen AllocVMem, FreeVMem und AvailVMem. Beachten Sie hierzu bitte auch die mitgelieferte Dokumentation "vmm_lib.doc". @EndNode @Node "Nach_1_3" "VMM.guide/Nach_1_3" @Prev "Nach_1_2" @Next "Nach_2_0" @Toc "Main" - Bei FreeMem werden die freigegebenen Pages jetzt als leer markiert, wodurch beim Freigeben weniger umkopiert werden muß. Leider verträgt sich das nicht mit Tools wie MungWall, die Speicher beschreiben, den sie nicht alloziert haben. - Es wurde ein Fehler beseitigt, der beim gleichzeitigen Zugriff auf mehrere Units eines Gerätes für Heiterkeit sorgte. Vermutlich war das auch die Ursache für die Grafikfehler bei der Darstellung von Text und Icons. - Das Statistikfenster ist nun verkleinerbar, damit man es auf die Titelzeile reduzieren kann, in der dann der freie virtuelle Speicher angezeigt wird. Fensterposition und -status können mittels VMMPrefs eingestellt werden. - Die Voreinstellungen können nun während des Betriebes geändert werden. Alle Parameteränderungen bis auf das Auslagerungsmedium, die Größe und die Fensterpositionen werden sofort übernommen. - Eine weitere Möglichkeit der Speicheranforderung wurde eingeführt, "Advanced Section". Hier können Sie die minimale Speichergröße für PUBLIC- und nicht-PUBLIC-Anforderungen einstellen. - Die Anzahl der verwendeten Signals wurde reduziert, da es einige Probleme mit anderen Programmen gab, die bereits alle Signale alloziert hatten. - Die Wait-Funktion wurde gepatched, um einige Probleme mit Programmen, die den Stack im VM hatten, zu beseitigen. - Sie können VMM jetzt beenden, selbst wenn noch VM benutzt wird. In diesem Fall versucht VMM, den benutzen VM in das vorhandene RAM umzukopieren und die MMU-Tabellen wieder zu restaurieren, bevor es sich beendet. - Veränderte Pages werden jetzt ausgelagert, bevor es wirklich notwendig ist. Dadurch werden bessere Fehlerraten erzielt. - Ein Reset-Handler wurde hinzugefügt, der einen Neustart so lange verhindert, bis das Paging beendet ist. Dadurch werden lästige Validierungsvorgänge nach dem Neustart vermieden. - Ein Bug, an welchem sich VMM immer aufhängte, wenn es die erste Page auf ein DMA-Laufwerk schreiben wollte, wurde beseitigt. - Kleinere Veränderungen und Optimierungen. @EndNode @Node "Nach_2_0" "VMM.guide/Nach_2_0" @Prev "Nach_1_3" @Next "Nach_2_1" @Toc "Main" - VMM läuft jetzt auch auf 68030ern, VMM40 wurde in VMM umbenannt. - Die sog. Pseudo-Partitionen sind hinzugekommen, die wie normale Dateien angesprochen werden, Zugriffe darauf sind aber fast so schnell wie auf eine 'echte' Partition. - VMM ist jetzt ein Commodity und kann über ein Hotkey aktiviert werden. Die Programmaufteilung hat sich ein wenig geändert, VMM40 heißt jetzt VMM-Handler und residiert in L:, VMM40Prefs ist jetzt einfach nur noch "VMM". Das Assign VMM: und das StartVMM-Programm wurden überflüssig. - Hoffentlich wurde die Probleme mit DMA-Geräten durch das Patchen von CachePreDMA und CachePostDMA beseitigt... - Die GUI wurde ein wenig modifiziert, um Platz für einige zusätzliche Gadgets zu schaffen. - VMM patched nun die Workbench-Titelzeile um den freien Speicher anzuzeigen. Mittels des Konfigurationsprogrammes kann diese Option abgeschaltet werden. - Das Beenden bei angefordertem VM wurde verbessert. - Diverse kleinere Änderungen und Bugfixes. @EndNode @Node "Nach_2_1" "VMM.guide/Nach_2_1" @Prev "Nach_2_0" @Next "VMMPREFS" - AvailMem gibt jetzt die Größe des freien RAMs zurück, wenn ein Task kein VM benutzen darf. - War kein Preference-File vorhanden, hängte sich VMM auf. Jetzt wird ein Hinweisfenster angezeigt. - Im Installationsskript wurde vergessen, die Beispielkonfiguration mit zu kopieren. - Ein Schreibpuffer wurde eingerichtet, um mehrere Schreibzugriffe zusammenfassen zu können. Obwohl dadurch die Pages erst noch einmal umkopiert werden müssen, ergibt sich ein beträchtlicher Geschwindigkeitszuwachs. - Die Option, den größten freien Block zu pagen, wurde wieder entfernt, da sie scheinbar niemand brauchte. - Das Paging in eine Datei wurde nochmals erheblich beschleunigt, indem zusätzliche Puffer eingebaut wurden. FFS und OFS sind äußerst ineffizient, was das Positionieren innerhalb langen Dateien angeht. VMM alloziert jetzt so viele Puffer, wie nötig sind, alle FileListBlocks im Speicher zu halten. Bei anderen Filesystemen, z.B. MSDOS, ist das nicht nötig. - FreeMem markiert die freigegebenen Pages jetzt nicht mehr als invalid, vielmehr als unused. Frühere Zugriffe auf solchen Speicher hatten zwar auch nicht zu einem Festplattenzugriff geführt, es gab jedoch jedesmal einen Pagefehler und die daraus resultierenden Überprüfungen verlangsamten den Vorgang doch erheblich. - Kleinere Fehler bezüglich der Fontsensitivität im Statistikfenster. - Fehlerbehandlung verbessert. - Ein äußerst diffiziler Bug wurde entfernt, der auf Rechnern mit 68030 und 68882 für Abstürze sorgte. Ich habe die Datenmenge, die während eines Context Switches und während die FPU beschäftigt war, reduziert. - Externe Statistikprogramme werden jetzt unterstützt. - Ein Bug in DOS wurde umgangen, der nur dann auftrat, wenn eine Pseudo-Partition den gleichen Namen wie das Laufwerk oder die Partition, auf der es sich befindet, hatte. @EndNode @Toc "Main" @Node "VMMPREFS" "VMM.guide/VMMPREFS" @Next "Tasks_Gadget" @Prev "ÄNDERUNGEN" @Toc "Main" 4. Das Konfigurationsfenster In diesem Fenster werden alle Einstellungen, die VMM zum Betrieb benötigt, vorgenommen. Ändern Sie die Konfigurationsdatei *NIEMALS* per Hand! VMM kann sonst abstürzen oder sogar andere Partitionen überschreiben. Sie können so gut wie alle Parameter ändern, während VMM läuft. Es gibt vier Gruppen von Einstellungen bei VMM: @{" Tasks / Programs " Link "Tasks_Gadget"} @{" Memory settings " Link "Memory_Settings"} @{" Statistics " Link "Stat_Gadget"} @{" Miscellaneous " Link "Misc_Settings"} @EndNode @Node "Tasks_Gadget" "VMM.guide/Tasks_Gadget" @Next "Memory_Settings" @Prev "VMMPREFS" @Toc "Main" 'Tasks/Programs' Hier können Sie die Namen von Programmen angeben und ob diese VM benutzen dürfen oder nicht. Seit Version 1.3 gibt es noch die Möglichkeit, differenziertere Angaben mittels der 'Advanced Options' zu machen, doch dazu unten mehr. Ein neu hinzugefügtes Programm bekommt die aktuelle Stellung des 'Use VM'-Gadgets zugewiesen, z.B. "Use VM", "Don't use VM" oder "Advanced". Dies können Sie später jederzeit ändern. Der Name, den Sie eingeben, kann entweder der Name des Tasks sein, der Datei, die Sie aufrufen (ohne Pfad!) oder ein AmigaDOS-Muster. Der Normalfall (DEFAULT) ist ebenfalls in der Liste vorhanden. Mittels der Gadgets rechts neben der Liste können Sie die Reihenfolge der Einträge ändern. Die Reihenfolge hat keinen Einfluß auf VMM. Die Advanced-Optionen wurden eingeführt, da viele Programme entweder immer Speicher mit dem PUBLIC-Flag oder Speicher ohne das PUBLIC-Flag anfordern, wo es eigentlich notwendig wäre. Damit auch diese Programme mit VMM arbeiten, können Sie VMM eine Minimalgröße angeben, ab der VM verwendet werden soll. Alle Speicheranforderungen, die die angegebene Größe überschreiten, bekommen VM zugeteilt, wenn Sie z.B. '0' angeben, bekommen die Programme bei entsprechenden Flags immer VM zugeteilt. Ein Wert von -1 bedeutet, daß in keinem Falle VM verwendet wird, wenn das entsprechende Flag auftaucht. Das Ganze ist ein wenig schwierig zu erklären, daher noch ein paar Beispiele: Beispiel 1: Ein Programm fordert seinen gesamten Speicher mit PUBLIC-Flag an und benutzt dabei kein VM. Lösung: Setzen Sie "Min. PUBLIC alloc." auf einen Wert von z.B. 200. Den genauen Wert müssen Sie herausfinden. Bei einem Wert von 200 erhalten alle Anforderungen von weniger als 200 Bytes PUBLIC-Memory, alle anderen VM. Ein Wert von 0 bei "Min. non-PUBLIC alloc." sorgt dafür, daß alle Anforderungen OHNE PUBLIC-Flag VM benutzen. Beispiel 2: Ein Programm fordert Speicher für Systemstrukturen ohne PUBLIC-Flag an, was bei früheren Versionen von VMM zum Absturz führte. Lösung: Setzen Sie "Min. non-PUBLIC alloc." auf z.B. 200 und "Min. PUBLIC alloc." auf -1. Dadurch bekommen alle Systemstrukturen, die meistens unter 200 Bytes sind, PUBLIC-Memory. "Use VM" entspricht einer Stellung von -1 bei "Min. PUBLIC" und 0 bei "Min. non-PUBLIC", "Don't use VM" entspricht -1 und -1. @EndNode @Node "Memory_Settings" "VMM.guide/Memory_Settings" @Prev "Tasks_Gadget" @Next "MemType_Gadget" @Toc "Main" Hier können Sie die Art der Auslagerung und die Puffergrößen konfigurieren. @{" 'Memory allocation' " Link "MemType_Gadget"} @{" 'Mem size used for paging'" Link "MemSize_Gadget"} @{" 'Memory Type' " Link "MemFlags_Gadget"} @{" 'Swap medium' " Link "SwapMedium_Gadget"} @{" 'Swap file size' " Link "FileSize_Gadget"} @{" 'Priority of VM' " Link "MemPri_Gadget"} @{" 'Write buffer' " Link "WriteBuffer_Gadget"} @EndNode @Node "MemType_Gadget" "VMM.guide/MemType_Gadget" @Next "MemSize_Gadget" @Prev "Memory_Settings" @Toc "Main" 'Memory allocation' Es gibt zwei Arten der Speicheranforderung für die PageFrames: - Fixed size: VMM versucht, so viel Speicher zu allozieren, wie Sie unter 'Mem used for paging' eingestellt haben. - Dynamic: VMM nimmt die Allozierung und Freigabe von Speicher für die PageFrames während der Laufzeit dynamisch vor. @EndNode @Node "MemSize_Gadget" "VMM.guide/MemSize_Gadget" @Next "MemFlags_Gadget" @Prev "MemType_Gadget" @Toc "Main" 'Mem used for paging' Falls Sie keine dynamische Speicheranforderung benutzen, können Sie hier die Größe des Speichers für die PageFrames einstellen. @EndNode @Node "MemFlags_Gadget" "VMM.guide/MemFlags_Gadget" @Next "SwapMedium_Gadget" @Prev "MemSize_Gadget" @Toc "Main" 'Memory type' Hier stellen Sie ein, welcher Speichertyp für das Paging verwendet werden soll. Sie können zwischen FAST, CHIP und ANY wählen. Normalerweise ist CHIP-Memory nicht anwählbar, Pageframes im CHIP-RAM des 4000ers können auch nicht gecached werden. Auf einem A2000 mit 68040er-Karten kann es möglich sein, daß Pageframes aus dem CHIP-Memory gecached werden können, was durchaus sinnvoll sein kann, um mehr Cache-Speicher zu bekommen. @EndNode @Node "SwapMedium_Gadget" "VMM.guide/SwapMedium_Gadget" @Next "FileSize_Gadget" @Prev "MemFlags_Gadget" @Toc "Main" 'Swap medium' Es gibt drei Mögliche Medienarten, auf die ausgelagert werden kann: - Auf eine Partition: Durch Klick auf 'Select' müssen Sie eine Partition angeben, auf die ausgelagert werden soll. Wenn Sie zum ersten Mal eine Partition auswählen, erfolgt eine Sicherheitsabfrage. Immerhin wird dabei die komplette Partition überschrieben, der Inhalt wird folglich gelöscht. - In eine Datei: Nach Klick auf 'Select' werden Sie nach dem Dateinamen für die Auslagerungsdatei gefragt. - Auf eine Pseudo-Partition: Pseudo-Partitionen sind im Grunde Dateien, die einen einzigen, zusammenhängenden Block auf der Festplatte verwenden. Demzufolge können Sie wie normale Dateien angesprochen werden. VMM richtet diese Dateien selber ein und kann darin mittels Device-Kommandos operieren, wodurch sich die Geschwindigkeit einer eigenen Partition und die Flexibilität einer Datei ergeben. Existiert bereits eine Datei dieses Namens, wird automatisch überprüft, ob sie in EINEM Block existiert, so daß Sie nicht befürchten müssen, Teile Ihrer Partition überschrieben zu bekommen. Pseudo-Partitionen laufen nur auf FFS-formatierten Laufwerken mit einer Blockgröße von 512 Bytes. Da Pseudo-Partitionen in einem einzigen Block existieren müssen und das Hauptverzeichnis auf FFS-Laufwerken genau in der Partitionsmitte liegt, kann eine Pseudo-Partition niemals größer als die Hälfte der Partition werden. Eine letzte Warnung: Dies ist eine sehr GEFÄHRLICHE Option. Falls sich in meinen Routinen noch ein Fehler befindet, können Ihre Partitionen komplett zerstört werden! Bei mir jedenfalls gab es trotz heftiger Tests keine Fehlerscheinungen. Änderungen des Auslagerungsmediums und der Größe werden erst beim nächsten Start von VMM übernommen. @EndNode @Node "FileSize_Gadget" "VMM.guide/FileSize_Gadget" @Prev "SwapMedium_Gadget" @Next "MemPri_Gadget" @Toc "Main" 'Swap file size' Hiermit stellen Sie die Größe der Auslagerungsdatei oder Pseudopartition ein. Dieser Wert und der des Auslagerungsmediums werden erst nach einem Neustart verwendet, sollten Sie ihn geändert haben. @EndNode @Node "MemPri_Gadget" "VMM.guide/MemPri_Gadget" @Next "WriteBuffer_Gadget" @Prev "FileSize_Gadget" @Toc "Main" 'Priority of VM' Hiermit können Sie einstellen, wann VM verwendet wird. Exec durchsucht seine Speicherlisten der Priorität nach, wobei normales FAST Memory eine Priotität von 30 und CHIP Memory eine Priorität von -10 hat. Wenn Sie also in erster Linie VM verwenden möchten, sollten Sie hier einen Wert größer als 30 einstellen, wenn Sie in erster Linie FAST Memory, dann aber VM vor CHIP Memory verwenden möchten, ist ein Wert zwischen -10 und 30 vonnöten. Die dynamische Speicherverwaltung funktioniert am besten, wenn VM die höchste Priorität im System hat, ansonsten wird zuerst der gesamte normale Speicher verbraucht und VMM muß sich mit einem winzigen Puffer begnügen, da einfach sonst kein freier Speicher mehr da ist. @EndNode @Node "WriteBuffer_Gadget" "VMM.guide/WriteBuffer_Gadget" @Next "Stat_Gadget" @Prev "MemPri_Gadget" @Toc "Main" 'Write buffer' Seit Version 2.1 benutzt VMM einen Schreibpuffer, um mehrere Pages auf einmal schreiben zu können. Hierdurch wird die Arbeitsgeschwindigkeit beträchtlich erhöht, da nicht mehr so häufig auf die Festplatte zugegriffen werden muß. Anhand dieses Gadgets stellen Sie die Größe des Schreibpuffers und damit die Anzahl der Pages, die gepuffert werden können, ein. Ein Wert von 0 deaktiviert den Schreibpuffer. Ein Wert von 100-200KB ist in der Praxis meist ausreichend. @EndNode @Node "Stat_Gadget" "VMM.guide/Stat_Gadget" @Prev "MemPri_Gadget" @Next "Misc_Settings" @Toc "Main" 'Statistics' Eine Statistik über die Paging-Vorgänge kann entweder in einem eigenen kleinen Fenster oder nur in einer Titelzeile dargestellt werden. Wenn Sie die Titelzeile benutzen, werden nur der verfügbare virtuelle und freie normale Speicher angezeigt. Zwischen den beiden Anzeigemodi können Sie einfach mit dem Zoom-Gadget umschalten. Hier können Sie die Position des Fensters und der Titelzeilenversion und den Anfangsmodus einstellen. @EndNode @Node "Misc_Settings" "VMM.guide/Misc_Settings" @Prev "Stat_Gadget" @Next "VMM_LIBRARY" @Toc "Main" Hotkeys Über zwei zusätzliche HotKeys können Sie die Verwendung von VM während der Laufzeit an- und abschalten. Die HotKey-Beschreibungen müssen wie bei Commoditites üblich eingegeben werden. Der HotKey für POP_UP wird in den ToolTypes angegeben. 'Minimum VM allocation' Um die AllocMem-Routine zu beschleunigen, die vom System doch recht häufig verwendet wird, wird für Speicheranforderungen, die kleiner als der hier angegebene Wert sind, kein VM verwendet. Bei einem Wert von 0 müßte VMM bei jedem AllocMem in der internen Hash-Tabelle nachsehen. Ein Wert von 100-200 ist empfehlenswert. 'Don't cache Zorro II RAM' Auf einigen Amigas mit 68040 müssen Sie das Caching von RAM innerhalb des Zorro-II-Adreßraums ($0 bis $00ffffff) unterbinden. 'Show VM in WB title' Nachdem von vielerlei Seiten vorgeschlagen wurde, die Größe des freien virtuellen Speichers in der Workbench-Titelzeile anzuzeigen, wurde diese Funktion jetzt eingebaut. Da hierfür jedoch die Funktion SetWindowTitles() gepatched und der Inhalt der Fenstertitel auf "Amiga Workbench" oder "AmigaOS 3.1" untersucht wird, habe ich diese Funktion abschaltbar gemacht. @EndNode @Node "PROC_DIFFS" "VMM.guide/PROC_DIFFS" @Next "PROBLEMS" @Prev "VMMPREFS" @Toc "Main" 5. UNTERSCHIEDE 68030/68040 Die Versionen für 68030 und 68040 unterscheiden sich geringfügig. Zunächst wird auf dem 68030 so gut wie immer eine eigene MMU-Tabelle installiert, da die meisten Rechner mit 68030 die MMU nicht verwenden oder auf eine andere PageSize gestellt haben. Daher läuft VMM nicht zusammen mit Enforcer, welches eine PageSize von 256 Bytes verwendet, nicht auf einem 68030. Seit Version 2.1 wird auf 3000ern mit BootRoms (SoftKick-3000er) das Kickfile nach jedem Reset neu geladen. Dies ist zwar nirgends vorgeschrieben, jedoch wird es von Mike Sinz wärmstens empfohlen. @EndNode @Node "PROBLEMS" "VMM.guide/PROBLEMS" @Next "FEHLERBESEITIGUNG" @Prev "PROC_DIFFS" @Toc "Main" 6. PROBLEME Commodore hat vor langer Zeit für die AllocMem-Funktion das Flag MEMF_PUBLIC eingeführt, als noch nicht abzusehen war, welche Möglichkeiten dies in Zukunft bieten würde. Das Resultat war, daß die Leute entweder beim Anfordern des Speichers MEMF_PUBLIC setzten, einfach ignorierten oder überhaupt nicht setzten. Ersteres stört VMM überhaupt nicht, das betreffende Programm kann einfach kein VM benutzen. Der zweite Fall ist schon schwerwiegender: Ein Haufen Programme lädt Messages oder IORequests auf dem Stack ab, was bei Verwendung von VM natürlich einen Fehler hervorruft. Solchen Programmen kann über die Einstellungen VM gesperrt werden, ansonsten können die muntersten Abstürze entstehen. Wenn Sie Programme schreiben möchten, die auch mit VM funktionieren, sollten Sie die Datei "VMProgGuideline" beachten. Einige Cache-Programme wie FastCache oder PowerCache sollten nach Möglichkeit kein VM benutzen, abgesehen davon, daß es sowieso wenig Sinn macht, einem Caching-Programm VM zuzuteilen. Selbiges gilt für alle Programme, die den BeginIO-Vektor des Auslagerungsmediums patchen. Bei Cache-Programmen müssen u.U. auch die FileSystem-Tasks daran gehindert werden, VM zu benutzen. Programme, die den AccessFaultTrapVector benutzen, wie Enforcer, müssen VOR VMM gestartet werden. Enforcer gibt sonst bei jedem PageFault eine Invalid Memory Reference aus. @EndNode @Node "FEHLERBESEITIGUNG" "VMM.guide/FEHLERBESEITIGUNG" @Next "TECHNICAL_DES" @Prev "PROBLEMS" @Toc "Main" 7. FEHLERBESEITIGUNG Problem: Programm "X" benutzt keinen virtuellen Speicher. Lösung : Es könnte sein, daß "X" beim Anfordern von Speicher immer das MEMF_PUBLIC-Flag setzt. Benutzen Sie für dieses Programm die "Advanced Options". Problem: VMM stürzt bei mir immer ab. Wie kann ich herausfinden, an welchem Programm das liegen tut? Lösung: Setzen Sie die Default-Einstellung auf "Don't use VM" und stellen Sie eine sehr kleine Speichermenge ein, damit möglichst viele Pagefehler auftreten. Anschließend aktivieren Sie der Reihe nach den virtuellen Speicher für jedes laufende Programm. So können Sie recht einfach sehen, wann der Rechner abstürzt. Sperren Sie dann den virtuellen Speicher für diese(s) Programm(e). Problem: Manchmal hängt sich VMM auf, wenn ich versuche, auf dieselbe Partition zuzugreifen, auf der sich auch die Auslagerungsdatei befindet. Lösung: Vermutlich verwendet Ihre Festplatte DMA-Transfers mit einer falschen Maske. Sie müssen die Maske aller Partitionen auf dieser Festplatte ändern, z.B. mit HDToolBox. Wenn Sie nicht genau wissen, was Sie ändern müssen, stellen Sie die Maske einfach auf 0xfffffe, wodurch der DMA-Speicherbereich auf die unteren 16MB beschränkt werden. Dieser Fehler sollte ab Version 2.0 nicht mehr auftreten, tritt er dennoch auf, bitte ich um Rückmeldung! Problem: Mein Festplatten-Cache funktioniert nicht, auch wenn ich den virtuellen Speicher hierfür gesperrt habe. Lösung: Einige Programme patchen Codeteile, die dann von anderen Programmen ausgeführt werden. DynamiCache z.B. patcht BeginIO von allen Devices, die es cached, damit der Cache-Speicher von den einzelnen Treibern alloziert wird und nicht von DynamiCache. Dies kann zu Problemen führen, schalten Sie in diesem Fall den virtuellen Speicher für die einzelnen Treiber ("DH0", "DH1", ...) aus. Weitere Probleme mit Cache-Programmen finden Sie bei den @{"Bekannten Fehlern" Link "BEKANNTE FEHLER"}. @EndNode @Node "TECHNICAL_DES" "VMM.guide/TECHNICAL_DES" @Next "VMM_LIBRARY" @Prev "FEHLERBESEITIGUNG" @Toc "Main" 8. Technische Beschreibung VMM besteht aus drei Tasks, mit dem Statistik-Task sind es vier. Der erste ist der VM_Manager, welcher die Programme, die VMM benutzen, und diejenigen, die das nicht tun, aussortiert, alles initialisiert usw. Der PageHandler kommt zum Zuge, wenn ein Pagefault auftritt. Der PrePager sorgt dafür, daß bestimmte Pages im Speicher bleiben, während auf Festplatten zugegriffen wird. Das meiste davon ist für den Betrieb nicht unbedingt notwendig, jedoch sorgt es dafür, daß VMM unter nahezu allen Bedingungen stabil läuft. Leider hat Commodore bei dem MEMF_PUBLIC-Flag ein wenig geschlurt, so daß einige Systemfunktionen gepatcht werden mußten. Ich habe versucht, VMM so Systemkonform wie möglich zu programmieren, jedoch mußte ich an einige Stellen auch mit nicht dokumentierten Funktionen arbeiten. Besonders kraß ist das bei der Switch-Funktion, die dafür sorgt, daß ein Task von 'running' in 'ready' oder 'wait' umgeschaltet wird. Das bedeutet, daß VMM unter zukünftigen Betriebssystemversionen nicht mehr funktionieren kann. Commodore hat sich ebenfalls nicht über die Verwendung von non-PUBLIC-Speicher innerhalb von Forbid/Permit oder Disable/Enable geäußert. Ein Pagefault hier wäre gefährlich, da beim Pagen das Multitasking benötigt wird. Speicher, der innerhalb von Forbid/Disable freigegeben werden soll, wird erst hinterher freigegeben. Im Moment darf die Anzahl der Pagefaults ohne Multitasking sowie die Anzahl der Programme, die VM für ihren Stack verwenden, 20 nicht übersteigen. Der VM_Manager Der VM_Manager startet alle anderen Tasks und initialisiert das ganze System. Auch werden die Benutzereingaben hier bearbeitet. Jedesmal, wenn AllocMem aufgerufen wird, muß VMM entscheiden, ob das Programm VM verwenden darf oder nicht. Wenn ein Programm zum ersten Mal Speicher anfordert, wird über die Benutzung entschieden. Spätere Anforderungen vom gleichen Task werden dann in einer Tabelle gespeichert. Der PageHandler Das Paging wird ansynchron vom PageHandler kontrolliert. Tritt ein Pagefault auf, werden die entsprechenden Werte von einer speziellen Abfangroutine in eine Trap-Struktur eingetragen und an den PageHandler geschickt. Der PageHandler schreibt anschließend nach Möglichkeit bereits eine geänderte Page zurück, ein Second-Chance-Algorithmus wird hierfür verwendet. Anschließend wird die benötigte Page eingelesen und das betreffende Programm kann weiterarbeiten. Während auf die Festplatte zugegriffen wird, dürfen andere Programme auch wieder laufen, die ebenfalls PageFaults erzeugen könnten. Diese werden dann sofort abgearbeitet. Manchmal hat es den Anschein, als würde VMM unverhältnismässig oft auf die Festplatte zugreifen. Um die Zeit für die Bearbeitung eines PageFaults zu reduzieren, werden geänderte Pages nach Möglichkeit sofort ausgelagert, wodurch sich die Bearbeitungszeit verkürzt. Manchmal kann es durchaus sein, daß Pages ausgelagert wurden, die später nochmals geändert werden müssen. Obwohl VMM scheinbar öfter auf die Festplatte zugreift als andere VM-Programme, ist es größtenteils erheblich schneller. Der Prepager Bei der Entwicklung von VMM kam es des öfteren vor, daß auf dasselbe Gerät, auf dem ausgelagert wurde, von anderen Programmen aus zugegriffen werden sollte. Da der Treiber selber niemals wegen eines Pagefaults angehalten werden darf, muß eben dieses verhindert werden. Alle Zugriffe auf dieses Gerät werden auf die Benutzung von VM hin untersucht. Wird dabei VM verwendet, werden die dazugehörigen Pages in einen Zwischenspeicher geladen, die Zugriffe erledigt und die Pages wieder zurückkopiert. Der Hintergrundtask 'Statistics' Dieser Task wird nur gestartet, wenn die Statistikfunktion eingeschaltet ist. Jede Sekunde wird die momentane Auslastung des virtuellen Speichers und die Anzahl der Pagefaults ausgegeben. Gepatchte Systemfunktionen Folgende Funktionen der exec.library werden gepatcht: Switch, AddTask, Wait, AllocMem, FreeMem, AvailMem, CachePreDMA und CachePostDMA. Auf Rechnern mit 68030er wird außerdem ColdReboot gepatcht, damit die ursprüngliche MMU-Tabelle vor einem Reset wieder hergestellt werden kann. Zusätzlich wird noch die BeginIO-Funktion des Treiber desjenigen Gerätes gepatcht, auf dem die Auslagerungsdatei angelegt wird. Switch, Wait und AddTask mußte gepatcht werden, da sich der Stack eines Programmes im virtuellen Speicher befinden könnte. Um Pagefehler im SuperVisor-Modus zu umgehen, wird der Stack von einem Zwischenspeicher ersetzt, der groß genug ist, alle Registerinhalte während des Context Switches zu sichern. Wenn der Task wieder aufgerufen wird, wird wieder der Original-Stack verwendet. @EndNode @Node "VMM_LIBRARY" "VMM.guide/VMM_LIBRARY" @Next "EXT_STATS" @Prev "TECHNICAL_DES" @Toc "Main" 9. VMM.LIBRARY Wie von vielen Seiten gewünscht, liegt jetzt eine Library bei. Sie enthält Funktionen wie AllocVMem, FreeVMem, AvailVMem, AllocVVec und FreeVVec. Wenn die Library das erste mal benutzt wird, wird der VMM-Pagehandler automatisch gestartet. Nur Programme, die die Funktionen der vmm.library benutzen, haben dann virtuellen Speicher. Sie können natürlich auch das 'normale' VMM gleichzeitig mit der vmm.library benutzen. Wenn die Library wieder geschlossen wird, wird der VMM-Pagehandler nicht entfernt. Eine Dokumentation zur vmm.library liegt im AutoDoc-Format bei. @EndNode @Node "EXT_STATS" "VMM.guide/EXT_STATS" @Next "BEKANNTE FEHLER" @Prev "VMM_LIBRARY" @Toc "Main" 10. EXTERNE STATISTIK-PROGRAMME Seit Version 2.1 können Sie Ihre eigenen Statistik-Programme für VMM schreiben. Sie können z.B. eine grafische Ausgabe oder zusätzliche Informationen, wie z.B. die durchschnittlichen Page-'fehlgriffe', hinzufügen. Anbei ist eine Include-Datei mit der Beschreibung der Message-Struktur und weiteren Informationen. Wenn Ihr Programm gelungen ist, können Sie es mir ja schicken und vielleicht liegt es bei zukünftigen Versionen bei... @EndNode @Node "BEKANNTE FEHLER" "VMM.guide/BEKANNTE FEHLER" @Next "FEHLERMELDUNGEN" @Prev "EXT_STATS" @Toc "Main" 11. BEKANNTE FEHLER Soweit ich weiß, gibt es keine schwerwiegenden Fehler mehr in VMM. Einen kleinen Fehler gibt es noch, der noch behoben werden muß: Wenn ein Task mittels RemTask von einem anderen Task entfernt wird und für den Stack virtueller Speicher benutzt wird, wird die TrapStruct nicht wieder freigegeben. Commodore selbst empfiehlt, RemTask nicht auf fremde Tasks anzuwenden und in der Praxis kommt dies auch recht selten vor. Die einzige Möglichkeit im Moment ist, für das Programm, das diesen Stack anfordert, keinen virtuellen Speicher zu verwenden. Es kann passieren, daß VMM nicht starten kann, da zu wenig freier Speicher vorhanden ist. In diesem Fall sollte ein Fenster mit einer Fehlermeldung erscheinen. Ist auch dafür zu wenig Speicher da, kommt keine Fehlermeldung. Das liegt an einem Bug in EasyRequestArgs, da es keine Möglichkeit gibt, herauszufinden, ob der Requester geöffnet werden konnte oder nicht. In zukünftigen Betriebssystemversionen (so es denn noch welche gibt) sollte in diesem Fall ein Alert erscheinen. In Verbindung mit dem console.device kann es zu einigen Merkwürdigkeiten kommen. Wenn Sie ein neues CLI-Fenster öffnen, kann der Cursor inaktiv bleiben, obwohl das Fenster aktiviert ist. Aktivieren Sie in diesem Fall ein anderes Fenster und anschließend wieder das CLI. Das Problem tritt nur auf, wenn der 'CON'-Task seinen Stack im virtuellen Speicher anfordert. Wenn Sie den virtuellen Speicher für 'CON' sperren, gibt es auch keine Probleme mehr. In Verbindung mit dem CopyBack-Modus von PowerCache ist ein weiterer Fehler bekannt. Dies ist ein Fehler von PowerCache, nicht von VMM, wobei der Inhalt der Dateien zerschossen wird. Für die aktuelle Version von PowerCache (37.115) gibt es zwei Möglichkeiten: Entweder Sie schalten den CopyBack-Modus ab oder Sie ändern die Maske für alle Partitionen, auf die Sie PowerCache anwenden, in 0xfffffff ab (mit der HDToolBox), so wird der Speicherzugriff nur auf die unteren 256MB Speicher ermöglicht. Wenn Sie das Statistik-Fenster öffnen wollen, während VMM bereits läuft, indem Sie das Fenster per HotKey öffnen, kann es passieren, daß Sie eine Fehlermeldung "Not enough memory" bekommen, obwohl das Statistik-Fenster geöffnet wird. Dies ist ein unbedeutender Fehler, der in dieser Version noch nicht beseitigt wurde, da dafür sonst größere Teile des Codes hätten geändert werden müssen. Mir wurden einige Probleme in Verbindung mit GVP-Karten berichtet. Obwohl ich in dieser Hinsicht heftigst nach Fehlern gesucht habe, konnte ich die Probleme noch nicht gänzlich beseitigen. Das einzige, was ich dazu sagen kann, ist, daß VMM stabiler auf GVP-Karten läuft, wenn der DataCache abgeschaltet ist. @EndNode @Node "FEHLERMELDUNGEN" "VMM.guide/FEHLERMELDUNGEN" @Next "ZUKUNFTSPLÄNE" @Prev "BEKANNTE FEHLER" @Toc "Main" 12. FEHLERMELDUNGEN Wenn Sie einen Fehler im Programm oder eine Verbesserungsmöglichkeit gefunden haben, füllen Sie bitte das Fehlermeldungs-Formular aus, welches beiligt. Sehr oft kann ich Fragen von Anwendern nicht beantworten, weil ich nicht weiß, welche Programmversion sie benutzen, welche Hardware sie besitzen und so weiter. Deswegen habe ich dieses Formular erstellt. Meine Adresse finden Sie unter @{"Adresse" Link "ADRESSE"}. @EndNode @Node "ZUKUNFTSPLÄNE" "VMM.guide/ZUKUNFTSPLÄNE" @Next "DANKSAGUNGEN" @Prev "FEHLERMELDUNGEN" @Toc "Main" 13. ZUKUNFTSPLÄNE Zu den Features, die ich in eine der nächsten Versionen einzubauen gedenke, gehören u.a.: - Eine Möglichkeit, virtuellen Speicher für Code-Segmente bzw. SegLists zu verwenden. Ich habe schon ein paar Versuche in dieser Richtung gemacht und es scheint vielversprechend zu sein. Sobald es einen Stand erreicht, in dem es veröffentlicht werden kann, werde ich es tun. - Verbesserungen des dynamischen Speichermodells speziell für Bedigungen extremer Speicherknappheit. Eine Auflistung aller Programme, die mit VMM funktionieren und derer, die es nicht tun, liegt bei. Sie basiert auf den Berichten von zahlreichen Benutzern. Bitte halten Sie mich auf dem Laufenden und berichten mir von allen Programmen, die funktionieren oder es nicht tun! @EndNode @Node "DANKSAGUNGEN" "VMM.guide/DANKSAGUNGEN" @Next "MISCELLANEOUS" @Prev "ZUKUNFTSPLÄNE" @Toc "Main" 14. DANKSAGUNGEN Mein besonderer Dank gilt folgenden Personen für ihre Ideen, Verbesserungsvorschläge und Beta-Testen (alphabetisch): Michael Berg Torsten Ebeling Frank Grimm Robert Kiehne Jeff Koons Manfred Matzinger Barry McConnell Volker Rudolph Torsten Stolpmann Erno Tuomainen Juergen Zimmermann Ebenfalls möchte ich mich bei allen bedanken, die mir Danksagungen und Fehlermeldungen geschickt haben. Ohne sie würde VMM nicht so aussehen, wie es das heute tun tut. @EndNode @Node "ADRESSE" "VMM.guide/ADRESSE" @Prev "DANKSAGUNGEN" @Toc "Main" 15. ADRESSE Ich würde mich sehr freuen, von Ihnen zu hören, ob VMM auf Ihrem Rechner läuft und welche Programme Ihnen mit VMM Sorgen bereiten. Wenn Sie einen Fehler melden, benutzen Sie bitte das Fehlermeldungs-Formular, welches Sie in Ihrer VMM-Schublade finden sollten. Da die meisten Fehler stark von der verwendeten Hardware abhängen, hilft mir das Ausfüllen dieses Formulars außerordentlich. email: apel@gypsy.physik.uni-kl.de snail-mail: Martin Apel Gerhart-Hauptmann-Str.5 67663 Kaiserslautern Deutschland fon: 0631 / 24257 @EndNode