changxy 发表于 2011-05-09 15:21

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******
请教高手 这是为什么呢?

changxy 发表于 2011-05-09 15:24

我自己写了个 小的测试程序 但是也是没输出。。。。非常郁闷#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);
}

mch_kot 发表于 2011-05-09 15:44

非常关注

dangbinghoo 发表于 2011-05-10 09:58

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

zyr-linux 发表于 2011-05-11 09:39

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

embeddedlwp 发表于 2011-05-16 15:34

关注
页: [1]
查看完整版本: LDD3中scull驱动,open,read,write中我的printk在/var/log/messages没输出