Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > kernel module и свои библиотеки


Автор: slater 20.1.2011, 18:37
приветствую,

скажите как в модуле использовать свои собственные функции.

например, основные функции модуля я реализую в module.c

свои функции я реализую в файлах 1.c 1.h и т.д.

Как скомпоновать модуль со своими функциями?

Еще вопрос, какие хидеры я могу подключать в модулях? только из директории include/linux?

если можно объясните на простом примере

спасибо

Автор: null56 21.1.2011, 02:18
Цитата(slater @  20.1.2011,  18:37 Найти цитируемый пост)
скажите как в модуле использовать свои собственные функции

точно также как и в обычном си приложении, реализуешь в отдельном сишнике, прототив в хедер, хедер цепляешь к загрузочному сишнику

Цитата(slater @  20.1.2011,  18:37 Найти цитируемый пост)
если можно объясните на простом примере

http://www.crossplatform.ru/?q=node/338
раздел "2.7. Модули, состоящие из нескольких файлов"

Добавлено @ 02:24
если непонятно, то вот так кратенько
module.c - основной код модуля, где init и exit
my_lib.c - твои функции
понятное дело, нужен хедер my_lib.h, который будет подключаться в module.c
Makefile будет выглядеть следующим образом
Цитата

obj-m += my_kernel_module.o
my_kernel_module-objs := module.o my_lib.o

на выходе после отработки make, получишь модуль ядра my_kernel_module.ko
если чего напутал, то завтра поправлю или меня поправят, но вроде похоже  smile 

Автор: t_gran 21.1.2011, 11:31
http://www.infanata.com/2007/12/08/gcc.-polnoe-rukovodstvo.html
Глава 4, страница 77. Компиляция программ на языке С

Автор: slater 21.1.2011, 17:45
null56, t_gran, спасибо вам, ребята

разобрался

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

мне интересно, как например вести обмен данных с модулем и обычной программой?

нашел такие примеры: netlink sockets, через файл символьного устройства...но это сложно для меня сейчас

есть ли что то наподобие разделяемого буфера?

вообще, как попроще реализовать обмен данных между модулем и приложением?

Автор: Vicul 21.1.2011, 17:48
 Начни вот с этой книги

http://forum.vingrad.ru/forum/topic-154696/kw-linux-kernel-development.html


Автор: alexvs11 21.1.2011, 18:29
Цитата(slater @ 21.1.2011,  17:45)
мне интересно, как например вести обмен данных с модулем и обычной программой?

нашел такие примеры: netlink sockets, через файл символьного устройства...но это сложно для меня сейчас

есть ли что то наподобие разделяемого буфера?

вообще, как попроще реализовать обмен данных между модулем и приложением?

сокеты достаточно удобный вариант
но если чисто символьное устройство, то для взаимодействия достаточно read/write по адресу устройства в фс и ioctl соответственно командами

видел когда и чтение и запись реализовывали через ioctl - тоже возможно, одновременно понятно что за операция, плюс предоставляется буфер для чтения и записи

Автор: slater 21.1.2011, 18:36
alexvs11, спасибо

а как синхронизацию реализовать, есди модуль и приложение будут взаимодействовать через одно символьное устройство?

Автор: alexvs11 21.1.2011, 18:45
драйвер используется несколькими приложениями/потоками?
просто само по себе взаимодействие с драйвером происходит через приходящие в виде потоков callback'и и тут синхронизация соответственно никакая не нужна.

вообще были средства синхронизации, linux device drivers читали?

Автор: slater 21.1.2011, 19:06
нет, один пользовательский процесс взаимодействует с модулем

Автор: slater 21.1.2011, 21:06
вот нашел простой код реализации символьного устройства

как синхронизировать запись в символьное устройство между пользовательской программой и модулем?

Код

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
 
static int major; 
static char msg[200];

static ssize_t device_read(struct file *filp, char __user *buffer, size_t length, loff_t *offset)
{
    return simple_read_from_buffer(buffer, length, offset, msg, 200);
}


static ssize_t device_write(struct file *filp, const char __user *buff, size_t len, loff_t *off)
{
    if (len > 199)
        return -EINVAL;
    copy_from_user(msg, buff, len);
    msg[len] = '\0';
    return len;
}

static struct file_operations fops = {
    .read = device_read, 
    .write = device_write,
};

static int __init cdevexample_module_init(void)
{
    major = register_chrdev(0, "my_device", &fops);
    if (major < 0) {
          printk ("Registering the character device failed with %d\n", major);
          return major;
    }
    printk("cdev example: assigned major: %d\n", major);
    printk("create node with mknod /dev/cdev_example c %d 0\n", major);
    return 0;
}

static void __exit cdevexample_module_exit(void)
{
    unregister_chrdev(major, "my_device");
}  

module_init(cdevexample_module_init);
module_exit(cdevexample_module_exit);
MODULE_LICENSE("GPL");

Автор: xvr 24.1.2011, 15:11
Цитата(slater @  21.1.2011,  21:06 Найти цитируемый пост)
как синхронизировать запись в символьное устройство между пользовательской программой и модулем?
На каком уровне нужна синхронизация? Драйвер может усыпить программу, пишущую в его fd (да и читающую тоже). Драйвер может реализовать стандартный набор асинхронных операций (для пользовательской программы это будет select или poll)
В конце концов драйвер может синхронизироваться через mutex с приложением (на уровне ядра это будет ядерный объект futex) (кажется так)

Автор: slater 24.1.2011, 18:23
xvr, спасибо за совет smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)