免费注册 查看新帖 |

Chinaunix

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

LDD3中scull驱动,open,read,write中我的printk在/var/log/messages没输出 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-05-09 15:21 |只看该作者 |倒序浏览
ldd3中的scull驱动,我按照书上的例子写了scull驱动。init_module和exit_module都可以打印printk信息,但是我想看看open,write,read,三个函数是否执行,想让他们打印出一些标志,但是在dmesg中没有看到信息。

OPEN 函数
  1. static int scull_open (struct inode *inode,struct file *filp)
  2. {        printk(KERN_ALERT "*****OPEN*******");
  3.         struct scull_dev *dev;
  4.         dev = container_of(inode->i_cdev,struct scull_dev,cdev);
  5.         filp->private_data = dev;                                        /*for other methods*/
  6.         /*
  7.          *
  8.          *
  9.          * */

  10.         printk(KERN_ALERT "******OPEN*********\nscull_dev-----size > %ld,quantum > %d,qset > %d \n",dev->size,dev->quantum,dev->qset);
  11.         printk(KERN_ALERT "******OPEN*********\nscull_dev-----size > %ld,quantum > %d,qset > %d \n",dev->size,dev->quantum,dev->qset);

  12.         return 0;

  13. }
复制代码
READ 函数
  1. static int scull_read(struct file *filp,char __user *buf,size_t count,loff_t *f_pos)
  2. {
  3.         int quantum,qset;
  4.         struct scull_dev *dev;
  5.         dev = filp->private_data;
  6.          quantum = dev->quantum;
  7.          qset        = dev->qset;
  8.         struct scull_qset *dptr;
  9.         int retval = -ENOMEM;
  10.         unsigned int p_pos,q_pos;
  11.         unsigned int item,rest;
  12.         unsigned int size_q;
  13.         size_q = quantum*qset;
  14.         /*if(down_interruptible(&dev->sem))
  15.          *retrun -ERESTARTSYS;
  16.          *
  17.          * */
  18.         printk(KERN_ALERT "****READ***********");  //这里应该向/var/log/messages 输出信息

  19.         if(*f_pos >dev->size)
  20.                 goto out;
  21.         if(*f_pos+count>dev->size)
  22.         {
  23.                 count =dev->size-*f_pos;
  24.         }
  25.         item =(long) *f_pos / size_q;
  26.         rest = (long)*f_pos % size_q;
  27.         p_pos=rest/quantum; q_pos=rest%quantum;
  28.         dptr = scull_follow(dev,item);
  29.         if(dptr == NULL || !dptr->data ||!dptr->data[q_pos])
  30.         goto out;
  31.         if(count>quantum-q_pos)
  32.                 count = quantum-q_pos;
  33.         if(copy_to_user(buf,dptr->data[p_pos]+q_pos,count))
  34.         {
  35.                 retval = -EFAULT;
  36.                 goto out;
  37.         }
  38.         *f_pos+=count;
  39.         retval = count;
  40. out:
  41.         return retval;

  42. }
复制代码
WRITE函数
  1. static int scull_write(struct file *filp,const char __user *buf,size_t count,loff_t *f_pos )
  2. {        printk(KERN_ALERT "******write*********");     //这里应该向/var/log/messages 输出信息
  3.         struct scull_dev *dev = filp->private_data;
  4.         struct scull_qset *dptr;
  5.         int retval = -ENOMEM;
  6.         unsigned int item,rest,p_pos,q_pos;
  7.         unsigned int size_f;
  8.         unsigned int quantum =dev->quantum;
  9.         unsigned int qset =dev->qset;
  10.         size_f = quantum*qset;

  11.         item = (long)*f_pos/size_f;
  12.         rest = (long)*f_pos%size_f;
  13.         p_pos= rest/quantum;
  14.         q_pos= rest%quantum;

  15.         dptr = scull_follow(dev,item);
  16.         if(dptr == NULL)
  17.                 goto out;
  18.         if(!dptr->data )
  19.         {
  20.                 dptr->data = kmalloc(qset*sizeof(int *),GFP_KERNEL);
  21.         if(!dptr->data)
  22.                 goto out;
  23.         memset(dptr->data,0,sizeof(int *));
  24.         }
  25.         if(!dptr->data[p_pos])
  26.         {
  27.                 dptr->data[p_pos] = kmalloc(quantum,GFP_KERNEL);
  28.         if(!dptr->data[p_pos])
  29.                 goto out;
  30.                 memset(dptr->data[p_pos],0,quantum);
  31.         }
  32.         if(count>quantum-q_pos)
  33.                 count = quantum-q_pos;
  34.         if(copy_from_user(dptr->data[p_pos]+q_pos,buf,count))
  35.         {
  36.                 retval = -EFAULT;
  37.                 goto out;
  38.         }
  39.         *f_pos+=count;
  40.         retval = count;
  41.         /*update the size*/
  42.         printk(KERN_ALERT "******OPEN*********\nscull_dev-----size > %ld,quantum > %d,qset > %d \n",dev->size,dev->quantum,dev->qset);   //这里应该向/var/log/messages 输出信息

  43.         if(dev->size<*f_pos)
  44.                 dev->size = *f_pos;
  45. out:
  46.                 printk(KERN_ALERT "******OPEN*********\nscull_dev-----size > %ld,quantum > %d,qset > %d \n",dev->size,dev->quantum,dev->qset);   //这里应该向/var/log/messages 输出信息

  47.         /*printk(KERN_INFO "",);*/
  48.         return        retval;
  49. }
