内核模块一加载就死机 求高手帮忙看看问题,
#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马上死机,连入口处的打印语句都不输出,这是怎么回事
入口的printk应该会被打印的,检查一下当前printk的console level(可以用dmesg -n level来修改),看看当前的tty是不是console。
页:
[1]