Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : SegFault in down(semaphore *sem);



7.e.Q
10-11-2004, 08:29
Hallo Leute,

wieder unser Treiber (Kernel 2.6, gcc 3), der Schwierigkeiten macht:

wir haben einen Absturz des Treibers in der Deinitialisierung des selbigen, sprich als Reaktion auf rmmod. Wir bekommen immer eine Zugriffsverletzung bei einem Zugriff auf einen Null-Zeiger in der Funktion down(struct semaphore *sem). Wir wissen, daß die an die Funktion übergebene Semaphoren-Struktur korrekt ist. Trotzdem schmiert die Funktion ab. Wir finden den Fehler absolut nicht. Unsere eingebauten printks sagen uns, daß der Absturz definitiv in der down-Funktion passiert. Das printk davor kommt noch raus, das printk danach nicht mehr. Ich hab mir die Adresse der Semaphore mal ausgeben lassen und sie ist korrekt. Trotzdem faselt der Treiber beim Absturz was von 'nem Null-Zeiger an der Stelle. Ich versteh das nicht. Hier mal der Code:



for (n = 0; n < MAX_IMAGE_COUNT; n++) {
printk("MAX_IMAGE_COUNT = %i\n",MAX_IMAGE_COUNT);
printk("n = %i\n",n);
printk("SEMAPHORE\n");
printk("count = %08x\n",&sgd->ctrl.un.im[IMAGE_INDEX(n, it_pci_target)].sem_lock.count);
printk("sleepers = %08x\n",&sgd->ctrl.un.im[IMAGE_INDEX(n, it_pci_target)].sem_lock.sleepers);
printk("wait = %08x\n",&sgd->ctrl.un.im[IMAGE_INDEX(n, it_pci_target)].sem_lock.wait);

printk("WIEDER %08x\n", sgd);
printk("ctrl.un.im IMAGE_INDEX: %08x\n", &sgd->ctrl.un.im[IMAGE_INDEX(n, it_pci_target)]);
printk("ctrl.un.im IMAGE_INDEX: %08x\n", &sgd->ctrl.un.im[IMAGE_INDEX(n, it_pci_target)].sem_lock);
printk("BLABLIBLUBB\n");
down(&sgd->ctrl.un.im[IMAGE_INDEX(n, it_pci_target)].sem_lock);
printk("GOTT.\n");
if (ACTIVE_IMAGE(n, it_pci_target)) {
ioctl_delete_pcti(n);
}
printk("HALLO 1.\n");
up(&sgd->ctrl.un.im[IMAGE_INDEX(n, it_pci_target)].sem_lock);
down(&sgd->ctrl.un.im[IMAGE_INDEX(n, it_vme_slave)].sem_lock);
if (ACTIVE_IMAGE(n, it_vme_slave)) {
ioctl_delete_vsli(n);
}
printk("HALLO 2.\n");
up(&sgd->ctrl.un.im[IMAGE_INDEX(n, it_vme_slave)].sem_lock);
}


... wobei alle printks, die Adressen ausgeben sollen, korrekte Adressen ausgeben. "BLABLIBLUBB" kommt noch raus, "GOTT." nicht mehr.

Wo ist der Fehler???

7.e.Q
10-11-2004, 11:18
Für alle, die im Detail wissen, was down(...) macht:

wir kriegen eine Fehlermeldung, die besagt, daß der Kernel in der Funktion __down (eip = __down + 0x52/0xEF) einen NULL-Pointer nicht dereferenzieren kann (logisch), und daß der Prozessorregister edx = 0x00000000 ist. Die restlichen Register sind versorgt.

Der an down(...) übergebene Zeiger auf struct semaphore ist ebenfalls gültig versorgt. Trotzdem raucht das Ding ab... :confused: :mad:

7.e.Q
10-11-2004, 11:40
Wenn nicht hier, wo kann ich dann solche systemnahen Sachen fragen? :confused:

7.e.Q
10-11-2004, 12:56
Hab ich gerade gesehen, da steht noch 'ne weitere Fehlermeldung, die da sinngemäß lautet:



Debug: sleeping function called from invalid context in include/linux/rwsem.h: in_atomic()...



Was hat das zu bedeuten? Worauf deutet das hin? Wann tritt diese Meldung auf?

:confused:

anda_skoa
13-11-2004, 17:57
Wenn nicht hier, wo kann ich dann solche systemnahen Sachen fragen? :confused:

Ich denke die Leute in der Newsgroup comp.os.linux.development.system (oder so ähnlich) sind da ganz gut.
Bei Kernelsachen eventuell auch die Leute an der Quelle, sprich die Linux Kernel Mailingliste ;)

Ciao,
_