LINUX.ORG.RU

не проходит вызов ioctl();


0

1

Здравствуйте!
Столкнулся с непонятной для меня ошибкой:
Есть драйвер, в котором объявлена структура file_operations:

static struct file_operations fops = {
	.owner        = THIS_MODULE,
	.open         = Open,
	.release      = Close,
        .compat_ioctl = Ioctl,
	.mmap         = Mmap,
};
Из кода тестовой программы происходит вызов:
::ioctl(arg1, arg2, arg3);
где: arg1 = 3 (файловый дескриптор), arg2 - целое число, arg3 - указатель на первый элемент массива. Все аргументы корректные.
Проблема в том, что функция Ioctl(), описанная в коде драйвера при этом не вызывается. Это установлено точно, с помощью отладочных выводов. А вызов ioctl из тестовой программы возвращает -1 (при том что в коде драйвера в Ioctl() в принципе нет return -1;).
При этом, все остальные функции из file_operations успешно вызываются из тестовой программы (установлено так же с помощью отладочных выводов).

Подскажите пожалуйста, в чем может быть причина этой проблемы и как от нее избавится?
Заранее спасибо!

параметры для ioctl нужно создавать через макросы _IO/_IOW/_IOR. если ты в arg2 передаешь рандомные константы, то они могут оказаться зарезервированными той же vfs, и до твоего модуля они не дойдут.

http://www.mjmwired.net/kernel/Documentation/ioctl-number.txt

vvviperrr ★★★★★
()
Последнее исправление: vvviperrr (всего исправлений: 3)
Ответ на: комментарий от anonymous

Не ругайтесь.
Проблема решена, заменой .compat_ioctl на .unlocked_ioctl:
http://stackoverflow.com/questions/15628996/ioctl-write-crashing/15629429
Причина правда, для меня так и осталась загадкой. Если кто-то понимает, почему .compat_ioctl не работал, а .unlocked_ioctl работает, то буду благодарен за объяснения.

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

Причина правда, для меня так и осталась загадкой. Если кто-то понимает, почему .compat_ioctl не работал, а .unlocked_ioctl работает, то буду благодарен за объяснения.

по твоей ссылке же все и написано

compat_ioctl is to allow 32-bit user space programs to invoke ioctl calls on a 64-bit kernel

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

Потому что google:

http://lwn.net/Articles/119652/ и http://lwn.net/Articles/394724/

А вкратце http://unix.stackexchange.com/questions/4711/what-is-the-difference-between-i...

или вот еще http://minghuasweblog.wordpress.com/2012/07/10/linux-kernel-ioctl-unlocked_io...

Важное отличие unlocked_ioctl от просто ioctl в том, что unlocked_ioctl должен заниматься блокировками сам, это было сделано с целью отказа от BKL (Big Kernel Lock).

Про compat_ioctl см. ответ не проходит вызов ioctl(); (комментарий)

Kiborg ★★★
()
Последнее исправление: Kiborg (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.