Сейчас на форуме: zds, tyns777, JustLife, 2nd, morgot, Rio, CDK123 (+4 невидимых)

 eXeL@B —› Программирование —› Segmentation fault при подгрузке модулей ядра в mipsel устройстве работающем на Linux
Посл.ответ Сообщение

Ранг: 39.6 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 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
#



Ранг: 251.3 (наставник), 81thx
Активность: 0.140.11
Статус: Участник

Создано: 08 января 2009 12:56
· Личное сообщение · #2

Ну там же всё написано.
Обращение к нулевому адресу - VirtualAddress = 0



Ранг: 39.6 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 08 января 2009 13:06
· Личное сообщение · #3

Это я понял. Ошибка наподобие Access Volation в винде. Вот только почему оно происходит? Исходников драйвера нет, а mips ассемблер я как бы не знаю, так что с отладкой проблема. А так по идее все должно работать нормально.
Конечно по данному логу мало чего понятно, но может у кого-то есть какие-то соображения, что можно сделать чтобы разобраться в чем причина данной ошибки.



Ранг: 39.6 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 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?



Ранг: 352.4 (мудрец), 4thx
Активность: 0.150
Статус: Участник
retired

Создано: 09 января 2009 20:07
· Личное сообщение · #5

Code:
  1. 135 int __sched __down_interruptible(struct semaphore * sem)
  2. 136 {
  3. 137         int retval = 0;
  4. 138         struct task_struct *tsk = current;
  5. 139         DECLARE_WAITQUEUE(wait, tsk);
  6. 140 
  7. 141         __set_task_state(tsk, TASK_INTERRUPTIBLE);
  8. 142         add_wait_queue_exclusive(&sem->wait, &wait);
  9. 143 
  10. 144         while (__sem_update_count(sem, -1) <= 0) {
  11. 145                 if (signal_pending(current)) {
  12. 146                         /*
  13. 147                          * A signal is pending - give up trying.
  14. 148                          * Set sem->count to 0 if it is negative,
  15. 149                          * since we are no longer sleeping.
  16. 150                          */
  17. 151                         __sem_update_count(sem, 0);
  18. 152                         retval = -EINTR;
  19. 153                         break;
  20. 154                 }
  21. 155                 schedule();
  22. 156                 set_task_state(tsk, TASK_INTERRUPTIBLE);
  23. 157         }
  24. 158         remove_wait_queue(&sem->wait, &wait);
  25. 159         __set_task_state(tsk, TASK_RUNNING);
  26. 160 
  27. 161         wake_up(&sem->wait);
  28. 162         return retval;
  29. 163 }
  30. 164 




Ранг: 39.6 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 12 января 2009 10:44
· Личное сообщение · #6

Точно, оно. Плохо искал видимо. Спасибо.


 eXeL@B —› Программирование —› Segmentation fault при подгрузке модулей ядра в mipsel устройстве работающем на Linux
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати