Wie genau eine Zugriffsverletzungsausnahme ausgelöst wird

7

Manchmal können Fehler eine Ausnahme wegen Speicherzugriffsverletzung verursachen.

Wie genau wird diese Ausnahme ausgelöst? Welcher Mechanismus funktioniert hinter den Kulissen?

Benötigt es Unterstützung von der CPU (ab welcher CPU?) / vom Betriebssystem (ab welcher Version?) / vom Compiler (ab welcher Version?)

Bearbeiten:

Ein bestimmtes Szenario, das ich besser verstehen möchte:

Der folgende Code kann eine Zugriffsverletzungsausnahme verursachen.

%Vor%

Ich denke czXXX zeigt auf einen schreibgeschützten Speicherblock, aber was genau passiert?

    
Lior Kogan 30.01.2011, 09:47
quelle

6 Antworten

11

Speicherzugriffsverletzungen sind ein großes Thema:)

Der Schutz von Informationen in Computersystemen (ab 1973 :) besteht aus einem Mechanismus von Segmenten , wobei Prozessen eine -Basis und eine -Begrenzung zugewiesen sind; Jeder Versuch, auf Speicher außerhalb des Bereichs base:base+bound zuzugreifen, bedeutete, dass das Programm etwas Dummes getan hatte und getötet werden sollte.

Die 80x86-Prozessorlinie implementiert grundlegende Segmentunterstützung, und der GEMSOS Sicherheitskernel ist ein A1- zertifizierter Betriebssystemkern basierend auf diesem Mechanismus.

Aber Segmente sind nicht sehr dynamisch, und fast alle modernen Betriebssysteme sind Paging Systeme, die Seite in Speicher, wenn es nicht verfügbar ist. Dies beruht auf der CPU mit einer MMU , Speicherverwaltungseinheit, die alle Speicherzugriffe auf korrekte Privilegien und Anwesenheit / Abwesenheit von prüft die richtige Speicherzuordnung. Wenn ein Prozess versucht, auf Speicher zuzugreifen, der momentan nicht dem RAM zugeordnet ist, signalisiert die MMU der CPU, dass ein Fehler aufgetreten ist, und die CPU unterbricht den Prozess zum Laden der angeforderten Speicherseite von der Platte. (Oder, wenn der Speicher für den Prozess nicht zugeordnet werden sollte, sagen Sie versucht, auf 0x0 oder einen zufälligen Speicherort zuzugreifen, der nicht mit mmap oder ähnlichen Speicherzuweisungs-Primitiven zugeordnet wurde, wird der Prozess beendet.)

Intels 80386 war der erste Intel-Chip, der Paging unterstützte, weshalb der "386 Enchanced Mode" von Windows 3.1 also viel besser war als der 286-Modus.

Compiler sind nicht wirklich involviert, aber CPU, MMU und Betriebssystemkern müssen alle zusammenarbeiten.

    
sarnold 30.01.2011, 09:57
quelle
6

In der x86-Architektur (und den meisten anderen) wird dies von der MMU - der Speicherverwaltungseinheit - gestartet. Die MMU wird verwendet, um virtuelle Speicheradressen in physikalische Speicheradressen zu übersetzen. Wenn eine Anforderung zum Zugriff auf eine ungültige Adresse (0x00000000 oder etwas zu hoch) gestellt wird, wird die MMU das OS abfangen (unterbrechen), und zwar für jeden Zugriff, der nicht im TLB-Cache ("Lookaside-Puffer übersetzen") ist ")). Hier wird das Betriebssystem erkennen können, dass dies ein unzulässiger Speicherzugriff ist, und über den Betriebssystem-abhängigen Mechanismus (Signale in Linux (SIGSEGV)) an die Benutzeranwendung weitergegeben. Ich bin mit Windows nicht genug vertraut, um zu sagen, wie es gemacht wird in ihm).

Diese Funktion ist für alle modernen CPUs, Betriebssysteme und Compiler verfügbar. Die grundlegendste Anforderung ist eine MMU, die in allen außer den einfachsten eingebetteten CPUs vorhanden ist. Ich bezweifle, dass es derzeit einen PC gibt, der dies nicht unterstützt.

