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)
goto out;
if(count>quantum-q_pos)
count = quantum-q_pos;
if(copy_to_user(buf,dptr->data+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)
{
dptr->data = kmalloc(quantum,GFP_KERNEL);
if(!dptr->data)
goto out;
memset(dptr->data,0,quantum);
}
if(count>quantum-q_pos)
count = quantum-q_pos;
if(copy_from_user(dptr->data+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_modulescull_cleanup_module这两个函数 会打印printk函数中的内容
DMESG 输出 (hello 为加载时候printk的输出 exit 为卸载的时候的输出) ********SETUP***************
******HELLO******
****CLEANUP**********
********TRIM************
******EXIT**********
********SETUP***************
******HELLO******
请教高手 这是为什么呢? 我自己写了个 小的测试程序 但是也是没输出。。。。非常郁闷#include <stdio.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
/* device path */
char path[] = "/dev/scull";
char buf = "123456";
char buf1;
int main()
{
int f = open(path,O_RDWR);
if (f == -1)
{
printf( "device open error!\n ");
return 1;
}
printf( "Input a string to write device \n ");
write(f, buf, 6); /* device wirte */
printf( "Read the string from device...\n ");
read(f, buf1, 6); /* device read */
printf( "%s\n ", buf1);
close(f);
} 非常关注 查看内核打印信息应该使用dmesg命令 ,你可以用tail看看尾部信息,另外可以看看内核输出信息的级别设置 echo n/proc/sys/kernel/printk, 先 cat /proc/sys/kernel/printk 来查看当前级别,第一个就是。 也有可能printk的默认输出被改了,不是/var/log/messages。
把/var/log/目录下文件列出来看看。 关注
页:
[1]