SuSE Linux AXP: Version ALL
Mar 15 15:15:14 linux kernel: kcontrol(5633): unaligned trap at 000002000000eb58: 0000020000dee36c 29 1 Mar 15 15:15:14 linux kernel: kcontrol(5633): unaligned trap at 000002000000eb60: 0000020000dee36c 2d 1 Mar 15 15:15:14 linux kernel: kcontrol(5633): unaligned trap at 000002000000eb58: 0000020000df0f0c 29 1
Hier ist eine einfache Variante der Programme, die solche Fehler verursachen:
#include <stdio.h> #include <stdlib.h> int main() { long *l; l = (long *) malloc(sizeof(long)+8); printf("address of l (aligned) : %x\n",l); ((char *)l)+=3; printf("address of l (unaligned) : %x\n",l); return *l = 0; //return 0; }
Auf Alpha-Rechnern müssen alle Variablen in Adressbereichen gespeichert werden, die ein vielfaches ihrer Länge sind. So zum Beispiel müssen alle "long integer"-Variablen als Adressen, die ein vielfaches von 8 sind gespeichert werden.
Im obigen Beispiel schiebt man den Zeiger ("long int") an seine "aligned address" +3 Bytes. Wenn man man auf diesen nun "unaligned pointer" zugreift, erhält man einen "unaligned trap", der sich wie unter "Symptom" beschrieben via syslog daemon bemerkbar macht.
Wenn man dagegen den Zeiger auf eine Adresse schiebt, die ein vielfaches von acht ist, tritt dieses Problem nicht auf. Gleiches gilt für "integer"-Variablen. Diese müssen aber 4 Bytes "aligned" sein.