Bearbeiten:

Im Anschluss an die OP-Bearbeitung wird bei Verwendung einer literalen Zeichenfolge der Speicher im .text-Segment der ausführbaren Datei platziert. Hier sitzen der binäre Code und die konstanten Werte. Natürlich ist dies in den meisten Betriebssystemen schreibgeschützt (insbesondere unter Linux mit verschiedenen Sicherheitserweiterungen). Wenn Sie versuchen, einen Wert einer literalen Zeichenfolge zu ändern, versuchen Sie im Grunde, in einen schreibgeschützten Speicher zu schreiben, was eine Zugriffsverletzung verursacht. Auch dies wird von der MMU abgefangen, die einen Schreibbefehl an eine Nur-Lese-Speicheradresse sieht.

    
Eli Iser 30.01.2011 09:56
quelle
2

Wenn Sie versuchen, auf eine Speicheradresse zuzugreifen, durchläuft der Computer mehrere Schritte:

  • Wenn die Adresse Teil des aktuellen Speichersegments ist, wird der Zugriff gewährt.
  • Andernfalls, wenn das Segment der Adresse im Speicher mit entsprechender Zugriffsberechtigung liegt, wird der Zugriff gewährt.

Wenn sich die Adresse nicht im Speicher befindet, generiert die CPU eine Speicherüberprüfungsausnahme. An dieser Stelle übernimmt das Betriebssystem.

  • Wenn das Segment im virtuellen Speicher mit der entsprechenden Zugriffsberechtigung verfügbar ist, wird es in den Speicher geladen und dem virtuellen Speichermanager zugewiesen. Zugriff ist dann gewährt.

Wenn zu diesem Zeitpunkt der Speicher nicht verfügbar ist, gibt es eine von zwei Möglichkeiten. Entweder ist die Adresse nicht verfügbar oder Sie verfügen nicht über die erforderlichen Berechtigungen (z. B. versuchen, in den schreibgeschützten Speicher zu schreiben). In diesem Fall übergibt das Betriebssystem die Zugriffsverletzung an den Prozess.

Bei CPU- und Betriebssystemversionen ist dies ein System, das virtuellen Speicher zulässt. Ich kenne die Details nicht.

    
Kevin Lacquement 30.01.2011 09:57
quelle
2

Alle diese Antworten erklären, was auf einer Prozessorebene sehr gut passiert. Wie bereits erwähnt, ändern sich die Dinge mit verschiedenen Betriebssystemen, sobald der Prozessor einen Interrupt zum Betriebssystem auslöst.

Windows verwendet einen Mechanismus, der als " Strukturierte Ausnahmen " bekannt ist. Sehr wichtig, um dies nicht mit C ++ Ausnahmen zu verwechseln, sie sind unterschiedlich. Strukturierte Ausnahmen konzeptionell funktionieren auf die gleiche Weise wie C ++ - Ausnahmen, indem sie den Stapel nach einem Handler abwickeln. Da strukturierte Ausnahmen sprachunabhängig sind, rufen sie nicht Destruktoren auf oder säubern sie.

Strukturierte Ausnahmen können mit

abgefangen werden %Vor%

Seien Sie jedoch gewarnt, dass Ihr Programm, sobald Sie eine Structured Exception erhalten, bereits auf abgestürzt ist, , so dass es keinen vernünftigen Weg zum "Wiederherstellen" gibt.

Weitere Informationen zu SEH .

    
Ramon Zarazua B. 30.01.2011 11:11
quelle
1

Speicherzugriffsverletzung kann auch hier auftreten:

%Vor%

In solchen Fällen wird eine Ausnahme vom Speichermodell des Betriebssystems ausgelöst. Meistens ist es das Betriebssystem, dessen Aufgabe es ist, den Speicherzugriff von jedem Prozess zu validieren!

    
Nawaz 30.01.2011 09:58
quelle
0
%Vor%     
Marlon 30.01.2011 09:54
quelle