Theoretisch wäre es möglich, kürzlich freigegebenen Speicher von anderen Anwendungen zu lesen, wenn ich ein Programm erstellen würde, das den gesamten ungenutzten Speicher eines Systems belegt und weiterhin immer mehr Speicher anfordert, wenn andere Anwendungen Speicher freigeben, den sie nicht mehr benötigen ? Oder ist das irgendwie durch ein modernes Betriebssystem geschützt?
Ich habe keine praktische Anwendung dafür, ich bin nur neugierig. Mir ist klar, dass es einige Probleme mit der Zuweisung des gesamten verfügbaren Speichers im wirklichen Leben gibt.
Bearbeiten: Um dies zu verdeutlichen, frage ich speziell nach "Freigegebenem" Speicher und greife nicht auf Speicher zu, der derzeit von einer anderen Anwendung zugewiesen wird.
quelle
The reason you don't always see zeroed out memory is because it is more efficient not to zero out the memory if it was previously allocated by the same process
Ich sehe hier einige Inkonsistenzen. Meinten Sie "same executable"? Wie wird überprüft, ob keine Null erreicht werden soll - anhand des Plattenpfads?Hier sind mehrere Ebenen beteiligt, die sich auf die Antwort auswirken.
Wenn Sie von einem modernen Betriebssystem für virtuellen Speicher ausgehen, können Sie die Überreste anderer Prozessdaten auf den von Ihnen zugewiesenen Seiten nicht sehen.
Wenn ein Prozess zum ersten Mal geladen wird, wird die Seitentabelle geladen, und diesen Seiten werden möglicherweise Frames des realen Speichers zugewiesen. Die Seitentabelle oder ihre Ergänzungstabelle enthält mindestens eine Karte des gesamten Speichers, den der Prozess zuordnen kann. Hier wird auch die oben erwähnte anfängliche Prozessunterbrechung festgelegt.
Während malloc (), wenn der Prozess zulässig ist, eine Änderung des Prozessabbruchs verursachen kann und einer Tabelle mit Prozessseiten (ergänzenden Seiten) weitere Seiten hinzufügt, um die Anforderung zu erfüllen, befindet sich der Ort, an dem ein Prozess möglicherweise andere Prozessdaten abruft die untere reale Speicherschicht.
In beiden Szenarien weist ein modernes Betriebssystem, das Demand Paging oder Lazy Allocation verwendet, noch keinen physischen Speicher (Frames) zu. Das Betriebssystem "macht nur Notizen" darüber, welcher virtuelle Speicher für diesen Prozess als gültig angesehen wird. Der tatsächliche Speicher wird nur bei Bedarf zugewiesen.
Physischer Speicher oder Frames werden einem Prozess zugewiesen, wenn die virtuelle Seite realisiert und in eine Prozessseitentabelle abgebildet wird. Hier besteht das Potenzial für die Offenlegung von Daten. Dies geschieht während eines Seitenfehlers. Dies liegt daran, dass ein vorheriger Prozess möglicherweise denselben Frame verwendet hat und seine Daten entweder aufgegeben oder ausgetauscht wurden, um Platz für die aktuelle physische Speicheranforderung zu schaffen. Das Betriebssystem muss darauf achten, dass die anfragenden Prozessdaten ordnungsgemäß ausgetauscht werden oder der Frame gelöscht (auf Null gesetzt) wird, bevor der Prozess fortgesetzt wird. Dies wird auch oben als ein "altes, aber gelöstes" Problem erwähnt.
Dies macht es etwas irrelevant, ob der Speicher der anderen Prozesse "freigegeben" wurde oder nicht. Der "freigegebene" Speicher eines anderen Prozesses befindet sich immer noch auf Seiten, die diesem Prozess zugewiesen sind, und wird normalerweise erst nach Beendigung des Prozesses freigegeben, da sie nur ausgelagert werden, wenn der Speicher knapp wird oder wenn sie anderweitig entfernt werden. malloc () und free () verwalten den dem Prozess zugewiesenen virtuellen Speicher auf (Benutzer-) Ebene.
In Ihrer Frage fordert Ihr Prozess theoretisch immer mehr Speicher an und verdrängt alle anderen Prozesse aus dem Speicher. In der Realität gibt es Rahmenzuweisungsstrategien - global und lokal -, die sich ebenfalls auf die Antwort auswirken können. Es ist ebenso wahrscheinlich, dass der Prozess seine eigenen Seiten aus dem Speicher zwingt, bevor er das Betriebssystem und alle anderen Prozesse übersteuern kann. Dies geht jedoch über Ihre ursprüngliche Frage hinaus.
All dies ist in einem System wie MS-DOS umstritten. MS-DOS (und andere, einfachere Systeme) verwenden keinen virtuellen Speicher (für sich), und Sie könnten leicht andere "Prozess" -Daten anstoßen und anstoßen.
Einige gute Referenzen, die einfacher zu verstehen sind als der Linux-Quellcode, sind ein gutes Lehrbuch für Betriebssysteme, Betriebssystemkonzepte von Silberscatz, Gavin und Gange oder Betriebssystemdesign von Andrew Tanenbaum. Auch so etwas wie Nachos von Berkeley oder Pintos von Stanford sind kleine Betriebssysteme, die zum Lernen gebaut wurden und die gleichen Ideen enthalten.
quelle
Ich habe das vor 16.04 Monaten auf Ubuntu ausprobiert. Genau wie 0xACE sagte, weist das moderne Betriebssystem eine virtuelle Seite mit Nullen zu, sobald Sie malloc () aufgerufen haben. Wenn Sie jedoch nichts in den zugewiesenen Puffer schreiben, wird dieser nicht in den physischen Speicher abgebildet (dh nach dem Copy-on-Write-Prinzip), sodass Sie immer Nullen aus einem "nicht initialisierten" Block lesen. Möglicherweise gibt es einige eingebettete Betriebssysteme, die mit der Option "CONFIG_MMAP_ALLOW_UNITIALIZED" für eine bessere Leistung kompiliert wurden. In diesem Fall könnten Sie das bekommen, wofür Sie es erwartet haben.
quelle
Nein, dank der Magie des Paging kann kein anderes Programm die Erinnerung eines anderen lesen . Auf diese Weise kann die Gesamtspeicherbelegung den physischen RAM überschreiten, indem Teile davon auf die Festplatte ausgelagert werden.
Außerdem wird der maximale Speicher, den ein Prozess zuweisen kann, vom Betriebssystem willkürlich begrenzt (bis zu 4 Gigs für eine 32-Bit-Architektur). Danach gibt der nächste
alloc
Aufruf einen Fehler wegen unzureichendem Speicher zurück.quelle
mlock
).