Решил попробовать проделать эту операцию через сокеты 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. |