Speicherresidenz
Speicherresidenz bezeichnet allgemein jene Daten einer Software, die im primären Arbeitsspeicher – physisch RAM – eines Computers verbleiben.
Bei Betriebssystemen mit virtueller Speicherverwaltung wird der gesamte verfügbare Arbeitsspeicher in Speicherseiten unterteilt. Der Arbeitsspeicher wiederum besteht aus dem realen, physisch verfügbaren RAM, sowie aus Sekundärspeicher. Während Paging den Transfer zwischen primärem und sekundärem Arbeitsspeicher beschreibt, wird das Auslagern von Speicherseiten in den Sekundärspeicher als Swapping bezeichnet.
Daten, die sich im residenten Speicher befinden, bezeichnen jenen Teil einer Software, der sich im primären Arbeitsspeicher, also im RAM, befindet, und somit nicht ausgelagert sind. Das können Teile eines Computerprogramms genauso sein wie Teile eines Betriebssystems, z. B. Datenstrukturen des Kernels oder Gerätetreiber.
Unterschieden wird auch zwischen den residenten Teilen einer Software, die sich prinzipiell gerade (zufällig) im RAM befinden, und Software, die sich immer dort befinden muss, denn Daten im RAM können für das Auslagern gesperrt werden. Jene non-swappable (nicht auslagerbare) Teile des primären Arbeitsspeichers werden z. B. von Linux als englisch locked memory bezeichnet, die jeweiligen Speicherseiten als locked pages.[1]
Entwicklung
Betriebssysteme ohne virtuellen Speicher haben prinzipiell nur residenten Speicher. Virtueller Speicher selbst bedingt, um effizient zu sein, eine Memory Management Unit (MMU). Betriebssysteme, die auf Hardware ohne MMU laufen, sind daher meist auf den tatsächlich physisch vorhandenen Arbeitsspeicher beschränkt und können keinen zusätzlichen Speicher, in Form von virtuellem Speicher und Paging, zur Verfügung stellen. Ist der Speicher aufgebraucht, gibt das System eine englisch Out-of-memory-Fehlermeldung aus, die aussagt, dass dem Computersystem der Arbeitsspeicher ausgegangen ist. Ein Beispiel für ein solches System sind die Betriebssysteme DOS und CP/M, oder das klassische Mac OS bis Version 6 auf der Macintosh-Plattform von Apple.
Aber auch Kernelemente von Betriebssystemen mit virtueller Speicherverwaltung sind stets resident im RAM. Beispielsweise war der Kernel von Unix noch Mitte der 1980er Jahre (4.3BSD) stets zur Gänze im primären Arbeitsspeicher. Erst mit der Weiterentwicklung eines modernen Unix-Kernels Ende der 1980er, Anfang der 1990er Jahre, genannt Mach, waren auch Teile des Kernels auslagerbar.[2]
In einem Betriebssystem müssen die Entwickler sehr genau abwägen, welche Software resident im RAM vorgehalten werden soll und welche ausgelagert werden kann. Da es mehr Zeit kostet, ausgelagerte Software bei Bedarf wieder in den RAM zu laden, würde ein Anwender eine Verzögerung wahrnehmen, was bei bestimmten Betriebssystemfunktionen nicht erwünscht ist. Besonders bei einer Grafischen Benutzeroberfläche soll sich die Bedienung unmittelbar und verzögerungsfrei anfühlen, sodass deren Grundfunktionen stets resident im RAM vorgehalten werden sollten. Die Speicherverwaltung muss diesbezüglich jedoch eine Abwägung (trade-off) ermöglichen wenn der RAM knapp wird, damit auch Anwendungsprogramme noch geladen und benutzt werden können.
Beispiele
Hintergrunddienste
Prozesse, die aktiv bleiben, sind Hintergrundprozesse. Bei Programmen, die als Hintergrundprozesse konzipiert sind, spricht man auch von Diensten oder, hauptsächlich bei Unix-artigen Systemen, von Daemons. Unter dem am weitesten verbreiteten PC-Betriebssystem Windows ist der grundlegende Hintergrunddienst der Windows-Systemdienst.
Teile von Hintergunddiensten müssen meist ebenfalls resident im RAM verbleiben, da sie immer wieder aufgerufen werden.
Multitasking
Bei vielen Multitasking-Betriebssystemen werden bereits nach dem Systemstart einige Programme automatisch und gleichzeitig ausgeführt, die sich z. B. über einen Taskmanager anzeigen lassen. Hierzu zählen etwa Drucker- oder Scannertreiber, aber auch Software für die Benutzung der Braillzeile oder diverse kleine Hilfsprogramme. Derlei Programme halten in den meisten Fällen Funktionen bereit, die zu einem unbestimmten Zeitpunkt auf Wunsch benötigt werden. Speicherresident sind diese jedoch meist nur in dem Sinn, als dass sie im virtuellen Speicher geladen sind. Ob Teile dabei auch resident im RAM gehalten werden, hängt einerseits vom Programm selbst ab, andererseits von der virtuellen Speicherverwaltung.
Ein Benutzer kümmert sich in den meisten Fällen jedoch nicht um solche Programme, da sie entweder Teil des Betriebssystems, von Treibersoftware oder anderen Dienstprogrammen sind und vom Installationsprogramm dieser Software automatisch eingerichtet werden. Manche solcher Programme sind z. B. über das Benachrichtigungsfeld der Taskleiste abrufbar.
TSR-Programme
Im Kontext eines Betriebssystems ohne virtuellen Speicher und prinzipiell ohne Multitasking sind alle Programme resident im Speicher, solange sie laufen. Bei DOS auf IBM-PC-kompatiblen Computern kommt zusätzlich erschwerend hinzu, dass im 16-Bit-Betriebsmodus Real Mode des x86-Prozessors systembedingt zwischen unterschiedlichen Speicherarten unterschieden werden muss. Aufgrund der Kompatibilität zum originalen IBM PC und dessen 86-DOS (woraus PC DOS und MS-DOS hervorgingen) war nur der konventionelle Speicher von Programmen direkt nutzbar – war er verbraucht, kam es zu einem Out-of-Memory-Fehler („kein freier Arbeitsspeicher mehr“), und zwar auch dann, wenn noch genügend erweiterter Speicher (UMB, HMA, EMS) zur Verfügung stand. Erst mit XMS war es unter DOS möglich, mehr als die ersten 640 kB RAM auch für Programme zu nutzen.
Da ohnehin nur ein einziges (größeres) Programm zu einem bestimmten Zeitpunkt in den konventionellen Speicher passte, war das Fehlen von Multitasking kein wirklicher Nachteil. Der Speicher wurde nach dessen Beendigung wieder freigegeben, um wieder Platz für das nächste Programm zu haben.
In diesem Zusammenhang bedeutet Speicherresidenz, dass ein Programm im Speicher verbleibt, obwohl es beendet wurde. Daher auch die Abkürzung „TSR“, von englisch Terminate and Stay Resident, was diesen Umstand genau so beschreibt.
Die meisten TSR-Programme haben aber auch einen nicht-residenten Teil. Dieser wird, wie jedes andere exklusive DOS-Programm auch, nur beim direkten Aufruf des Programms ausgeführt und der Arbeitsspeicher nach dessen Beendigung wieder freigegeben. Um den in den Speicher geladenen TSR-Teil des Programms wieder zu aktivieren ohne das Programm exklusiv aufrufen zu müssen, nutzt DOS Interrupts. Das TSR-Programm muss sich dazu mit einem bestimmten Interrupt verbinden, sodass ein Anwendungsprogramm, das die über den Interrupt bereitgestellte Funktion benötigt, diesen auslösen kann. Zusätzlich können sich TSR-Programme aber auch über bereits vorhandene Interrupts legen, sodass sie bei der jeweiligen Funktion immer mit ausgeführt werden. Dies erzeugt einen Eindruck von Gleichzeitigkeit, obwohl stets nur ein Programm aktiv ist.
Auch Teile von DOS selbst arbeiten nach demselben Prinzip, etwa die Systemuhr, der Bildschirm- und der Tastaturtreiber.
Viren
Vorgehensweise von Viren
In den meisten Fällen geschieht die Infektion unbemerkt. Ist der Virus einmal im Speicher, benötigt er das Infektionsprogramm nicht mehr, es genügt ihm ein einziger Aufruf. Die weitere Verbreitung geschieht durch den Virus selbst.
Auslöser einer Infektion ist das Starten einer infizierten Datei, die mittels Datenträger oder Netz auf den Rechner gelangt ist. Der Virus kopiert sich selbst meist zuerst an möglichst viele Stellen auf allen Laufwerken des Rechners oder Netzwerkes. Dabei wird kein Schadcode ausgeführt, dieses Vermehren soll möglichst unbemerkt geschehen. Die infizierten Wirtsprogramme laufen weitgehend unverändert weiter, wenn der Virus korrekt programmiert ist. Durch diese Verbreitung versucht der Virus, die Wahrscheinlichkeit möglichst groß zu halten, dass er beim nächsten Start des Rechners wieder aktiv ist.
Stealthviren sind eine Weiterentwicklung der speicherresidenten Viren, sie versuchen, ihre Identität aktiv zu verstecken.
Orte der Infektionen
CPUs segmentieren den Hauptspeicher hierarchisch in Ringen. Die Stärke der Residenz eines Virus hängt davon ab, in welchem Ring er sich befindet. Je höher die Hierarchiestufe seines Speicherbereiches, umso schwieriger wird es, den Virus zu entfernen.
Auch wurden bereits Viren-Angriffe auf die Cache-Speicher von Chipsätzen getätigt. Dort ist es extrem schwierig, den Virus zu entfernen, da Betriebssysteme dem Anwender i.a. keinerlei Verfügungsgewalt über den Cache eines Chipsatzes bieten.
Schutz vor speicherresidenten Viren
Speicherresidente Viren können sich nur verbreiten, wenn man infizierte Dateien benutzt. Hat bereits eine Infektion stattgefunden, kann mit der Entfernung ein beträchtlicher Datenverlust einhergehen. Moderne und aktuelle Antivirensoftware schützt weitgehend automatisch vor bösartigen speicherresidenten Programmen.
Einzelnachweise
- John Fusco: The Linux Programmer's Toolbox. Pearson Education, 2007, ISBN 978-0-13-270304-8, 6.5.3 Resident and Locked Memory (englisch, eingeschränkte Vorschau in der Google-Buchsuche): “A subset of the resident memory is locked memory, which refers to any virtual memory that has been explicitly locked into RAM by the process. A locked page cannot be swapped and is always resident in RAM.”
- Peter A. Gloor: Synchronisation in verteilten Systemen: Problemstellung und Lösungsansätze unter Verwendung von objektorientierten Konzepten. B. G. Teubner, 1989, ISBN 978-3-519-02494-1, 1.2.3 Mach, S. 15 (eingeschränkte Vorschau in der Google-Buchsuche): „Ein konventioneller UNIX-Kernel ist ein grosses Binärfile, das sich resident im Hauptspeicher befindet. Im Gegensatz dazu lassen sich einzelne Teile des Mach-Kernels genauso auf Sekundärspeicher zwischenlagern (paging) wie gewöhnliche Anwendungsprogramme.“