LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 942|回复: 3

一个scull造成的内核崩溃

[复制链接]
发表于 2006-11-12 16:05:47 | 显示全部楼层 |阅读模式
这是我的代码,加上cdev_add和cdev_del之后,rmmod这个模块,会造成内核崩溃。
这应该是一个经典的例子,每个学内核人的必经之路。 我却卡在这里了。
大侠们帮忙看看,谢谢;

include <linux/module.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/cdev.h>

dev_t scull_dev_num = 0;

int major = 0;
int minor = 0;

int cdev_registered = 0;

struct scull_mem{
        void *data;
        struct scull_mem *next;
};

struct scull_dev{
        struct cdev cdev;
        unsigned long size;
        struct scull_mem *data;
} *dev;

struct file_operations scull_ops={
        .owner=THIS_MODULE,
};

void cleanup(void)
{
        if(cdev_registered)
        {
                cdev_del(&dev->cdev);
                cdev_registered = 0;
        }

        if(dev != NULL)
        {
                kfree(dev);
                dev = NULL;
        }
        if (scull_dev_num != 0)
        {
                unregister_chrdev_region(scull_dev_num, 1);
                scull_dev_num = 0;
        }
}

static int __init scull_init(void)
{
        int retval = 0;
        if ((retval = alloc_chrdev_region(&scull_dev_num, 0, 1, "scull")) < 0)
        {
                printk("<1>alloc_chrdev_region < 0\n");
                cleanup();
                return 0;
        }
        major = MAJOR(scull_dev_num);
        minor = MINOR(scull_dev_num);

        if ((dev = kmalloc(sizeof(struct scull_dev), GFP_KERNEL)) == NULL)
        {
                printk("<1>kmalloc failed \n");
                cleanup();
                return -ENOMEM;
        }

        dev->size = 0;
        dev->data = NULL;

        cdev_init(&dev->cdev, &scull_ops);
        dev->cdev.owner = THIS_MODULE;
        dev->cdev.ops = &scull_ops;
        if((retval = cdev_add(&dev->cdev, scull_dev_num, 1)) < 0)
        {
                printk("<1>cdev_add failed\n");
                cleanup();
                return retval;
        }
        cdev_registered = 1;
        return 0;
}

static void __exit scull_exit(void)
{
        cleanup();
        printk(KERN_ALERT "Scull cleanuped!\n");
}

module_init(scull_init);
module_exit(scull_exit);

MODULE_LICENSE("GPL");
发表于 2006-11-13 20:08:59 | 显示全部楼层
if ((dev = kmalloc(sizeof(struct scull_dev), GFP_KERNEL)) == NULL)
{
...
}

memset(dev, 0, sizeof(struct scull_dev));
回复 支持 反对

使用道具 举报

发表于 2006-11-14 23:04:16 | 显示全部楼层
dev在分配内存之前使用了,cleanup里的dev有可能是个野指针
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-21 22:34:48 | 显示全部楼层
谢谢,2楼正解,我没有初始化,产生了内核崩溃
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表