啦啦啦啦啦 发表于 2019-03-06 09:36

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

程序主体:

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("sockor 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_createUDP 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_createUDP 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
[   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
[   81.274006][<f78271e0>] ? server_init+0x0/0x19
[   81.274008][<f78271f7>] ? server_init+0x17/0x19
[   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,就没有报错,感觉没有使用空指针


页: [1]
查看完整版本: 想在内核里实现一个UDP接受模块,但是接受函数kernel_recvmsg报错,请大神帮忙分析...