Wie das Betriebssystem Speicherzugriffsverletzungen erkennt

12

Woher weiß ein Betriebssystem (vorzugsweise Linux), dass Sie auf einen Speicherort zugegriffen haben, auf den Sie nicht zugreifen dürfen?

Diese Frage wurde von diesen verdammten Zeigern inspiriert! Ich sehe das so: Bei allem in Computern geht es um einen Kompromiss zwischen Geschwindigkeit, Sicherheit, Integrität und dergleichen.

Ich kenne Speicherkarten in Linux, aber es klingt ein bisschen lächerlich, wenn der Kernel prüft, ob sich der Speicherort, auf den Sie zugreifen möchten, jedes Mal in einem gültigen Bereich befindet, wenn Sie einen Zugriff vornehmen. Es hört sich so an, als würde es so viel Zeit verschwenden, die für produktivere Arbeiten aufgewendet werden könnte (aber möglicherweise weniger sicher, ohne dass dies überprüft wird!). Oder merkt es sich vielleicht alle letzten Zugriffe und überprüft sie bei jedem Hardwaretimer-Tick? (Aber das klingt unsicher und langsam.)

Ich war überrascht, dass diese Frage nirgendwo unbeantwortet zu sein scheint. Das habe ich mich immer gefragt. Ich glaube, es gibt einen Hardwareabschnitt, der dies im Auftrag des Betriebssystems in einer schönen, praktischen Abstraktionsebene erledigt. Dennoch würde es möglicherweise erforderlich sein, die Speicherzuordnungen des nächsten Prozesses bei jedem Kontextwechsel zu laden, was wiederum langsam klingt.

Ja, trotzdem, ich gehe ein bisschen weiter: Wie erkennt ein Betriebssystem eine Speicherverletzung?

Vielen Dank

Doddy
quelle

Antworten:

11

(In der folgenden Antwort wird von einem „modernen“ Desktop, Server oder einer Embedded-Plattform der oberen Preisklasse (z. B. Smartphones und immer mehr kleinere Systeme) ausgegangen. Bei x86-Systemen bedeutet modern 386 und höher. In der folgenden Antwort wird auch a vorausgesetzt.) "Modernes" Betriebssystem wie fast jedes Unix oder Windows seit 95.)

Dies geschieht nicht im Betriebssystem, sondern im Prozessor, insbesondere in der MMU ( Memory Management Unit ) . Die MMU unterstützt die virtuelle Adressierung, wobei die Bits, aus denen sich ein Zeiger zusammensetzt, nicht direkt die physische Position der Bits im Speicher angeben.

In einer typischen MMU unterteilt die MMU, wenn ein Zeiger dereferenziert wird, die Bits in zwei Gruppen: Die höherwertigen Bits bilden die Seitenzahl und die niederwertigen Bits bilden die Adresse innerhalb der Seite. Die meisten Desktop- und Servermaschinen verwenden 4-KB-Seiten. Die MMU schlägt die virtuelle Seitennummer in einer Tabelle mit dem Namen TLB nach (so haben Sie die "Prozessspeicherzuordnungen" genannt). Der TLB gibt die Nummer der physischen Seite an, die dieser virtuellen Seite entspricht. Die MMU holt dann die Daten von der physischen Seite im Speicher.

Wenn der TLB keinen Eintrag für diese bestimmte virtuelle Seitennummer enthält, benachrichtigt die MMU den Prozessor, dass ein ungültiger Zugriff aufgetreten ist. Dies wird normalerweise als Ausnahme bezeichnet.

