PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Speicherresistente Programme



DarkEagle
05.05.2009, 20:48
Hallo
weiß einer von euch, was es mit speicherresistenz auf sich hat, also was genau das ist und wie man soetwas implementiert?
Ich konnte bis jetzt nur herausfinden, dass ein Speicherrestistentes Programm nach dem Aufruf immer noch im Speicher weiterarbeitet, dabei verstehe ich aber nicht so ganz, wie das funktioniert.
Wär toll, wenn mir das mal jemand erklären könnte.
Danke

DarkEagle

Smartie
06.05.2009, 00:06
Das ist ein veraltetes Konzept aus der MSDOS-Zeit. Dafür müsstest du wohl "veraltete Bücher" aus der nächsten Hinterwälderstadtbibliothek suchen und nach "C programmieren mit DOS" schauen oder so.

CryptoCrack
06.05.2009, 10:12
Wie das genau ablaeuft, haengt vom jeweiligen OS ab. Unter MS-DOS ist/war es so, dass du das Programm nicht (wie bei "normalen" Programmen) ueber Interrupt 20h, sondern 27h (DOS Terminate and Stay Resident) beendet hast, was genau das bewirkt hat, dass Teile im Arbeitsspeicher erhalten bleiben. Dann konntest du z.B. noch Interruptvektoren verbiegen, sodass bei bestimmten Interrupts (in bestimmten zeitlichen Abstaenden, beim Schreiben von Dateien, $whatever, ...) Routinen deines residenten Programms aufgerufen wurden, bevor's dann in die richtigen Systemroutinen ging.

Wenn's dich genauer interessiert, schau dir mal [1] und [2] an oder such' einfach nach TSR. Wie Deknos bereits gesagt hat, brauchst du das heute aber nicht mehr, weil du im Protected Mode eh mehrere Prozesse gleichzeitig starten kannst und Hooks etc. hast.

[1] Memory Resident Programming (http://www.husseinsspace.com/teaching/udw/1996/asmnotes/chapsev.htm)
[2] Wikipedia - Terminate and Stay Resident (http://en.wikipedia.org/wiki/Terminate_and_Stay_Resident)

DarkEagle
08.05.2009, 19:38
danke erst mal
Aber gibts sowas auch für die WinAPI, oder wie sind da jetzt die möglichkeiten?

CryptoCrack
08.05.2009, 19:42
Die Frage ist erstmal, was du machen willst. Das Problem mit Speicherresidenz hast du ja gar nicht mehr, weil du im Protected Mode problemlos mehrere Prozesse parallel laufen lassen kannst.

DarkEagle
09.05.2009, 08:10
ich wollte eigentlich mal versuchen, einen Auto Protect Virenscanner zu programmieren, der bei jedem öffnen einer Datei diese vorher auf Viren prüft.
laufen diese Prozesse im Protected Mode auch immer noch, wenn das eigentliche Programm beendet wurde?

CryptoCrack
09.05.2009, 10:00
Wieso willst du das Teil beenden? Du kannst den Virenscanner im Hintergrund als ganz normalen Prozess bzw. Daemon/Service weiterlaufen lassen.

Schwieriger ist die Sache, alle Lese- und Schreibzugriffe abzufangen. Dafuer muesstest du entweder systemweite Hooks auf die entsprechenden API-Funktionen einrichten oder gleich noch tiefer ansetzen und saemtliche Zugriffe auf Ring 0-Ebene (d.h. durch angepasste Treiber o.ae.) abfangen.

DarkEagle
10.05.2009, 09:14
ich will es deshalb beenden, damit keine Ressourcen belegt werden und es nur aktiv wird, wenn der Benutzer Dateien öffnet.
Also ist Speicherresistentes Programmieren heute nicht mehr möglich, ohne die DOS Interrupts nutzen zu müssen?

CryptoCrack
10.05.2009, 10:11
ich will es deshalb beenden, damit keine Ressourcen belegt werden und es nur aktiv wird, wenn der Benutzer Dateien öffnet
Auch ein speicherresidentes Programm belegt Ressourcen, solange es im Speicher ist, sonst wuerde es nicht speicherresident heissen :)


Also ist Speicherresistentes Programmieren heute nicht mehr möglich, ohne die DOS Interrupts nutzen zu müssen?
Du solltest dich vielleicht erstmal mit dem Protected Mode auseinandersetzen (wirst du, wenn du so etwas machen willst, frueher oder spaeter eh muessen), dann verstehst du das Ganze eventuell besser. Da ist jeder Prozess naemlich fuer sich abgekapselt in einem eigenen virtuellen Speicherbereich - du musst bei der ganzen Sache daher wie gesagt irgendwo im Ring 0/Kernelmode ansetzen.

DarkEagle
10.05.2009, 16:28
ok, dann werd ich mir mal das Thema Protected Mode anschauen,
Danke für deine Hilfe

DarkEagle

elrik
13.10.2009, 13:42
Also ist Speicherresistentes Programmieren heute nicht mehr möglich, ohne die DOS Interrupts nutzen zu müssen?


Doch, doch! Mit Virtuellem Speicher, Protected mode etc. haben Speicherresistente Programme nichts gemein. Einem Speicher-res. "Programm" ist es erstmal egal in was für einem Speicher es abgelegt ist.

Gutes Beispiel für Speicherresistent Programme sind Kernel Module und ein schlechteres Beispiel sind Windows-Services. Die sind alle Speicherresistent, d.h. werden irgendwo hinkopiert und bleiben bestehen nachdem der Einstiegspunkt des Programms die Ausführung wieder an den caller übergibt ;)

DarkEagle
17.10.2009, 12:42
und wie kann man soetwas dann mit C/C++ implementieren, oder geht das nur mit Assembler?

Shakademus
18.10.2009, 09:59
Siehe z. B.: http://msdn.microsoft.com/en-us/library/ms810429.aspx

RFC822
18.10.2009, 12:41
Die sind alle Speicherresistent, d.h. werden irgendwo hinkopiert und bleiben bestehen nachdem der Einstiegspunkt des Programms die Ausführung wieder an den caller übergibt ;)

Ich würde sagen, dass die Bezeichung "speicherresistent" in Multitasking-Umgebungen keinen Sinn macht ... denn selbst wenn der Einstiegspunkt die Ausführung niemals zurückgibt, bleibt der Prozess im Speicher und wird parallel mit anderen ausgeführt.