LINUX.ORG.RU

доступ к системным вызовам из модуля


0

0

Всем доброго времени суток. Столкнулся с проблеммой: пишу модуль для ядра 2.6. в модуле делаю 2 системных вызова: mq_open и mq_unlink. не могу собраться, пишется undefined на оба вызова. Ядро собрано с поддержкой POSIX Messqge queues. Если я неправильно сделал, то как обращаться к системным вызовам при написании моделя ядра? Ответившим огромное спсибо.

Вот код: // все хедеры подключаются из /lib/modules/`uanme -r`/build/include #define CONFIG_NR_CPUS 1

#ifndef errno static int errno; #endif // errno

//#include <linux/errno.h> #include <linux/kernel.h> #include <linux/init.h> #include <linux/module.h> #include <linux/moduleparam.h> #include <linux/mqueue.h> #include <linux/fcntl.h> #include <linux/syscalls.h> #include <linux/unistd.h>

static mqd_t oc_qdesc = 0;

#define MQ_NAME "oc_queue"

int oc_kernelmod_init_module(void) { printk( KERN_DEBUG "Module OC_KernelMod init\n" ); struct mq_attr l_attr; l_attr.mq_maxmsg = 10; l_attr.mq_msgsize = 1024; l_attr.mq_flags = 0; l_attr.mq_curmsgs = 0; oc_qdesc = sys_mq_open(MQ_NAME, O_WRONLY | O_CREAT, 0664, &l_attr); if (oc_qdesc == -1) { printk(KERN_ERR "Failed to open message queue. Errno = %d\n", errno); return 1; } printk(KERN_INFO "Message queue opened with mqd = %d\n", (int)oc_qdesc);

return 0; }

static void oc_kernelmod_exit_module(void) { printk( KERN_DEBUG "Module OC_KernelMod exit\n" ); sys_mq_unlink(MQ_NAME); }

module_init(oc_kernelmod_init_module); module_exit(oc_kernelmod_exit_module);

anonymous

>Если я неправильно сделал, то как обращаться к системным вызовам при >написании моделя ядра?

наиболее правильно это никак не обращаться к системным вызовам,
а использовать подходящие внутренние интерфейсы ядра.

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

а какие? вот мне например надо организовать посиксную очередь в модуле. как это сделать если не с помощью системных вызовов?

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

>вот мне например надо организовать посиксную очередь в модуле.

надо просто не организовывать посиксную очередь.

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

а я хочу обмениваться сообщениями между моиим модулем ядра и демоном (моим же). Прочитам про всякие IPC я решил, что очередь мне подходит лучче всего.

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

>а я хочу обмениваться сообщениями между моиим модулем ядра и демоном (моим же). Прочитам про всякие IPC я решил, что очередь мне подходит лучче всего.


Почитай о возможных способах взаимодействия между kernel space и user space.
Например proc, device, mmap, signal, etc
Это первое что пришло в голову.
По мне, так в твоем случае проще всего реализовать взаимодействие через device. Просто создаешь, например, char device и в модуле реализуешь read,write,ioctl,close.
За подробностями, смотреть LDD-3

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

такой вариант я изначально и рассматривал пока про посиксные очереди не прочитал. IPC через девайс сделать можно конечно, но с очередями удобнее (имхо), да и еще тут уже дело принципа - почему не работает если должно?

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

>да и еще тут уже дело принципа - почему не работает если должно?

Почему должно?
System calls расчитаны на то, что они будут вызываться из user space, а не из kernel space.
Если не ошибаюсь, один из примеров - это разная адресация.

Чтобы получить данные к буферу, находящемуся в user space, используются доп функции типа put_user и т.п.

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

>почему не работает если должно?

кому должно?

sys_mq_open и ему подобные функции (sys_....) ожидают что некторые параметры находятся в userspace памяти, и вызывает их определенный процесс, т.е. существует какой-то контекст вызова,
поэтому вызов их напрямую из модуля глупость, все эти функции (sys_...) предназначены для обслуживания пользовательского режима.

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

Товарищи! Всем огромное спасибо, что обьяснили! Вроде понял. Только где вы такого начитались? Сам читал LDD3, LKMP guide, Understanding.the.Linux.Kernel.3rd.Edition - нигде не было сказано, что системные вызовы предназначены только для юзер-спейса... может я еще какую литературу пропустил? если пропустил - подскажите пожалуйста. Еще раз спасибо всем !

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

>нигде не было сказано, что системные вызовы предназначены только для юзер-спейса... может я еще какую литературу пропустил?

Никогда об этом не задумывался, пока не понадобилось сделать read/write file из модуля.

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

Где-то видел пример как это сделать. Я ссылочку поищу и скажу точно. Там кстати используются и open и close и еще модификация адресных сегментов.

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