免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 48019 | 回复: 0
打印 上一主题 下一主题

想在内核里实现一个UDP接受模块,但是接受函数kernel_recvmsg报错,请大神帮忙分析... [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2019-03-06 09:36 |只看该作者 |倒序浏览
程序主体:

int myserver(void){

        struct socket *sock,*client_sock;
        struct sockaddr_in s_addr;
        unsigned short portnum=0x8888;
        int ret=0;

        memset(&s_addr,0,sizeof(s_addr));
        s_addr.sin_family=AF_INET;
        s_addr.sin_port=htons(portnum);
        s_addr.sin_addr.s_addr=htonl(INADDR_ANY);


        sock=(struct socket *)kmalloc(sizeof(struct socket),GFP_KERNEL);
        client_sock=(struct socket *)kmalloc(sizeof(struct socket),GFP_KERNEL);
                if(sock == NULL || client_sock ==NULL){
                        printk("sock  or client_sock malloc error\n");
                }
        /*create a socket*/
        ret=sock_create_kern(AF_INET, SOCK_DGRAM  ,0,&sock);

        if(ret){
                printk("server:socket_create error!\n");
        }
        printk("server:socket_create  UDP ok!\n");

        /*bind the socket*/
        ret=sock->ops->bind(sock,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
        if(ret<0){
                printk("server: bind error\n");
                return ret;
        }
        printk("server:bind ok!\n");
               
                  char *recvbuf=NULL;
        recvbuf=kmalloc(1024,GFP_KERNEL);
        if(recvbuf==NULL){
                printk("server: recvbuf kmalloc error!\n");
                return -1;
        }
        memset(recvbuf, 0, sizeof(recvbuf));

        /*receive message from client*/
        struct kvec vec;
                struct msghdr                msg;
        memset(&vec,0,sizeof(vec));
        memset(&msg,0,sizeof(msg));
        vec.iov_base=recvbuf;
        vec.iov_len=1024;
                printk("wait for recv mesg\n");
       
               ret=kernel_recvmsg(client_sock,&msg,&vec,1,1024,0); /*receive message*/
        printk("receive message:\n %s\n",recvbuf);


报错信息:
81.273932] server init:
[   81.273935] server:socket_create  UDP ok!
[   81.273937] server:bind ok!
[   81.273938] wait for recv mesg
[   81.273943] BUG: unable to handle kernel paging request at 9a70a100
[   81.273945] IP: [<9a70a100>] 0x9a70a100
[   81.273948] *pde = 00000000
[   81.273949] Oops: 0000 [#1] SMP
[   81.273951] last sysfs file: /sys/devices/pci0000:00/0000:00:07.1/host1/target1:0:0/1:0:0:0/evt_media_change
[   81.273952] Modules linked in: udp_kernel(+) nls_utf8 sunrpc fuse vmhgfs vsock ipv6 uinput snd_ens1371 gameport snd_rawmidi snd_ac97_codec ac97_bus snd_seq snd_seq_device snd_pcm snd_timer i2c_piix4 ppdev parport_pc parport i2c_core snd soundcore snd_page_alloc vmci vmware_balloon microcode mptspi vmxnet mptscsih mptbase scsi_transport_spi [last unloaded: mperf]
[   81.273962]
[   81.273964] Pid: 2540, comm: insmod Not tainted 2.6.35.6-45.fc14.i686 #1 440BX Desktop Reference Platform/VMware Virtual Platform
[   81.273966] EIP: 0060:[<9a70a100>] EFLAGS: 00010246 CPU: 0
[   81.273967] EIP is at 0x9a70a100
[   81.273967] EAX: f198fe50 EBX: c0452bc1 ECX: f198ff30 EDX: f1a0b3a0
[   81.273968] ESI: f1a0b3a0 EDI: 00000000 EBP: f198fe40 ESP: f198fe20
[   81.273969]  DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068
[   81.273971] Process insmod (pid: 2540, ti=f198e000 task=f1a2a5e0 task.ti=f198e000)
[   81.273972] Stack:
[   81.273972]  c070a6fa 00000400 00000000 f198fe50 f198ff30 f198fe50 f198e000 f7827274
[   81.273975] <0> f198ff04 c070a890 00000400 00000000 f198feb0 c08d549b 00000000 00000001
[   81.273977] <0> ffffffff 00000000 00000000 00000000 00000000 00000000 f1a2a5e0 00000000
[   81.273979] Call Trace:
[   81.273983]  [<c070a6fa>] ? __sock_recvmsg+0x63/0x6d
[   81.273985]  [<c070a890>] ? sock_recvmsg+0x9b/0xb0
[   81.273988]  [<c07a6fd5>] ? _raw_spin_unlock_irqrestore+0x13/0x15
[   81.273993]  [<c0439f8e>] ? release_console_sem+0x176/0x17d
[   81.273995]  [<c043a3e9>] ? vprintk+0x36f/0x3a4
[   81.273997]  [<c043e9f8>] ? local_bh_enable_ip+0xd/0xf
[   81.273999]  [<c07a712b>] ? _raw_spin_unlock_bh+0x12/0x14
[   81.274000]  [<c042a21b>] ? need_resched+0x19/0x23
[   81.274002]  [<c070a8d5>] ? kernel_recvmsg+0x30/0x42
[   81.274004]  [<f78271b8>] ? myserver+0x16a/0x192 [udp_kernel]
[   81.274006]  [<f78271e0>] ? server_init+0x0/0x19 [udp_kernel]
[   81.274008]  [<f78271f7>] ? server_init+0x17/0x19 [udp_kernel]
[   81.274010]  [<c0401246>] ? do_one_initcall+0x4f/0x139
[   81.274012]  [<c0451e51>] ? blocking_notifier_call_chain+0x11/0x13
[   81.274014]  [<c04621a4>] ? sys_init_module+0x7f/0x19b
[   81.274015]  [<c07a7374>] ? syscall_call+0x7/0xb
[   81.274016] Code:  Bad EIP value.
[   81.274017] EIP: [<9a70a100>] 0x9a70a100 SS:ESP 0068:f198fe20
[   81.274019] CR2: 000000009a70a100
[   81.274021] ---[ end trace 6c2f1dfbf50642e1 ]---


一旦注释掉kernel_recvmsg,就没有报错,感觉没有使用空指针


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP