- 论坛徽章:
- 0
|
小弟刚接触驱动,写了个简单的字符设备驱动,但是不知到为什么向这个驱动write数据的时候总是被killed,dmesg中总有这句BUG: unable to handle kernel paging request at 080485cd
代码如下:- MODULE_LICENSE("Dual BSD/GPL");
- static int memtest_major = 100;
- static int memtest_minior = 1;
- dev_t dev = 0;
- struct cdev c_dev;
- char *mem = NULL;
- static int memtest_open(struct inode *inode,struct file *filp);
- static int memtest_release(struct inode *inode,struct file *fil0p);
- static ssize_t memtest_read(struct file *filp,char __user *buff,size_t count,loff_t *offp);
- static ssize_t memtest_write(struct file *filp,char __user *buff,size_t count,loff_t *offp);
- struct file_operations memtest_fops = {
- .owner = THIS_MODULE,
- .read = memtest_read,
- .write = memtest_write,
- .open = memtest_open,
- .release = memtest_release,
- };
- static void memtest_setup_cdev(struct cdev *c_dev)
- {
- int err,devno = MKDEV(memtest_major,memtest_minior);
- cdev_init(c_dev,&memtest_fops);
- c_dev->owner = THIS_MODULE;
- c_dev->ops = &memtest_fops;
- err = cdev_add(c_dev,devno,1);
- if(err)
- {
- printk(KERN_NOTICE "Error %d adding scull",err);
- }
- }
- static int memtest_open(struct inode *inode,struct file *filp)
- {
- return 0;
- }
- static int memtest_release(struct inode *inode,struct file *filp)
- {
- return 0;
- }
- static ssize_t memtest_read(struct file *filp,char __user *buff,size_t count,loff_t *offp)
- {
- int num;
- num = copy_to_user(buff,mem,count);
- printk("read size is %d,read is %s\n",count,mem);
- return num;
- }
- static ssize_t memtest_write(struct file *filp,char __user *buff,size_t count,loff_t *offp)
- {
- int num;
- printk("write data form user");
- num = copy_from_user(buff,mem,10);
- printk("size is %d,write is %s\n",num,mem);
- return num;
- }
- static int memtest_init(void)
- {
- printk(KERN_ALERT "Hello memtest\n");
- //内核模块在加载前必须为这个模块注册设备号
- //可以有两种注册方法:1.动态 2.静态
- int resault;
- if(memtest_major)
- {
- dev = MKDEV(memtest_major,memtest_minior);
- resault = register_chrdev_region(dev,1,"memtset"); //静态
- }
- else
- {
- resault = alloc_chrdev_region(&dev,1,1,"memtest");
- memtest_major = MAJOR(dev);
- printk("memtest alloc major is %d\n",memtest_major);
- }
- memtest_setup_cdev(&c_dev);
- mem = (char*)kmalloc(100,GFP_KERNEL);
- memset(mem,0,100);
- // strncpy(mem,"asd",4);
- return 0;
- }
- static void memtest_exit(void)
- {
- printk(KERN_ALERT "exit memtest\n");
- //模块退出后一定要进行设备号的卸载
- kfree(mem);
- unregister_chrdev_region(dev,1);
- }
- module_init(memtest_init);
- module_exit(memtest_exit);
复制代码 就是说程序运行到copy_from_user接口就出了问题,但是我的read方法没有问题,就大牛帮忙解答 |
|