论坛风格切换切换到宽版
  • 1316阅读
  • 6回复

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

上一主题 下一主题
离线hackerstudy.
 
发帖
2066
C币
-193385
威望
377
贡献值
1
银元
-2
铜钱
4603
人人网人气币
0
只看楼主 倒序阅读 使用道具 楼主  发表于: 2009-05-01
ubunt.u 8.04 内核版本2.6.24-18<性病>

makefile文.件如下 : .

obj-m        :=    .    char_de.v.o.
KE.RNELBUILD        :=/lib/modu.les/2.6.24-18-generic/build学习
default:
                make        -C        $(KER.NELBUILD)        M.=$(shell        pwd)    .    modules--------------彩票
clean:
    .            rm        -rf        *.o     .   *.ko        *.mod.c  .      .*.cmd        .tmp_versions           鲜花

char_dev.c文件如下 .:电影

#.ifndef MODULE .

#define. MODULE              电子

#endif

/*必要的头文件*/

#include <li.nux./module.h>               乙肝

#include <linux/k.e.rnel.h>   /* printk() */ (        游戏          )

#inc.lude <linux/init.h> 服务器

#include <asm/t.imex.h> --------------彩票


/* 字符设备所需*/

#.include <linux/f.s.h>                  女人

#includ.e <linux/slab.h>            女人

#i.nclude <asm/system.h> 服务器

#include <l..inux/proc_fs.h> --- 印刷

#include. <linux/fcntl.h>              汽车

#i.nclude <asm/uaccess.h> 虚拟主机

#in.clude <asm/segment.h> (        游戏          )



#de.fine status 0 投资



/* 设备.定义,定义设备的名字为mychard.ev*/ .

#define DEVICE_NAME. "mychardev". .



/* 该设备.最大信息长度为80*/ (        游戏          )

#defin.e BUF_LEN 80 <性病>



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

s.t.atic int open_count = 0; 服务器



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

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



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

char .*content_Ptr;     外汇



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

static int device_open(struct inode *inode, st.ruct file *fi.le) [成人用品]

{    

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

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

  .              return .-EBUSY; 电影
        }

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

        open_coun.t++; [成人用品]

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

        content_P.tr =. content; 服务器

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

        .return status; (广告)

}



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

static int device_release(str.uct inode *inode, struct file *file). .

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

        open_count. --; 域名


        return 0.; --- 印刷

}



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

s.tatic ssize_t device_read(struct file *file, char *buffer,size_t .length,loff_t *fops.)     .

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

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

        char *ptr.=co.ntent_Ptr; --------------彩票
  .      /*记录设备里的字符的个.数,初始化为0*/             电子
       . int len=0;            杀毒



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

        if (*cont.ent_.Ptr == 0)     外汇
        {
     .           ret.urn 0; .
        }
        len=0;


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

        while (*(ptr.++))     美容

        {        len++.;}学习

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

        {        .    健康
    .            len=l.ength;.
        }
      .    /* 准确地把数据送到缓冲区buffe.r*/          .

        copy_to_user(buffer,cont.ent_Ptr,le.n);.



        n.um=len;[成人用品]


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

        return num;.            建材

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

static ssize_t device_write(struct file *file,const char *buffer, s.ize_t length,lof.f_t .*fops) .

{
        printk(" writ.e\n".);           建材

        
. .      /* 用于记录写入到设备中的确切字符数*/ 虚拟主机

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

.       if (length>80) (        游戏          )

        {
.               len=80;           女人
        }

        else

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

        copy._from_us.er(content_Ptr,buffer,len);     美容
        /*返回真正写入.到设备里的字符的.长度*/    健康

        return len; ..

}



/* 模块定义 */



/* 设备的主设备号*/

static int Ma.jor; .



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

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



struct .file_operations. Fops = { <性病>

        read: .  device_re.ad, .

.  write: device_write, --- 印刷

        open.: device_ope.n, 学习

        releas.e:device_relea.se  --- 印刷

};



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