Beachten Sie, dass ich das Betriebssystem bisher noch nicht erwähnt habe. Das liegt daran, dass all diese Vorgänge unabhängig vom Betriebssystem sind. Das Betriebssystem kommt ins Spiel, weil es die Dinge auf zwei Arten konfiguriert:

  • Die OS ist für das Schalten von Aufgaben verantwortlich. In diesem Fall wird, wie Sie vermutet haben, der aktuelle TLB gespeichert und durch den gespeicherten TLB für die nächste geplante Aufgabe ersetzt. Auf diese Weise verfügt jeder Prozess über einen TLB, sodass die Adresse 0x123456in Prozess X möglicherweise nicht auf dieselbe tatsächliche Stelle im RAM wie die gleiche Adresse in Prozess Y verweist oder einfach ungültig ist. Wenn ein Prozess versucht, einen Zeiger außerhalb seines Adressraums zu dereferenzieren, greift er nicht in den Raum eines anderen Prozesses, sondern erreicht nichts .

  • Das Betriebssystem entscheidet, was passiert, wenn eine Ausnahme ausgelöst wird. Es kann den Vorgang für einen ungültigen Speicherzugriff (Segmentierungsfehler, allgemeine Schutzverletzung, ...) beenden. Dies ist auch die Art und Weise, wie das Auslagern implementiert wird: Der Ausnahmehandler kann entscheiden, einige Daten aus dem Auslagerungsbereich abzurufen, den TLB entsprechend zu aktualisieren und den Zugriff erneut auszuführen.

Beachten Sie, dass die MMU Sicherheit bietet, da der Prozess seinen eigenen TLB nicht ändern kann. Nur der Betriebssystemkern kann TLBs ändern. Die Funktionsweise von TLB-Änderungsberechtigungen ist nicht Gegenstand dieser Antwort.

Gilles 'SO - hör auf böse zu sein'
quelle
6

1) Segfaults werden von der Speicherverwaltungseinheit erkannt. Wenn Sie nach Speicher fragen, fordert das Betriebssystem die Speicherverwaltungseinheit auf, etwas von der Hardware abzurufen. Es muss etwas geben, das alle großen Speicherblöcke im Auge behält, die das Betriebssystem Ihnen zur Verfügung stellt. Das Betriebssystem übergibt das an die MMU. Da es den gesamten Speicherplatz kennt, den es Ihnen zur Verfügung gestellt hat, kann es Ihnen auch mitteilen, wann Sie versuchen, auf einen Speicherplatz zuzugreifen, den Sie nicht aus Zuordnungen erhalten haben. Schließlich beendet das Betriebssystem Ihre App und löst entweder einen Segfault oder den entsprechenden Fehler auf anderen Betriebssystemen aus.

Nicht alle Betriebssysteme verfügen über diesen Schutz. MacOS bis 9 hatte nichts davon, obwohl die MMU dies unterstützte. Win 3.1 auch nicht. Win95 hatte einen gewissen Schutz, da es zwischen dem Nicht-Schutz und dem Hinzufügen eines gewissen Schutzes überging.

2) Das Betriebssystem kennt keine weiteren Details. Wenn Sie einen Streuzeiger haben, der auf Speicher zugreift, den Sie nie zugewiesen haben, weiß er Bescheid. Wenn Sie eine haben, die in einen anderen Teil Ihrer Anwendung geht, weiß es natürlich nicht. Sie können dies verfälschen. Hier erhalten Sie beschädigte Stapel, wobei verirrte Zeiger von Ihrer App andere Teile Ihrer App überschreiben.

Also, ja, Sie können Ihre eigenen Daten schrauben. Wenn Sie einen verirrten Zeiger haben, der Ihre eigene App überschreibt, HOFFNEN Sie, dass Sie auf Ihren Stapel stoßen, da dies wahrscheinlich eine weitere Verletzung darstellt, wenn Sie versuchen, vom Stapel zurückzukehren, aber wenn Sie Ihre eigenen Daten stoßen, werden Sie es nie erfahren.

Sie können versuchen, strenger als "kein Schutz" zu sein. Es gibt ein Tool namens "Electric Fence" ( http://perens.com/FreeSoftware/ElectricFence/ ), das Ihre MMU dazu bringt, ein bisschen besser zu funktionieren und mehr zu erkennen Fehler.

Reiche Homolka
quelle
Okay, kannst du genauer sagen, wie es funktioniert? Wie weiß man, dass ein bestimmter Prozess nicht auf einen bestimmten Standort zugreifen kann? Was sagt es, welche Prozesse wo zugreifen können? Wie unterscheidet es sich? Vielen Dank
Doddy
1
@panic - suche Memory_management_unit in Wikipedia und die Links von dieser Seite. Beachten Sie, dass der Prozessstatus den MMU-Status enthält. Sie könnten Semester für MMU-Design, -Funktionen und -Integration verbringen.
mpez0