免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1456 | 回复: 1

[内核入门] 内核模块一加载就死机 求高手帮忙看看问题, [复制链接]

论坛徽章:
0
发表于 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[128];

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马上死机,连入口处的打印语句都不输出,这是怎么回事

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2015-04-24 18:31 |显示全部楼层
入口的printk应该会被打印的,检查一下当前printk的console level(可以用dmesg -n level来修改),看看当前的tty是不是console。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP