pluto1013 发表于 2015-04-24 11:28

内核模块一加载就死机 求高手帮忙看看问题,

#include <linux/module.h>

#include <linux/kernel.h>

#include <linux/init.h>

#include <linux/workqueue.h>

#include <linux/in.h>

#include <linux/inet.h>

#include <linux/socket.h>

#include <net/sock.h>

#include <linux/net.h>

static char data;

struct fsg_common{

       

      struct socket *encrypt_sock;

      struct msghdr encrypt_msg;

      struct sockaddr_in encrypt_servaddr;

};



static struct fsg_common a;

static int encrypt_socket_init(struct fsg_common *common)

{

        struct socket *sock;

        int ret;

        char *dst_addr = "127.0.0.1";

        /* init servaddr */

        memset(&common->encrypt_servaddr, 0, sizeof(common->encrypt_servaddr));

        common->encrypt_servaddr.sin_family = AF_INET;

        common->encrypt_servaddr.sin_port = htons(9999);

       

        in4_pton(dst_addr, strlen(dst_addr), (u8*)&common->encrypt_servaddr.sin_addr, '\0', NULL);

       

        common->encrypt_msg.msg_name = &common->encrypt_servaddr;

        common->encrypt_msg.msg_namelen = sizeof(common->encrypt_servaddr);

      printk("2222222\n");

        ret = sock_create_kern(AF_INET, SOCK_STREAM, 0, &sock);

        if (ret < 0 || NULL == sock) {

                printk( "init encrypt board socket fail\n");

                return ret;

        }

       printk("333333\n");

        common->encrypt_sock = sock;



//        common->data = kmalloc(sizeof(common->data), GFP_KERNEL);

//        if (NULL == common->data)

//                return -1;



        return 0;

}



static void encrypt_socket_close(struct fsg_common *common)

{

        sock_release(common->encrypt_sock);

        common->encrypt_sock = NULL;

}



static int encrypt_data(struct fsg_common *common)

{

      int conn_fd;

      int num;

        struct socket *sock = common->encrypt_sock;

   //        struct data_pkt *pkt = common->encrypt_pkt;

        struct sockaddr *pservaddr = (struct sockaddr *)&common->encrypt_servaddr;

    //        int servlen = sizeof(common->encrypt_servaddr);



//        if (unlikely(NULL == sock || NULL == pkt || NULL == pservaddr))

//                return -1;



//        memset(pkt, 0, sizeof(data));

//        unsigned int copied_size = 0;

        struct kvec vec;

        struct msghdr msg;

        memset(&msg, 0, sizeof(msg));

      printk("444444\n");

      conn_fd=kernel_connect(sock,pservaddr,sizeof(struct sockaddr_in),0);

        //while (copied_size < size) {

        //        pkt->res=0xffffffff;

           //        pkt->file_offset = offset;

        //        memcpy(pkt->data, data + copied_size, SECTOR_SIZE);



        //        vec.iov_base = (void *)pkt;

        //        vec.iov_len = sizeof(struct data_pkt);

        //        ret = kernel_sendmsg(sock, &common->encrypt_msg, &vec, 1, sizeof(struct data_pkt));

        //        printk("send data(return :%d):\n", ret);



      printk("55555555\n");

        num = kernel_recvmsg((struct socket*)conn_fd, &msg, &vec, 1, sizeof(data), 0);

                printk("recv data(return :%d):\n", num);

        //        memcpy(data+copied_size, pkt->data, 512);

        //        copied_size += 512;

          

      printk("6666666\n");

        return 0;

}



static int socket_init(void)

{

       

         printk(KERN_ALERT "Starting...\n");

       memset(&a,0,sizeof(struct fsg_common));

         printk(KERN_ALERT "000000000\n");

        encrypt_socket_init(&a);

         printk(KERN_ALERT "11111111\n");

       encrypt_data(&a);

         return 0;

}

static void socket_exit(void)

{

printk(KERN_ALERT "7777777\n");

        encrypt_socket_close(&a);

}

module_init(socket_init);

module_exit(socket_exit);



想在内核空间实现与服务器的网络通信,这个模块编译可以通过,一旦insmod马上死机,连入口处的打印语句都不输出,这是怎么回事

nswcfd 发表于 2015-04-24 18:31

入口的printk应该会被打印的,检查一下当前printk的console level(可以用dmesg -n level来修改),看看当前的tty是不是console。
页: [1]
查看完整版本: 内核模块一加载就死机 求高手帮忙看看问题,