Chinaunix

标题: 【求助】加载模块时遇到Operation not permitted的错误 [打印本页]

作者: 小菜虎    时间: 2014-05-12 01:21
标题: 【求助】加载模块时遇到Operation not permitted的错误
我自己编写的一个虚拟字符设备驱动的代码,在Ubuntukylin13.10下运行正常,可是在RHEL6.4下编译通过,然后insmod的时候就提示Operation not permitted。我是用root登录的。求解。
代码:
MyCharDev.tar.bz2 (58.6 KB, 下载次数: 7)

  1. #include <linux/init.h>
  2. #include <linux/module.h>
  3. #include <linux/fs.h>
  4. #include "mychrdev.h"

  5. #define CHR_MEM_SIZE 255
  6. #define CHR_DEV_MAJOR 250
  7. #define CHR_DEV_NAME "MyChrDev"
  8. struct MyCharDev *mycd;

  9. ssize_t read(struct file* fp, char __user *buff, size_t size, loff_t* loff)
  10. {
  11.         int i;
  12.         if(mycd == NULL)
  13.                 return -1;
  14.         for(i=0;i<size;i++)
  15.         {
  16.                 if(Char_read(mycd, &buff[i]) == -1)
  17.                         return i;
  18.         }
  19.         return i;
  20. }

  21. ssize_t write(struct file* fp, const char __user *buff, size_t size
  22.         , loff_t* loff)
  23. {
  24.         int i;
  25.         if(mycd == NULL)
  26.                 return -1;
  27.         for(i=0;i<size;i++)
  28.         {
  29.                 if(Char_write(mycd, buff[i]) == -1)
  30.                         return i;
  31.         }
  32.         return i;
  33. }

  34. int open(struct inode* node, struct file* fp)
  35. {
  36.         fp->private_data = mycd;
  37.         return 0;
  38. }

  39. int release(struct inode* node, struct file* fp)
  40. {
  41.         fp->private_data = NULL;
  42.         return 0;
  43. }

  44. struct file_operations fop
  45. /**************************
  46. ={
  47.         .read = read,
  48.         .write = write,
  49.         .open = open,
  50.         .release = release,
  51.         .owner = THIS_MODULE
  52. }
  53. *************************/
  54. ;

  55. int __init hello_init(void)
  56. {
  57.         fop.read = read;
  58.         fop.write = write;
  59.         fop.open = open;
  60.         fop.release = release;
  61.         fop.owner = THIS_MODULE;
  62.         if((mycd = Char_init(CHR_MEM_SIZE)) == NULL)
  63.         {
  64.                 printk(KERN_ALERT"Can\'t init chardev\n");
  65.                 return -1;
  66.         }
  67.         if(0 > register_chrdev(CHR_DEV_MAJOR, CHR_DEV_NAME, &fop))
  68.         {
  69.                 printk(KERN_ALERT"regist dev error\n");
  70.                 return -1;
  71.         }
  72.         printk(KERN_ALERT"Hello world!\n");
  73.         return 0;
  74. }
  75. void __exit hello_exit(void)
  76. {
  77.         Char_uninit(mycd);
  78.         unregister_chrdev(CHR_DEV_MAJOR, CHR_DEV_NAME);
  79.         printk(KERN_ALERT"Goodbye world!\n");
  80. }

  81. module_init(hello_init);
  82. module_exit(hello_exit);

  83. MODULE_LICENSE("Dual BSD/GPL");
  84. MODULE_AUTHOR("Xiaocaihu");
复制代码



作者: lonelyair    时间: 2014-05-12 09:05
MODULE_LICENSE("Dual BSD/GPL");
改成GPL试试
作者: beyondfly    时间: 2014-05-13 08:34
有可能是协议的问题,modprobe -f  xxxx.ko  强制加载
作者: potato916305    时间: 2014-05-13 13:13
sudo insmod ./xxx.ko
作者: beyondfly    时间: 2014-05-13 22:41
lz的问题解决了吗
作者: 小菜虎    时间: 2014-05-13 23:21
回复 5# beyondfly


谢谢您的回复。这两天比较忙,没时间上论坛。   
找到原因了。居然是设备号冲突。把register_chrdev的第一个参数改成0,让系统自动分配设备号,问题解决。
作者: 小菜虎    时间: 2014-05-13 23:22
回复 2# lonelyair


    谢谢您的回复。
问题已经解决了。居然是设备号冲突{:3_198:}




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2