![]() |
eXeL@B —› Программирование —› Segmentation fault при подгрузке модулей ядра в mipsel устройстве работающем на Linux |
Посл.ответ | Сообщение |
|
Создано: 08 января 2009 12:39 · Личное сообщение · #1 Добрый день. В общем есть устройство с процессором архитектуры mipsel. На нем linux. При подгрузке модулей ядра происходит ошибка. Внизу прикреплен лог. Интересует собственно вот что. Из-за чего это может происходить и как найти причину такой ошибки. Если кто сталкивался или знает что-то по этому поводу - отпишитесь пожалуйста. Заранее, спасибо. # insmod brcmstfb.ko CPU 0 Unable to handle kernel paging request at virtual address 00000000, epc == 80046358, ra == 80281754 Oops in arch/mips/mm/fault.c::do_page_fault, line 167[#1]: Cpu 0 $ 0 : 00000000 10008400 87a6dd4c 10008401 $ 4 : c072281c 87a6dd40 00000000 ffffffed $ 8 : 87a6dfe0 00008400 00000000 8060a000 $12 : ffffffff 00000000 00000000 00000000 $16 : c0722818 c0722818 87cd0810 ffffffed $20 : c0080b80 fffffffa c072281c 00000002 $24 : 00000000 00000000 $28 : 87a6c000 87a6dd30 00405fc0 80281754 Hi : 00000000 Lo : 00000000 epc : 80046358 add_wait_queue_exclusive+0x38/0x6c Tainted: P ra : 80281754 __down_interruptible+0x64/0x278 Status: 10008402 KERNEL EXL Cause : 0080000c BadVA : 00000000 PrId : 00020000 Modules linked in: brcmstfb cirrusfb softcursor fb cfbimgblt cfbfillrect cfbcopyarea bcm7401 bcmkni Process insmod (pid: 225, threadinfo=87a6c000, task=87cd0810) Stack : 87a6dd38 87a6ddb0 87cd0934 00000000 00000001 87cd0810 80024b68 c072281c 00000000 c0080ba4 c0720000 c0722818 802ceeb0 ffffffed c0080b80 fffffffa 00000002 00000002 c046e494 87cd0810 80024b68 00100100 00200200 805a527c 00000001 c0080b80 c048cc1c 00000000 00000000 87a6de0c 87a6ddc8 87af145f c0080b10 c0082040 00000000 87a6de40 802d0000 ffffffff 00000000 87a6ddcc ... Call Trace: [<80024b68>] default_wake_function+0x0/0x20 [<c046e494>] b_lock+0xb4/0x11c [bcm7401] [<80024b68>] default_wake_function+0x0/0x20 [<c048cc1c>] bdisplay_open+0x1c/0x54 [bcm7401] [<c0082040>] brcmstfb_probe+0x40/0x414 [brcmstfb] [<80186598>] driver_probe_device+0x44/0xa4 [<80186660>] device_attach+0x68/0xf8 [<801436e0>] kobject_get+0x20/0x34 [<80144068>] kobject_hotplug+0x2a8/0x33c [<800c5d4c>] sysfs_create_dir+0x38/0x98 [<801868b8>] bus_add_device+0x64/0x144 [<801439ac>] kobject_add+0x88/0x168 [<80184d38>] device_add+0xc0/0x16c [<8018899c>] platform_device_register+0x164/0x1e4 [<80186b58>] bus_add_driver+0xbc/0x150 [<c0080000>] brcmstfb_check_var+0x0/0x8c [brcmstfb] [<c0082470>] brcmstfb_init+0x5c/0x80 [brcmstfb] [<c0080000>] brcmstfb_check_var+0x0/0x8c [brcmstfb] [<8004e560>] sys_init_module+0x628/0xa38 [<8004e1d4>] sys_init_module+0x29c/0xa38 [<8000da60>] stack_done+0x20/0x3c [<8000da60>] stack_done+0x20/0x3c Code: 24a2000c aca4000c ac820004 <acc20000> ac460004 40016000 30630001 34210001 38210001 Segmentation fault # ![]() |
|
Создано: 08 января 2009 12:56 · Личное сообщение · #2 |
|
Создано: 08 января 2009 13:06 · Личное сообщение · #3 Это я понял. Ошибка наподобие Access Volation в винде. Вот только почему оно происходит? Исходников драйвера нет, а mips ассемблер я как бы не знаю, так что с отладкой проблема. А так по идее все должно работать нормально. Конечно по данному логу мало чего понятно, но может у кого-то есть какие-то соображения, что можно сделать чтобы разобраться в чем причина данной ошибки. ![]() |
|
Создано: 09 января 2009 10:17 · Поправил: NetSpider · Личное сообщение · #4 В общем, почитав про MIPS ассемблер и немного инфы, нарыл, что функция add_wait_queue_exclusive, которая вызывает данную ошибку судя по содержанию регистра epc находится в ядре LInux и вызывается соотвественно там. Копаем дальше... void fastcall add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t *wait) { unsigned long flags; wait->flags |= WQ_FLAG_EXCLUSIVE; spin_lock_irqsave(&q->lock, flags); __add_wait_queue_tail(q, wait); spin_unlock_irqrestore(&q->lock, flags); } .... В регистре ra адрес возврата - __down_interruptible, но в исходниках ядра такого текста много, ищу реализацию данной функции... .... Нашел в semaphore.c int __sched __down_interruptible(struct semaphore * sem) { int ret = 0; DOWN_VAR DOWN_HEAD(TASK_INTERRUPTIBLE) ret = waking_non_zero_interruptible(sem, tsk); if (ret) { if (ret == 1) /* ret != 0 only if we get interrupted -arca */ ret = 0; break; } schedule(); DOWN_TAIL(TASK_INTERRUPTIBLE) return ret; } Только вот где тут add_wait_queue_exclusive? ![]() |
|
Создано: 09 января 2009 20:07 · Личное сообщение · #5 Code:
![]() |
|
Создано: 12 января 2009 10:44 · Личное сообщение · #6 |
![]() |
eXeL@B —› Программирование —› Segmentation fault при подгрузке модулей ядра в mipsel устройстве работающем на Linux |