复制代码
我使用ls>/dev/scull,然后cat /dev/scull 能看到 scull里面的信息。却没有打印出printk当中的信息。
我认为ls >/dev/scull 后会调用open 函数和write函数 dmesg应该输出 *******WRITE**********  **********OPEN**********但是没有
我在加载这个驱动和卸载这个驱动 调用 scull_init_module  scull_cleanup_module这两个函数 会打印printk函数中的内容

DMESG 输出 (hello 为加载时候printk的输出 exit 为卸载的时候的输出)
  1. [16776.692097] ********SETUP***************
  2. [16776.692102] ******HELLO******
  3. [16799.118846] ****CLEANUP**********
  4. [16799.118849] ********TRIM************
  5. [16799.118852] ******EXIT**********
  6. [16828.888928] ********SETUP***************
  7. [16828.888933] ******HELLO******
复制代码
请教高手 这是为什么呢?

论坛徽章:
0
2 [报告]
发表于 2011-05-09 15:24 |只看该作者
我自己写了个 小的测试程序 但是也是没输出。。。。非常郁闷
  1. #include   <stdio.h>
  2. #include   <fcntl.h>
  3. #include   <sys/ioctl.h>
  4. #include   <sys/types.h>

  5. /*   device   path   */
  6. char   path[]   =   "/dev/scull";
  7. char   buf[6] = "123456";
  8. char   buf1[6];
  9. int   main()
  10. {
  11. int   f   =   open(path,O_RDWR);
  12. if   (f   ==   -1)
  13. {
  14. printf( "device   open   error!\n ");
  15. return   1;
  16. }

  17. printf( "Input   a   string   to   write   device   \n ");
  18. write(f,   buf,   6); /*   device   wirte   */

  19. printf( "Read   the   string   from   device...\n ");
  20. read(f,   buf1,   6); /*   device   read   */
  21. printf( "%s\n ",   buf1);

  22. close(f);
  23. }
复制代码

论坛徽章:
0
3 [报告]
发表于 2011-05-09 15:44 |只看该作者
非常关注

论坛徽章:
0
4 [报告]
发表于 2011-05-10 09:58 |只看该作者
查看内核打印信息应该使用dmesg命令 ,你可以用tail看看尾部信息,另外可以看看内核输出信息的级别设置 echo n  /proc/sys/kernel/printk, 先 cat /proc/sys/kernel/printk 来查看当前级别,第一个就是。

论坛徽章:
0
5 [报告]
发表于 2011-05-11 09:39 |只看该作者
也有可能printk的默认输出被改了,不是/var/log/messages。
把/var/log/目录下文件列出来看看。

论坛徽章:
16
2015亚冠之吉达阿赫利
日期:2015-08-17 11:21:462015年迎新春徽章
日期:2015-03-04 09:58:11酉鸡
日期:2014-12-07 09:06:19水瓶座
日期:2014-11-04 14:23:29天秤座
日期:2014-03-02 08:57:52双鱼座
日期:2014-02-22 13:07:56午马
日期:2014-02-14 11:08:18双鱼座
日期:2014-02-13 11:09:37卯兔
日期:2014-02-06 15:10:34子鼠
日期:2014-01-20 14:48:19戌狗
日期:2013-12-19 09:37:46射手座
日期:2013-12-19 09:33:47
6 [报告]
发表于 2011-05-16 15:34 |只看该作者
关注
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP