LINUX.ORG.RU

Модуль ядра для 2.4.37 sock->ops->ioctl вызывает kernel_panic


0

1

Здравствуйте!

Такая проблема. Есть модуль ядра, в коде есть такой фрагмент:

old_fs = get_fs(); set_fs(KERNEL_DS); printk(KERN_ALERT «aaa»); sock->ops->ioctl( sock, cmd, arg ); printk(KERN_ALERT «bbb»); set_fs(old_fs);

Сам модуль работает, но работает неустойчиво, может поработать 5 мин и упасть, час, два часа, а может вообще не упасть. Проблема (еле ее нашел) в том, что sock->ops->ioctl вызывает kernel_panic с сообщением «Unable to handle kernel NULL pointer dereference at virtual address 00000000» («aaa» я вижу а «bbb» уже нет). Причем этот фрагмент вызывается постоянно, но ошибку выдает в какой-то недетерминированный момент. sock != NULL, sock->ops->ioctl != NULL, память под arg выделена через kmalloc, GFP_ATOMIC, сама структура на которую указывает arg содержит буфер (тоже kmalloc, GFP_ATOMIC) и длину буфера (там все ОК). Кто догадывается в чем может быть дело, подскажите пожалуйста.

Ответ на: комментарий от Hater

Кажется. Я бьюсь с задачей одной, но вопросы при ее решении возникают разные.

yura_lvk
() автор топика

при текущей формулировке, думаю, вам никто не сможет помочь.

Krieger_Od ★★
()

память под arg выделена через kmalloc, GFP_ATOMIC, сама структура на которую указывает arg содержит буфер (тоже kmalloc, GFP_ATOMIC) и длину буфера (там все ОК)

kmalloc точно успешно выделяет память? Есть на это проверка?

Hater ★★
()
Ответ на: комментарий от yura_lvk

И параллельных потоков тоже нет, которые могут освободить память?

Ну тогда нужно дебажить уже внутри ioctl если есть такая возможность.

Hater ★★
()

А вообще это что за ioctl? Не похоже что он стандартный, т.к. он завёрнут в некую структуру. К тому же рутовая структура ещё и первым параметром передаётся. Это не ошибка, так и было задумано?

Hater ★★
()
Ответ на: комментарий от Hater

нет, потоков нет. Ну ладно, будем думать, спасибо.

yura_lvk
() автор топика
Ответ на: комментарий от Hater

Нет, не ошибка. Внутри модуля делается struct socket *sock; sock_create( AF_INET, SOCK_DGRAM, IPPROTO_IP, &sock );

а дальше поехали у структуры есть набор операций sock->ops, а среди операций есть ioctl - sock->ops->ioctl, ну дальше понятно

yura_lvk
() автор топика

Написано же чётко «Unable to handle kernel NULL pointer dereference at virtual address 00000000»

Ну сделай дамп, узнай, что дереференсится и исправь.

esandmann
()

Фигак! А что, в ляликсе принято ioctl внутри ядра вызывать?

esandmann
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.