【求助】加载模块时遇到Operation not permitted的错误
我自己编写的一个虚拟字符设备驱动的代码,在Ubuntukylin13.10下运行正常,可是在RHEL6.4下编译通过,然后insmod的时候就提示Operation not permitted。我是用root登录的。求解。代码:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include "mychrdev.h"
#define CHR_MEM_SIZE 255
#define CHR_DEV_MAJOR 250
#define CHR_DEV_NAME "MyChrDev"
struct MyCharDev *mycd;
ssize_t read(struct file* fp, char __user *buff, size_t size, loff_t* loff)
{
int i;
if(mycd == NULL)
return -1;
for(i=0;i<size;i++)
{
if(Char_read(mycd, &buff) == -1)
return i;
}
return i;
}
ssize_t write(struct file* fp, const char __user *buff, size_t size
, loff_t* loff)
{
int i;
if(mycd == NULL)
return -1;
for(i=0;i<size;i++)
{
if(Char_write(mycd, buff) == -1)
return i;
}
return i;
}
int open(struct inode* node, struct file* fp)
{
fp->private_data = mycd;
return 0;
}
int release(struct inode* node, struct file* fp)
{
fp->private_data = NULL;
return 0;
}
struct file_operations fop
/**************************
={
.read = read,
.write = write,
.open = open,
.release = release,
.owner = THIS_MODULE
}
*************************/
;
int __init hello_init(void)
{
fop.read = read;
fop.write = write;
fop.open = open;
fop.release = release;
fop.owner = THIS_MODULE;
if((mycd = Char_init(CHR_MEM_SIZE)) == NULL)
{
printk(KERN_ALERT"Can\'t init chardev\n");
return -1;
}
if(0 > register_chrdev(CHR_DEV_MAJOR, CHR_DEV_NAME, &fop))
{
printk(KERN_ALERT"regist dev error\n");
return -1;
}
printk(KERN_ALERT"Hello world!\n");
return 0;
}
void __exit hello_exit(void)
{
Char_uninit(mycd);
unregister_chrdev(CHR_DEV_MAJOR, CHR_DEV_NAME);
printk(KERN_ALERT"Goodbye world!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Xiaocaihu");
MODULE_LICENSE("Dual BSD/GPL");
改成GPL试试 有可能是协议的问题,modprobe -fxxxx.ko强制加载 sudo insmod ./xxx.ko lz的问题解决了吗 回复 5# beyondfly
谢谢您的回复。这两天比较忙,没时间上论坛。
找到原因了。居然是设备号冲突。把register_chrdev的第一个参数改成0,让系统自动分配设备号,问题解决。 回复 2# lonelyair
谢谢您的回复。
问题已经解决了。居然是设备号冲突{:3_198:}
页:
[1]