Linux Segmentation fault Fehlercodes

On in “Linux” by Tblue
Tags: ,

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.