LDD3中scull驱动,open,read,write中我的printk在/var/log/messages没输出

发布于 2022-10-15 07:30:10 字数 8696 浏览 22 评论 0

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******

复制代码请教高手 这是为什么呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

赤濁 2022-10-22 07:30:10

我自己写了个 小的测试程序 但是也是没输出。。。。非常郁闷

  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. }

复制代码

幸福%小乖 2022-10-22 07:30:10

非常关注

饮湿 2022-10-22 07:30:10

查看内核打印信息应该使用dmesg命令 ,你可以用tail看看尾部信息,另外可以看看内核输出信息的级别设置 echo n  /proc/sys/kernel/printk, 先 cat /proc/sys/kernel/printk 来查看当前级别,第一个就是。

赴月观长安 2022-10-22 07:30:10

也有可能printk的默认输出被改了,不是/var/log/messages。
把/var/log/目录下文件列出来看看。

回忆凄美了谁 2022-10-22 07:30:10

关注

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文