AXP: "unaligned trap"

Supportdatenbank (sschmitt_axp_unaligned_trap)
Bezieht sich auf

SuSE Linux AXP: Version ALL

Symptom

In der Datei /var/log/messages finden sich Einträge wie:


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

Ursache

Diese "unaligned traps" sind Folge einer Architektur-orientierten Programmierung. Das Problem ist, daß die meisten Leute beim Programmieren nicht an andere Plattformen wie die Alpha und deren Art der Speicherverwaltung denken.

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.


Stichwörter: AXP, ALPHA, UNALIGNED, TRAP

Kategorien: Hardware

SDB-sschmitt_axp_unaligned_trap, Copyright SuSE Linux AG, Nürnberg, Germany - Version: 05. Jun 2001
SuSE Linux AG - Zuletzt generiert: 07. Jun 2001 von sschmitt (sdb_gen 1.40.0)