[问题][问题]请教!设备驱动加载模块时出现错误如何解决?

软件和网站开发以及相关技术探讨
回复
sophiazhang
帖子: 5
注册时间: 2008-06-10 13:49

[问题][问题]请教!设备驱动加载模块时出现错误如何解决?

#1

帖子 sophiazhang » 2008-06-10 14:16

ubuntu 8.04 内核版本2.6.24-18

makefile文件如下 :

obj-m := char_dev.o
KERNELBUILD :=/lib/modules/2.6.24-18-generic/build
default:
make -C $(KERNELBUILD) M=$(shell pwd) modules
clean:
rm -rf *.o *.ko *.mod.c .*.cmd .tmp_versions

char_dev.c文件如下 :

#ifndef MODULE

#define MODULE

#endif

/*必要的头文件*/

#include <linux/module.h>

#include <linux/kernel.h> /* printk() */

#include <linux/init.h>

#include <asm/timex.h>


/* 字符设备所需*/

#include <linux/fs.h>

#include <linux/slab.h>

#include <asm/system.h>

#include <linux/proc_fs.h>

#include <linux/fcntl.h>

#include <asm/uaccess.h>

#include <asm/segment.h>



#define status 0



/* 设备定义,定义设备的名字为mychardev*/

#define DEVICE_NAME "mychardev"



/* 该设备最大信息长度为80*/

#define BUF_LEN 80



/* 设备否打开?利用它防止当前进程使用同一设备*/

static int open_count = 0;



/* 对设备里面的内容进行初始化 */

char content[BUF_LEN]="Welcome to use this device.\n";



/* 进程读取的信息的指针 */

char *content_Ptr;



/* 当进程试图打开设备文件时调用该函数,参数指出文件的地址以及具体打开方式*/

static int device_open(struct inode *inode, struct file *file)

{

/* 两个进程不得同时对同一设备操作,设备被打开后不得被再次打开*/

if (open_count)
{
/*打开操作失败的返回信息*/

return -EBUSY;
}

/*记录设备被打开的次数,加1*/

open_count++;

/*设备里的指针指向具体的数组,该数组的内容就是该设备里的内容*/

content_Ptr = content;

/*成功打开操作的返回信息*/

return status;

}



/* 当一个进程要关闭这个设备时,该函数被调用,这个调用不允许失败,参数与打开设备的参数相同*/

static int device_release(struct inode *inode, struct file *file)

{
/*记录设备被打开的次数,减1*/

open_count --;


return 0;

}



/* 当一进程要从已打开的设备文件读数据时该函数被调用,file指具体的被打开的设备,buffer是获得填充数据的缓冲区,length是缓冲区中的数据长度 */

static ssize_t device_read(struct file *file, char *buffer,size_t length,loff_t *fops)

{
/* 用于记录写入到缓冲区buffer中的确切字节数*/

int num = 0;
/*指向设备的存放数据的数组*/

char *ptr=content_Ptr;
/*记录设备里的字符的个数,初始化为0*/
int len=0;



/* 如果已位于设备内部信息的尾部,返回0*/

if (*content_Ptr == 0)
{
return 0;
}
len=0;


/*计算设备里字符串的长度*/

while (*(ptr++))

{ len++;}

/*如果要读出的字符串的长度大于设备里字符串的长度,则将真正的读出长度设为设备的字符串的长度*/
if (length<len)

{
len=length;
}
/* 准确地把数据送到缓冲区buffer*/

copy_to_user(buffer,content_Ptr,len);



num=len;


/* 返回读取的实际字节数据 */

return num;

}
/* 当进程向这设备写时调用本函数*/

static ssize_t device_write(struct file *file,const char *buffer, size_t length,loff_t *fops)

{
printk(" write\n");


/* 用于记录写入到设备中的确切字符数*/

int len ;

/*如果用户的参数大于设备里数组的最大长度,则仅写满数组即可,否则写入的长度就是用户传进来的参数*/

if (length>80)

{
len=80;
}

else

{
len=length;
}
/*将用户的数据写入设备*/

copy_from_user(content_Ptr,buffer,len);
/*返回真正写入到设备里的字符的长度*/

return len;

}



/* 模块定义 */



/* 设备的主设备号*/

static int Major;



/* 当进程要对创建的设备进行某些操作时,这个结构存放了要调用的函数的入口

这个结构有系统设备表的指针指向。NULL 表示未实现该功能。*/



struct file_operations Fops = {

read: device_read,

write: device_write,

open: device_open,

release:device_release

};



/* 初始化模块--注册字符设备 */

int init_module()

{

/* 注册字符设备(至少一次) */

Major = register_chrdev(0, DEVICE_NAME, &Fops);



/* 负值意味出错 */

if (Major < 0)
{

printk ("Sorry, registering the character device failed with %d\n", Major);
return Major;

}



printk ("Registeration is a success. The major device number is %d.\n", Major);

printk ("If you want to talk to the device driver, you'll have to\n");

printk ("create a device file. We suggest you use:\n");

printk ("mknod <name> c %d 0\n", Major);



return 0;

}



/* 清除模块 --从 /proc 中注销合适的文件*/

void cleanup_module()

{

int ret;



/* 注销设备 */

ret = unregister_chrdev(Major, DEVICE_NAME); //162

/* 如果出错,报告错误*/

if (ret < 0)
{

printk("Error in module_unregister_chrdev: %d\n", ret);

}


MODULE_LICENSE("GPL"); //169
}


在终端输入 sudo make后 出现如下错误:

make -C /lib/modules/2.6.24-18-generic/build M=/home/sophiazhang/桌面/2 modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.24-18-generic'
CC [M] /home/sophiazhang/桌面/2/char_dev.o
/home/sophiazhang/桌面/2/char_dev.c: 在函数‘device_write’中:
/home/sophiazhang/桌面/2/char_dev.c:103: 警告: ISO C90 不允许混合使用声明和代码
/home/sophiazhang/桌面/2/char_dev.c: 在函数‘cleanup_module’中:
/home/sophiazhang/桌面/2/char_dev.c:162: 错误: void 值未如预期地被忽略
/home/sophiazhang/桌面/2/char_dev.c:169: 警告: ISO C90 不允许混合使用声明和代码
make[2]: *** [/home/sophiazhang/桌面/2/char_dev.o] 错误 1
make[1]: *** [_module_/home/sophiazhang/桌面/2] 错误 2
make[1]: Leaving directory `/usr/src/linux-headers-2.6.24-18-generic'
make: *** [default] 错误 2

请哪位高手指教下如何解决阿 ??????

103,169警告已解决,如何解决162呢?谢谢!


急,谢谢各位阿
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

#2

帖子 bones7456 » 2008-06-10 14:27

copy_from_user 这函数比较可疑.
关注我的blog: ε==3
头像
zongzw
帖子: 94
注册时间: 2008-03-31 16:12

#3

帖子 zongzw » 2008-06-19 18:02

解决:void 引领的内存不具备任何结构,甚至不能用来访问其内部。也不可以使用*(buffer+i)来访问。
只有将其强制类型转换为具体的结构指针才可以访问,如char*之后,就可以使用buffer或者*(buffer+i)来访问了。

我想问你的是,你的警告怎么解决的?
li32768
帖子: 2
注册时间: 2009-03-18 17:30

Re: [问题][问题]请教!设备驱动加载模块时出现错误如何解决?

#4

帖子 li32768 » 2009-03-19 13:47

偶也想知道这个问题是如何解决的了
回复