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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Linux kernel добавить новый системный вызов 
:(
    Опции темы
rector
Дата 19.3.2010, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Прошу помощи в такой проблеме, потому как запнулся и не могу ничего придумать.
Есть некий модуль, работающий в ядре, есть некое приложение в userspace.
Для того, чтобы работать с модулем из userspace, создал несколько системных вызовов дополнительных, именно через них будут передаваться данные в модуль и выполняться управление оным.
И вот после создания sys_call запнулся на том, что код функции-обработчика вызова должен быть статически внесен в код ядра и не может быть скомпилирован в качестве модуля, выдает ошибку при линковке. А это не выход, так как при любом изменении необходимо будет пересобирать ядро

В общем вопрос в том как с помощью системного вызова можно организовать взаимодействие модуля ядра и подсистемы пользователя. Ну или как из функции-обработчика системного вызова передать данные в модуль.
PM MAIL   Вверх
MAKCim
Дата 19.3.2010, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



для того, чтобы организовать взаимодействие, абсолютно не надо писАть свой системный вызов
для этого есть procfs, sysfs, char устройства, netlink


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
rector
Дата 19.3.2010, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



про procfs, sysfs, пайпы и сокеты знаю, однако хотелось бы познакомиться с реализацией системных вызовов для модулей ядра. Или каким образом из ядра можно вызвать функцию, находящуюся в модуле ?

И, кстати, если необходимо предавать большой объём данных модулю, то какой из способов взаимодействия будет лучше?
PM MAIL   Вверх
MAKCim
Дата 20.3.2010, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(rector @  19.3.2010,  14:25 Найти цитируемый пост)
Или каким образом из ядра можно вызвать функцию, находящуюся в модуле ?

модуль - это тоже ядро
если функция определена в *.c модуле, который впоследствие станет модулем ядра, то образ ядра не будет собран, т. к. адреса всеъ символов должны быть к этому моменту известны


Цитата(rector @  19.3.2010,  14:25 Найти цитируемый пост)
И, кстати, если необходимо предавать большой объём данных модулю, то какой из способов взаимодействия будет лучше? 

char устройство и mmap


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
rector
Дата 25.3.2010, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Решил попробовать проделать эту операцию через сокеты netlink вроде как и удобно и то что надо именно мне, однако наткнулся на очередной косяк - в определённых моментах ядро зависает и я не могу выяснить из-за чего

Код

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <net/sock.h>
#include <linux/socket.h>
#include <linux/net.h>
#include <asm/types.h>
#include <linux/netlink.h>
#include <linux/skbuff.h>

DEFINE_MUTEX(mut);

#define KNETLINK_UNIT 17

static struct sock * knetlink_sk = NULL;
char data_string[] = "Hello Userspace! This is msg from Kernel";

int knetlink_process( struct sk_buff * skb, struct nlmsghdr *nlh )
{
    u8 * payload = NULL;
    int   payload_size;
    int   length;
    int   seq;
    pid_t pid;
//    struct sk_buff *rskb = NULL; //Сокет буферов для netlink

    pid = nlh->nlmsg_pid;
    length = nlh->nlmsg_len;
    seq = nlh->nlmsg_seq;
    printk("\nknetlink_process: nlmsg len %d type %d pid %d seq %d\n",
           length, nlh->nlmsg_type, pid, seq );
    /* обработка полезной нагрузки */
    payload_size = nlh->nlmsg_len - NLMSG_LENGTH(0);
    if ( payload_size > 0 ) {
        payload = NLMSG_DATA(nlh);
        printk("\nknetlink_process: Payload is %s ", payload);
    }
        // ответ пользовательскому приложению
    struct sk_buff *rskb = alloc_skb( nlh->nlmsg_len, GFP_KERNEL );
    if ( rskb ) {
        printk("\nknetlink_process: replies with the same socket_buffer\n");
        *rskb = *skb;
    } else {
        printk("WTF????!!!!");
/*        skb_put( rskb, length );
        kfree_skb( skb );        */
    }
    
    nlh = (struct nlmsghdr *)rskb->data;
    nlh->nlmsg_len = length;
    nlh->nlmsg_pid = pid;
    nlh->nlmsg_flags = 0;
    nlh->nlmsg_type = 2;
    nlh->nlmsg_seq   = seq++;
    payload = NLMSG_DATA( nlh );
 
    printk("\nknetlink_process: reply nlmsg len %d type %d pid %d\n",
           nlh->nlmsg_len, nlh->nlmsg_type, nlh->nlmsg_pid );
//    strlcpy(payload, data_string,nlh->nlmsg_len);
//    *(payload + strlen(data_string)) = '\0';
    NETLINK_CB(rskb).pid = 0; //from kernel
    netlink_unicast( knetlink_sk, rskb, pid, MSG_DONTWAIT );
    return 0;
}

void knetlink_input( struct sk_buff * skb)
{
    mutex_lock(&mut);
    printk("\nFunction %s() called", __FUNCTION__);

    netlink_rcv_skb(skb, &knetlink_process);

    mutex_unlock(&mut);
}

int knetlink_init( void ) //Управление передаётся при загрузке модуля
{
    if ( knetlink_sk != NULL ) {
        printk("knetlink_init: sock already present\n");
        return 1;
    }
    
    //struct sock *    netlink_kernel_create ---- это API для создания сокета из kernel_space
    knetlink_sk = netlink_kernel_create(&init_net, KNETLINK_UNIT, 0, knetlink_input, NULL, THIS_MODULE);
    
    if ( knetlink_sk == NULL ) {
        printk("knetlink_init: sock fail\n");
        return 1;
    }
// (void*)knetlink_sk
    printk("knetlink_init: sock %p\n", knetlink_sk->sk_socket);
    return 0;
}

void knetlink_exit( void )
{
    
    mutex_lock(&mut);
    if ( knetlink_sk != NULL ) {
        printk("\nknetlink_exit: release sock %p\n", knetlink_sk->sk_socket);
        kfree_skb( knetlink_sk);
    } else {
        printk("knetlink_exit: warning sock is NULL\n");
    }
    mutex_unlock(&mut);
}

module_init( knetlink_init );
module_exit( knetlink_exit );

MODULE_LICENSE("GPL");


в логах
Код

knetlink_process: reply nlmsg len 1040 type 2 pid 5772                                         
Mar 24 19:41:47 jamal kernel: [43646.512847] *pde = 00000000                                                                                
Mar 24 19:41:47 jamal kernel: [43646.512878] Modules linked in: qazx_driver radeon ttm drm_kms_helper drm i2c_algo_bit uinput binfmt_misc ppdev lp parport sco bridge stp bnep rfcomm l2cap crc16 bluetooth vboxnetflt vboxnetadp vboxdrv powernow_k8 cpufreq_userspace cpufreq_stats cpufreq_powersave cpufreq_conservative reiserfs fuse firewire_sbp2 loop snd_hda_codec_realtek snd_hda_intel snd_hda_codec snd_hwdep snd_pcm_oss uvcvideo snd_mixer_oss snd_pcm videodev v4l1_compat snd_seq_midi snd_rawmidi arc4 snd_seq_midi_event snd_seq ecb snd_timer snd_seq_device snd ath5k soundcore mac80211 ath i2c_piix4 snd_page_alloc cfg80211 serio_raw i2c_core asus_laptop evdev k8temp rfkill processor psmouse ac battery pcspkr ext3 jbd mbcache ide_cd_mod cdrom sd_mod crc_t10dif usbhid ata_generic hid ide_pci_generic ohci_hcd sdhci_pci sdhci ahci mmc_core libata atiixp ati_agp video output ricoh_mmc led_class firewire_ohci firewire_core crc_itu_t r8169 mii scsi_mod ehci_hcd button ide_core agpgart usbcore nls_base thermal fan thermal_                                                                                              
Mar 24 19:41:47 jamal kernel: sys [last unloaded: scsi_wait_scan]                                                                           
Mar 24 19:41:47 jamal kernel: [43646.513081]                                                                                                
Mar 24 19:41:47 jamal kernel: [43646.513092] Pid: 2918, comm: yakuake Not tainted (2.6.32-3-686 #1) F3Ka                                    
Mar 24 19:41:47 jamal kernel: [43646.513103] EIP: 0060:[<c10ae892>] EFLAGS: 00010002 CPU: 0                                                 
Mar 24 19:41:47 jamal kernel: [43646.513114] EIP is at __kmalloc_track_caller+0xb5/0x124                                                    
Mar 24 19:41:47 jamal kernel: [43646.513122] EAX: 00000000 EBX: 6972616d ECX: 00000800 EDX: c2804f5c                                        
Mar 24 19:41:47 jamal kernel: [43646.513129] ESI: c136c5ec EDI: 00000246 EBP: 000004d0 ESP: f2407d28                                        
Mar 24 19:41:47 jamal kernel: [43646.513137]  DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068                                                  
Mar 24 19:41:47 jamal kernel: [43646.513157]  f24de000 c11c12df 000004d0 00000470 00000800 f425cf00 00000320 000004d0                       
Mar 24 19:41:47 jamal kernel: [43646.513173] <0> c136bcc8 c11c5052 c12eb76e 00000000 f37f6800 00000000 f2407e4c 000004d0                    
Mar 24 19:41:47 jamal kernel: [43646.513189] <0> c11c12df ffffffff f2408000 00000000 00000314 f37f68dc 00000000 00000001                    
Mar 24 19:41:47 jamal kernel: [43646.513225]  [<c11c12df>] ? sock_alloc_send_pskb+0x8e/0x257                                                
Mar 24 19:41:47 jamal kernel: [43646.513238]  [<c11c5052>] ? __alloc_skb+0x4a/0x115                                                         
Mar 24 19:41:47 jamal kernel: [43646.513247]  [<c11c12df>] ? sock_alloc_send_pskb+0x8e/0x257                                                
Mar 24 19:41:47 jamal kernel: [43646.513263]  [<c108bd02>] ? get_page_from_freelist+0x33a/0x3c7                                             
Mar 24 19:41:47 jamal kernel: [43646.513273]  [<c11c14b4>] ? sock_alloc_send_skb+0xc/0xf                                                    
Mar 24 19:41:47 jamal kernel: [43646.513285]  [<c1221e8b>] ? unix_stream_sendmsg+0x12c/0x29c                                                
Mar 24 19:41:47 jamal kernel: [43646.513299]  [<c11be621>] ? __sock_sendmsg+0x43/0x4a                                                       
Mar 24 19:41:47 jamal kernel: [43646.513309]  [<c11be6cb>] ? sock_aio_write+0xa3/0xb0                                                       
Mar 24 19:41:47 jamal kernel: [43646.513324]  [<c1101c86>] ? security_task_to_inode+0xc/0xd                                                 
Mar 24 19:41:47 jamal kernel: [43646.513337]  [<c10b2c2d>] ? do_sync_readv_writev+0xb8/0xf9                                                 
Mar 24 19:41:47 jamal kernel: [43646.513353]  [<c1044412>] ? autoremove_wake_function+0x0/0x2d                                              
Mar 24 19:41:47 jamal kernel: [43646.513364]  [<c10b2ada>] ? rw_copy_check_uvector+0x59/0xc3                                                
Mar 24 19:41:47 jamal kernel: [43646.513375]  [<c1046698>] ? hrtimer_forward+0x10c/0x124                                                    
Mar 24 19:41:47 jamal kernel: [43646.513387]  [<c1101a4c>] ? security_file_permission+0xc/0xd                                               
Mar 24 19:41:47 jamal kernel: [43646.513396]  [<c10b32b0>] ? do_readv_writev+0x81/0xd6                                                      
Mar 24 19:41:47 jamal kernel: [43646.513407]  [<c11be628>] ? sock_aio_write+0x0/0xb0                                                        
Mar 24 19:41:47 jamal kernel: [43646.513421]  [<c106f2c5>] ? __rcu_process_callbacks+0x6c/0x227                                             
Mar 24 19:41:47 jamal kernel: [43646.513431]  [<c106f4b3>] ? rcu_process_callbacks+0x33/0x39                                                
Mar 24 19:41:47 jamal kernel: [43646.513441]  [<c10b333c>] ? vfs_writev+0x37/0x43                                                           
Mar 24 19:41:47 jamal kernel: [43646.513450]  [<c10b341d>] ? sys_writev+0x3c/0x91                                                           
Mar 24 19:41:47 jamal kernel: [43646.513463]  [<c10030fb>] ? sysenter_do_call+0x12/0x28                                                     
Mar 24 19:41:47 jamal kernel: [43646.513572] ---[ end trace 316eb84841ca08b7 ]---                                                           
Mar 24 19:41:47 jamal kernel: [43646.550269] *pde = 00000000



Зависание чаще всего происходит после выгрузки модуля, но не сразу, а через некоторое время, когда, например, пытаюсь запустить MC
Также был замечан случай когда зависало после ответа пользователю : knetlink_process: reply nlmsg len 1040 type 2 pid 5772.
PM MAIL   Вверх
MAKCim
Дата 27.3.2010, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



rector, 
зачем вы в knetlink_exit в kfree_skb передаете struct sock*?
kfree_skb освобождает пакет (aka struct sk_buff*)


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
rector
Дата 29.3.2010, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Хм...возможно тут таки вышел прогон.
В первоначальном варианте в knetlink_exit вместо kfree_skb было sock_release( knetlink_sk->sk_socket ); однако это особо ничего не меняет, ошибка может возникнуть как до выхода из модуля так и после. Возможно что то с указателями, но я в упор не вижу что именно может вызвать зависание, данные передаются нормально как в ядро так и из него.



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


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



все-таки если в вместо kfree_skb написать netlink_kernel_release(knetlink_sk)
ошибка есть?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Новичок



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

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



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

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

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


 




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


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

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