Linux: wo ist der „echte“ Segmentation Fault Handler?
-
10-07-2019 - |
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?
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.