Linux Segmentation fault Fehlercodes
Nach einem Mainboard-Wechsel habe ich des öfteren Segfaults und Kernel panics auf meinem Linux-Rechner (wie ja schon im Blog erwähnt). In der Ausgabe von dmesg sieht das dann so aus:
X[2672]: segfault at 1a4 ip 0819288a sp bf9bec60 error 4 in Xorg[8048000+196000]
Hm, toll, der größte Teil davon werden wohl Speicheradressen sein, aber was ist Fehler 4? Nach kurzem Suchen fand ich heraus, dass das (für einen x86-Prozessor) in der Quelltext-Datei arch/x86/mm/fault.c steht:
/*
* Page fault error code bits
* bit 0 == 0 means no page found, 1 means protection fault
* bit 1 == 0 means read, 1 means write
* bit 2 == 0 means kernel, 1 means user-mode
* bit 3 == 1 means use of reserved bit detected
* bit 4 == 1 means fault was an instruction fetch
*/
#define PF_PROT (1<<0)
#define PF_WRITE (1<<1)
#define PF_USER (1<<2)
#define PF_RSVD (1<<3)
#define PF_INSTR (1<<4)
Wir haben also die Zahl 1, bzw. 00000001 (wenn man annimmt, dass ein Byte acht Bits sind). Mittels des Operators << werden alle Bits in dem Byte um eine Stelle nach links verschoben (“geshiftet”). Das heißt:
PF_PROT = 00000001 PF_WRITE = 00000010 PF_USER = 00000100 PF_RSVD = 00001000 PF_INSTR = 00010000
So, 4 entspricht im Dualsystem 100 bzw. 00000100, also PF_USER. Also ein “page fault” beim Lesen im user mode. Oder so. Jedenfalls ist (mir) die Bedeutung von Fehler 4 nun etwas klarer.
Nachtrag:
Natürlich können auch Kombinationen der obigen Werte auftreten, z. B. würde Fehler 6 im Dualsystem 110 bzw. 00000110 entsprechen, was das Ergebnis einer logischen ODER-Verknüpfung von PF_WRITE und PF_USER ist:
00000010 ODER 00000100 ------------- 00000110
Das wäre ein page fault beim Schreiben im user mode.