Frage

Wenn ich Lesen / Schreiben / Sprung zu einer ummapped Adresse dh.

.text
    .global _start
_start:
     movl   $1,%edx
     jmp     *%edx

Dies erzeugt einen Segmentation Fault.

Ich frage mich, was ist der eigentliche Teil des Systems (Kernel) dass Abschnitte liest / zu nicht zugeordneten Adressen schreibt (wie?) und führt das "Benutzermodus" Signal?

War es hilfreich?

Lösung

Alles fließt aus der Architekturen Trap-Tabelle. Dies wird in der Regel entry.S (split auf x86 zwischen entry_32 und entry_64.S) genannt und hat Assembler Verknüpfung, die eine Reihe von Dingen tut (je nach Konfiguration), bevor die richtigen des Kernels in den C-Code Überschrift.

So ein ungültiger Speicherzugriff sollte entweder durch Eingabe PAGE_FAULT oder general_protection und wird wahrscheinlich force_sig_info am Ende tut, bevor sie schließlich in send_signal (kernel / signal.c) zurück zum Benutzerbereich der Warteschlange werden.

Andere Tipps

Es ist für unterschiedliche Architektur implementiert. Zum Beispiel auf x86, können Sie die Quelle überprüfen an:

do_page_fault: linux/arch/x86/mm/fault.c  

In PowerPC-Chips, die nicht „Buch E“ sind (zB der letzten Chips für Embedded-Systeme), beginnt ein Segmentierungsfehler mit einer Ausnahme 0x300 (für Daten) oder 0x400 (für Anweisungen.) Der Benutzer / Supervisor-Mode-Flag gesetzt ist In dem Supervisor wird die MMU deaktiviert, und die CPU springt 0x300 oder 0x400 zu adressieren, die Kontrolle an das Betriebssystem gibt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top