Sagen Sie, ich sende einen Zeiger als Argument an ein anderes Programm:
%Vor%und versuchen, es in diesem Programm zu verwenden, wird es nicht funktionieren. Nach einigen Recherchen (d. H. Fragen bei Lounge C ++) habe ich festgestellt, dass Sie seit Windows 95 nicht mehr auf den Adressraum eines anderen Programms zugreifen können. In älteren Versionen von Windows war es erlaubt. Meine Frage ist, warum hat Microsoft es nicht zugelassen? Was waren die Probleme oder Nachteile dabei?
P.S Ist es in einigen neuen Versionen von Windows noch möglich, dies zu tun?
Da Sie auf den Adressraum anderer Prozesse zugreifen können, bedeutet dies, dass Sie sie zum Absturz bringen können, indem Sie beispielsweise ihren Speicherinhalt zufällig ändern.
Der gesamte Punkt des geschützten Modus besteht darin, Prozesse gegenseitig zu schützen. Weitere Informationen finden Sie auf der Seite zum Speichern von Speicherwörtern . In den schlechten alten Tagen vor dem Schutz war es viel einfacher, Code zu schreiben, der mit anderen Prozessen spielte.
Der Nachteil davon ist, dass es für einige MS Word Fehler leichter war, nicht nur MS Word, sondern auch Excel, Borland C, den PI-Ziffernrechner, der in den letzten sechs Wochen lief, und sogar Microsoft zu stürzen das Betriebssystem selbst.
Sie können immer noch auf einen anderen Prozessadressraum zugreifen, müssen dafür aber grundsätzlich mit höheren Zugriffsrechten arbeiten. Auf diese Weise können Sie mit Debuggern beispielsweise einen Prozess ausführen und auf seinen gesamten Speicher für Debugging-Zwecke zugreifen.
Die Aufrufe ReadProcessMemory
und WriteProcessMemory
ermöglichen Ihnen dies zusammen mit vielen anderen Debugging-Funktionen .
16-bit Windows hat einige wirklich erstaunliche Funktionen des Speichermanagements gemacht, aber es wurde behindert, weil es für einen Prozessor ohne Speicherverwaltung entworfen wurde, nämlich den i8086 des ursprünglichen PCs (Hardware-Leute mögen nicht, dass der ursprüngliche PC einen i8088 verwendet hat). was bis auf die Breite des Datenbusses identisch war).
In 16-Bit-Windows-Prozessen wurde also dieselbe Speicheransicht verwendet.
Ein Problem dabei ist, dass der gemeinsame Speicheradressraum nicht wirklich groß ist, wenn zig Prozesse ihre eigenen Teile davon besitzen wollen.
Außerdem wird es Prozessen zu leicht gemacht, sich gegenseitig zu stolpern.
Windows bot einige Teillösungen an, z. B. die Fähigkeit eines Prozesses, Windows darüber zu informieren, wann es tatsächlich etwas Speicher verwendete (der Prozess würde dann diesen Speicherbereich "sperren"), was bedeutete, dass Windows den Speicherinhalt verschieben konnte wenn nötig Platz schaffen, aber es war alles freiwillig und auch nicht sehr sicher.
32-Bit-Windows, Windows NT, verwendete also die Speicherverwaltung des neueren Prozessors, um die Best Practices zu automatisieren, die 16-Bit-Windows-Programme hätten verwenden sollen. Im Wesentlichen behandelt ein Prozess nur logische Adressen , die der Prozessor automatisch in physikalische Adressen übersetzt (was der Prozess nie sieht). Nun, auf dem 32-Bit-PC ist die Übersetzung eine zweistufige Angelegenheit, d. H. Es gibt ein internes Zwischenadressformular, aber das ist eine Komplikation, über die Sie nichts wissen müssen.
Eine nette Konsequenz dieser hardwaregestützten Adressumsetzung ist, dass ein Prozess vollständig isoliert werden kann, wenn man weiß, welche physikalischen Adressen er verwendet. Zum Beispiel ist es einfach, zwei Prozesse des gleichen Programms zu haben. Sie denken, sie haben mit den gleichen Adressen zu tun, aber das sind nur logische Adressen; In Wirklichkeit werden ihre logischen Adressen auf verschiedene physikalische Adressen heruntertransformiert, so dass sie nicht auf die Speicherbereiche der anderen stampfen.
Und eine Konsequenz, die wir mit 20-20 im Nachhinein sagen können, ist nicht so schön, ist, dass das Übersetzungsschema virtuellen Speicher erlaubt, z. um RAM unter Verwendung von Speicherplatz zu simulieren. Windows kann Speicherinhalte auf Datenträger kopieren und diesen Bereich des physischen Speichers dann für etwas anderes verwenden. Wenn der Prozess, der diesen Speicherbereich verwendet, darauf schreibt oder liest, führt Windows einige frenetische Aktivitäten durch, um die Daten von der Festplatte in einen Speicherbereich (der gleich oder anders sein kann) zu laden und die logischen Adressen des Prozesses abzubilden Dort. Die Folge davon ist, dass der PC bei schwacher Speicherumgebung von einem elektronischen Beastie zu einem mechanischen Beastie wird, der tausende und Millionen Male slooooower vor sich geht. Ungood - aber wenn RAM-Größen klein waren, dachten die Leute, dass das virtuelle Gedächtnis ordentlich sei.
Das Hauptproblem bei virtuellem Speicher in heutigen Windows ist, dass es in der Praxis fast unmöglich ist, dieses verdammte Ding auszuschalten. Selbst wenn nur ein "Haupt" -Programm ausgeführt wird und mehr als ausreichend physischer RAM verfügbar ist, tauscht Windows proaktiv Daten auf die Festplatte aus, um bereit zu sein, wenn möglicherweise dieser Prozess noch mehr logischen Speicher benötigt. Wenn dies jedoch behoben wäre, würde höchstwahrscheinlich etwas anderes an seiner Stelle erscheinen; Das ist die Natur des Universums.
Prost & amp; hth.,
Ihre Prämisse ist falsch. Sie können ganz sicher den Speicher eines anderen Prozesses lesen in Windows. Sie können es einfach nicht tun, wenn Sie einen Zeiger dereferenzieren, da jeder Prozess eine andere Sicht auf den Speicher hat. Dies ist aus einer Vielzahl von Gründen notwendig, aber die wichtigste ist, einen Fehler in einem Programm daran zu hindern, andere ausführende Programme zu korrumpieren. (Eine weitere Möglichkeit besteht darin, zu verhindern, dass Adressraum eine knappe Ressource wird.)
Du machst es so, als ob du denkst, dass Speicherschutz eine schlechte Sache ist !?
Der unkontrollierte Zugriff auf den Speicher eines Prozesses von einem anderen führt in der Regel zu Fehlern, Abstürzen, undefiniertem Verhalten, und kritischer wäre vielleicht eine offene Tür zu Malware und Viren. Sie können zwei Prozesse schreiben, die über gemeinsamen Speicher kooperieren, aber genauso kann jeder andere Prozess entweder irrtümlicherweise oder böswillig auf sie zugreifen. Außerdem wäre es sehr einfach, auch den Betriebssystemkernel selbst zu zerstören.
Win16 wurde ursprünglich als grafische Umgebung und nicht als echtes Betriebssystem auf MS-DOS ausgeführt und wurde für die Verwendung auf frühen 16-Bit-x86-Prozessoren ohne MMU entwickelt, um Speicherschutz zu ermöglichen. Die Win32S-API wurde später in Windows 3.x eingeführt, die eine Untergruppe von Win32-Funktionen auf Win16 zur Verfügung stellte. Windows32 (ursprünglich Windows NT und dann gleichzeitig Windows 95) nutzt die Vorteile des 80386, um jedem Prozess eine eigene Arbeitsspeicherumgebung zu bieten, die für andere Personen nur auf Einladung sichtbar ist.
Dies hat Windows NT robuster als Win3.x gemacht. Windows 95 hat die Schutzmechanismen nicht vollständig genutzt, vermutlich um die Abwärtskompatibilität einiger Ebenen zu gewährleisten, also zwar robuster als Win3.x, aber nicht so crashsicher wie NT. Windows XP war das erste "Consumer" Windows-Betriebssystem, das die Windows NT / Windows 2000-Codebasis verwendet und viel (aber nicht alles) des Kompatibilitätsgepäcks von Windows 95 / MS-DOS verwirft.
Wenn Sie Daten zwischen Prozessen austauschen möchten, müssen Sie dies über anerkannter IPC-Mechanismus . Eine solche Methode besteht in der Tat aus einer Memory-Mapped-Datei, die genau ein Shared-Memory-Block ist, aber mit Zugriffskontrollen, so dass nicht nur jeder Prozess den Speicher sehen kann.
Nun, wenn Sie sich im Ram-Bereich anderer Prozesse herumarbeiten können, ist es eine einfache Aufgabe, sie zum Absturz zu bringen. ZB müssen Sie nur einen Zeiger auf NULL setzen und der Prozess wird weg sein. Und gut RAM sind "private" Teile von jedem Prozess und Sie wollen nicht, dass jemand auf sie zugreifen, nicht wahr? Ja, es gibt einen Weg, auf den Sie wahrscheinlich zugreifen können, wenn Sie ein Kernel-Debugging durchführen.