LDD3中scull驱动,open,read,write中我的printk在/var/log/messages没输出
ldd3中的scull驱动,我按照书上的例子写了scull驱动。init_module和exit_module都可以打印printk信息,但是我想看看open,write,read,三个函数是否执行,想让他们打印出一些标志,但是在dmesg中没有看到信息。
OPEN 函数
- static int scull_open (struct inode *inode,struct file *filp)
- { printk(KERN_ALERT "*****OPEN*******");
- struct scull_dev *dev;
- dev = container_of(inode->i_cdev,struct scull_dev,cdev);
- filp->private_data = dev; /*for other methods*/
- /*
- *
- *
- * */
- printk(KERN_ALERT "******OPEN*********\nscull_dev-----size > %ld,quantum > %d,qset > %d \n",dev->size,dev->quantum,dev->qset);
- printk(KERN_ALERT "******OPEN*********\nscull_dev-----size > %ld,quantum > %d,qset > %d \n",dev->size,dev->quantum,dev->qset);
- return 0;
- }
复制代码READ 函数
- static int scull_read(struct file *filp,char __user *buf,size_t count,loff_t *f_pos)
- {
- int quantum,qset;
- struct scull_dev *dev;
- dev = filp->private_data;
- quantum = dev->quantum;
- qset = dev->qset;
- struct scull_qset *dptr;
- int retval = -ENOMEM;
- unsigned int p_pos,q_pos;
- unsigned int item,rest;
- unsigned int size_q;
- size_q = quantum*qset;
- /*if(down_interruptible(&dev->sem))
- *retrun -ERESTARTSYS;
- *
- * */
- printk(KERN_ALERT "****READ***********"); //这里应该向/var/log/messages 输出信息
- if(*f_pos >dev->size)
- goto out;
- if(*f_pos+count>dev->size)
- {
- count =dev->size-*f_pos;
- }
- item =(long) *f_pos / size_q;
- rest = (long)*f_pos % size_q;
- p_pos=rest/quantum; q_pos=rest%quantum;
- dptr = scull_follow(dev,item);
- if(dptr == NULL || !dptr->data ||!dptr->data[q_pos])
- goto out;
- if(count>quantum-q_pos)
- count = quantum-q_pos;
- if(copy_to_user(buf,dptr->data[p_pos]+q_pos,count))
- {
- retval = -EFAULT;
- goto out;
- }
- *f_pos+=count;
- retval = count;
- out:
- return retval;
- }
复制代码WRITE函数
- static int scull_write(struct file *filp,const char __user *buf,size_t count,loff_t *f_pos )
- { printk(KERN_ALERT "******write*********"); //这里应该向/var/log/messages 输出信息
- struct scull_dev *dev = filp->private_data;
- struct scull_qset *dptr;
- int retval = -ENOMEM;
- unsigned int item,rest,p_pos,q_pos;
- unsigned int size_f;
- unsigned int quantum =dev->quantum;
- unsigned int qset =dev->qset;
- size_f = quantum*qset;
- item = (long)*f_pos/size_f;
- rest = (long)*f_pos%size_f;
- p_pos= rest/quantum;
- q_pos= rest%quantum;
- dptr = scull_follow(dev,item);
- if(dptr == NULL)
- goto out;
- if(!dptr->data )
- {
- dptr->data = kmalloc(qset*sizeof(int *),GFP_KERNEL);
- if(!dptr->data)
- goto out;
- memset(dptr->data,0,sizeof(int *));
- }
- if(!dptr->data[p_pos])
- {
- dptr->data[p_pos] = kmalloc(quantum,GFP_KERNEL);
- if(!dptr->data[p_pos])
- goto out;
- memset(dptr->data[p_pos],0,quantum);
- }
- if(count>quantum-q_pos)
- count = quantum-q_pos;
- if(copy_from_user(dptr->data[p_pos]+q_pos,buf,count))
- {
- retval = -EFAULT;
- goto out;
- }
- *f_pos+=count;
- retval = count;
- /*update the size*/
- printk(KERN_ALERT "******OPEN*********\nscull_dev-----size > %ld,quantum > %d,qset > %d \n",dev->size,dev->quantum,dev->qset); //这里应该向/var/log/messages 输出信息
- if(dev->size<*f_pos)
- dev->size = *f_pos;
- out:
- printk(KERN_ALERT "******OPEN*********\nscull_dev-----size > %ld,quantum > %d,qset > %d \n",dev->size,dev->quantum,dev->qset); //这里应该向/var/log/messages 输出信息
- /*printk(KERN_INFO "",);*/
- return retval;
- }
复制代码我使用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 为卸载的时候的输出)
- [16776.692097] ********SETUP***************
- [16776.692102] ******HELLO******
- [16799.118846] ****CLEANUP**********
- [16799.118849] ********TRIM************
- [16799.118852] ******EXIT**********
- [16828.888928] ********SETUP***************
- [16828.888933] ******HELLO******
复制代码请教高手 这是为什么呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
我自己写了个 小的测试程序 但是也是没输出。。。。非常郁闷
复制代码
非常关注
查看内核打印信息应该使用dmesg命令 ,你可以用tail看看尾部信息,另外可以看看内核输出信息的级别设置 echo n /proc/sys/kernel/printk, 先 cat /proc/sys/kernel/printk 来查看当前级别,第一个就是。
也有可能printk的默认输出被改了,不是/var/log/messages。
把/var/log/目录下文件列出来看看。
关注