免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1780 | 回复: 2
打印 上一主题 下一主题

关于字符设备驱动write问题 急。。。。。。。。。。。。。。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-27 11:24 |只看该作者 |倒序浏览
  小弟刚接触驱动,写了个简单的字符设备驱动,但是不知到为什么向这个驱动write数据的时候总是被killed,dmesg中总有这句BUG: unable to handle kernel paging request at 080485cd
代码如下:
  1. MODULE_LICENSE("Dual BSD/GPL");
  2. static int memtest_major = 100;
  3. static int memtest_minior = 1;

  4. dev_t dev = 0;
  5. struct cdev c_dev;
  6. char *mem = NULL;
  7. static int memtest_open(struct inode *inode,struct file *filp);

  8. static int memtest_release(struct inode *inode,struct file *fil0p);

  9. static ssize_t memtest_read(struct file *filp,char __user *buff,size_t count,loff_t *offp);

  10. static ssize_t memtest_write(struct file *filp,char __user *buff,size_t count,loff_t *offp);

  11. struct file_operations memtest_fops = {
  12.         .owner = THIS_MODULE,
  13.         .read = memtest_read,
  14.         .write = memtest_write,
  15.         .open = memtest_open,
  16.         .release = memtest_release,
  17. };


  18. static void memtest_setup_cdev(struct cdev *c_dev)
  19. {
  20.         int err,devno = MKDEV(memtest_major,memtest_minior);
  21.         cdev_init(c_dev,&memtest_fops);
  22.         c_dev->owner = THIS_MODULE;
  23.         c_dev->ops = &memtest_fops;
  24.         err = cdev_add(c_dev,devno,1);
  25.         if(err)
  26.         {
  27.                 printk(KERN_NOTICE "Error %d adding scull",err);
  28.         }

  29. }

  30. static int memtest_open(struct inode *inode,struct file *filp)
  31. {
  32.         return 0;
  33. }

  34. static int memtest_release(struct inode *inode,struct file *filp)
  35. {
  36.         return 0;
  37. }

  38. static ssize_t memtest_read(struct file *filp,char __user *buff,size_t count,loff_t *offp)
  39. {
  40.         int num;
  41.         num = copy_to_user(buff,mem,count);
  42.         printk("read size is %d,read is %s\n",count,mem);
  43.         return num;
  44. }

  45. static ssize_t memtest_write(struct file *filp,char __user *buff,size_t count,loff_t *offp)
  46. {
  47.         int num;
  48.         printk("write data form user");
  49.         num = copy_from_user(buff,mem,10);
  50.         printk("size is %d,write is %s\n",num,mem);
  51.         return num;
  52. }

  53. static int memtest_init(void)
  54. {
  55.         printk(KERN_ALERT "Hello memtest\n");
  56.         //内核模块在加载前必须为这个模块注册设备号
  57.         //可以有两种注册方法:1.动态 2.静态
  58.         int resault;
  59.         if(memtest_major)
  60.         {
  61.                 dev = MKDEV(memtest_major,memtest_minior);
  62.                 resault = register_chrdev_region(dev,1,"memtset");                //静态
  63.         }
  64.         else
  65.         {
  66.                 resault = alloc_chrdev_region(&dev,1,1,"memtest");
  67.                 memtest_major = MAJOR(dev);
  68.                 printk("memtest alloc major is %d\n",memtest_major);
  69.         }
  70.         memtest_setup_cdev(&c_dev);
  71.         mem = (char*)kmalloc(100,GFP_KERNEL);
  72.         memset(mem,0,100);
  73. //        strncpy(mem,"asd",4);
  74.         return 0;
  75. }

  76. static void  memtest_exit(void)
  77. {
  78.         printk(KERN_ALERT "exit memtest\n");
  79.         //模块退出后一定要进行设备号的卸载
  80.         kfree(mem);
  81.         unregister_chrdev_region(dev,1);
  82. }

  83. module_init(memtest_init);
  84. module_exit(memtest_exit);
复制代码
就是说程序运行到copy_from_user接口就出了问题,但是我的read方法没有问题,就大牛帮忙解答

论坛徽章:
0
2 [报告]
发表于 2012-05-27 16:53 |只看该作者
怎么就没有牛人帮帮小弟呢?

论坛徽章:
0
3 [报告]
发表于 2012-05-27 19:20 |只看该作者

copy_from_user原型如下:
unsigned long copy_from_user (void * to, const void __user * from, unsigned long n);

你的目的地址 与源地址 是不是 弄反了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP