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???
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???