int init_module() .<性病>

{

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

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



         /* 负.值意味出错 */ .

        if (Major .< 0)     外汇
        {

                printk (".Sorry, registering the chara.cter. device failed with %d\n", Major);            建材
        ..        return Major;     外汇

        }



       . printk ("Registerat.ion is a success. T.he major device number is %d.\n", Major);              汽车

        printk .("If you w.a.nt to talk to the device driver, you'll have to\n"); (广告)

      .  printk ("creat.e 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); .投资

        /* 如果出错,报告错.误*/               电子

        if (ret <. 0).
        .{                      乙肝

    printk("Error in modu.le_unregister_c.hrdev: %d\n", ret); [成人用品]

        }


    .    MODULE_LICENSE("GPL").; 外贸
}


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

make        -.C        /lib/modules/2.6.24-18-generic/build        M=/home/sop.hiazhang./桌面/2        modules.
make[1].: Entering directory `/usr/src/linux.-headers-2.6.24-18-generic'虚拟主机
  CC [M]  ./hom.e/sophiazhang/桌面/2/char_dev.o          婚庆
/home/sophiazhang/桌面/2/char_dev.c: 在函数‘.de.vice_write’中:教育
/home/sophiazhang/桌面/2/char_dev.c:10.3: 警告: I.SO C90 不允许混合使用声明和代码             电子
/home/sophiazhang/桌.面/2/char_dev..c: 在函数‘cleanup_module’中:教育
/home/sophiazhang/桌面/2/char_dev.c:.162: 错误: void .值未如预期地被忽略学习
/home/sophia.zhang/桌面/2/char_dev.c:169: 警告: .ISO C90 不允许混合使用声明和代码            杀毒
make[2]: *** [/home/sophiazhang/桌面/2/char_dev.o.] 错误 .1服务器
mak.e[1.]: *** [_module_/home/sophiazhang/桌面/2] 错误 2[成人用品]
make[1]: Leaving directory `/usr/s.rc/linux-headers-2.6.24-18-g.eneric'外贸
make: *** [default] .错误 2投资

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

评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
离线52niming.
发帖
2223
C币
-235325
威望
349
贡献值
1
银元
-3
铜钱
4874
人人网人气币
0
只看该作者 沙发  发表于: 2010-04-14
把声明放前边去

      printk(" write\n");

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

        int len ;
        


把int len;放到printk前边。

离线5136456.
发帖
2120
C币
-235562
威望
415
贡献值
1
银元
-1
铜钱
4813
人人网人气币
0
只看该作者 板凳  发表于: 2010-04-14
MODULE_LICENSE("GPL");    
放到函数外边

离线43627962.
发帖
2025
C币
-139515
威望
367
贡献值
1
银元
-1
铜钱
4490
人人网人气币
0
只看该作者 地板  发表于: 2010-04-14
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: 在函数‘cleanup_module’中:
/home/sophiazhang/桌面/2/char_dev.c:165: 错误: void 值未如预期地被忽略
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


放到外面了 ,169的警告解决了 ,那个 165的错误怎么办阿?

离线samual142.
发帖
2122
C币
-60236
威望
412
贡献值
1
银元
-1
铜钱
4815
人人网人气币
0
只看该作者 4楼 发表于: 2010-04-14
unregister_chrdev(Major, DEVICE_NAME);
这个函数没有返回值

离线dengxin.
发帖
1917
C币
-263183
威望
354
贡献值
1
银元
-4
铜钱
4219
人人网人气币
0
只看该作者 5楼 发表于: 2010-04-14
编译成功,还没有加载

建议lz看看基础知识再来实践

离线lele521.
发帖
2033
C币
-60461
威望
412
贡献值
1
银元
-1
铜钱
4633
人人网人气币
0
只看该作者 6楼 发表于: 2010-04-14
还有,下次抄代码时候认真点。!
快速回复
限100 字节
批量上传需要先选择文件,再选择上传
 
上一个 下一个