Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> kernel module и свои библиотеки 
:(
    Опции темы
slater
Дата 20.1.2011, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 168
Регистрация: 20.11.2009

Репутация: -2
Всего: -4



приветствую,

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

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

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

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

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

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

спасибо

PM MAIL   Вверх
null56
Дата 21.1.2011, 02:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 4
Всего: 12



Цитата(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 

Это сообщение отредактировал(а) null56 - 21.1.2011, 02:24
PM MAIL   Вверх
t_gran
Дата 21.1.2011, 11:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: нет
Всего: 37





--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
slater
Дата 21.1.2011, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 168
Регистрация: 20.11.2009

Репутация: -2
Всего: -4



null56, t_gran, спасибо вам, ребята

разобрался

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

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

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

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

вообще, как попроще реализовать обмен данных между модулем и приложением?
PM MAIL   Вверх
Vicul
Дата 21.1.2011, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 169
Регистрация: 27.4.2009

Репутация: нет
Всего: нет



 Начни вот с этой книги

http://forum.vingrad.ru/forum/topic-154696...evelopment.html


PM MAIL   Вверх
alexvs11
Дата 21.1.2011, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: -1
Всего: 10



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

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

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

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

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

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

Это сообщение отредактировал(а) alexvs11 - 21.1.2011, 18:31
PM MAIL   Вверх
slater
Дата 21.1.2011, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 168
Регистрация: 20.11.2009

Репутация: -2
Всего: -4



alexvs11, спасибо

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

PM MAIL   Вверх
alexvs11
Дата 21.1.2011, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: -1
Всего: 10



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

вообще были средства синхронизации, linux device drivers читали?
PM MAIL   Вверх
slater
Дата 21.1.2011, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 168
Регистрация: 20.11.2009

Репутация: -2
Всего: -4



нет, один пользовательский процесс взаимодействует с модулем
PM MAIL   Вверх
slater
Дата 21.1.2011, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 168
Регистрация: 20.11.2009

Репутация: -2
Всего: -4



вот нашел простой код реализации символьного устройства

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

Код

#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");

PM MAIL   Вверх
xvr
Дата 24.1.2011, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 20
Всего: 223



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

PM MAIL   Вверх
slater
Дата 24.1.2011, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 168
Регистрация: 20.11.2009

Репутация: -2
Всего: -4



xvr, спасибо за совет smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0926 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.