copy_to_user

Hemanth Kumar hemwire at yahoo.co.in
Fri Dec 24 04:26:26 EST 2010


Hi Nilesh & mukti,



--- On Fri, 24/12/10, Nilesh Tayade <nilesh.tayade at netscout.com> wrote:

> From: Nilesh Tayade <nilesh.tayade at netscout.com>
> Subject: Re: copy_to_user
> To: "Hemanth Kumar" <hemwire at yahoo.co.in>
> Cc: "Dexter Haslem" <dexter.haslem at gmail.com>, "mukti jain" <muktijn at gmail.com>, "Srinivas G." <srinivasg at esntechnologies.co.in>, Kernelnewbies at kernelnewbies.org
> Date: Friday, 24 December, 2010, 1:29 PM
> Hi,
> 
> On Fri, 2010-12-24 at 11:37 +0530, Hemanth Kumar wrote:
> 
> >             
>    
> >             
>    > >
> >             
>    
> >         The mutex
> initialization is missing. 
> >         Adding 
> mutex_init(&timer); in the driver init will make it
> >         work.
> >         
> >         Thanks,
> >         Mukti
> >         
> >         
> >         Hi All,
> >         
> >         
>    Can anybody please share some idea ,why I
> am getting
> >         segmentation
> fault & kernel oops,
> >         
> >         Regards,
> > 
> 
> I tried it, and it seems adding mutex_init() works as Mukti
> mentioned. I
> did get a kernel oops before (but no segfault). After
> adding
> mutex_init() there is no oops/segfault. The code, however,
> is reading
> the garbage, that needs to be fixed.
> 
> pun-nilesht-dt0:/home/nilesh/Documents/handson # !mknod
> mknod /dev/mytimer c 300 0
> 
> pun-nilesht-dt0:/home/nilesh/Documents # dmesg 
> [ 2193.684735] Register timer maj = 300
> 
> pun-nilesht-dt0:/home/nilesh/Documents/handson # ./my_app.o
> 
>  a = -30048 
>  b = -23975 
>  c = 32582 
> ...
> 
> See the attachments in case something is missing the code.
> 
> > _______________________________________________
> > Kernelnewbies mailing list
> > Kernelnewbies at kernelnewbies.org
> > http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
> 
> 
> -- 
> Thanks,
> Nilesh
> 
> -----Inline Attachment Follows-----
> 
> _______________________________________________
> Kernelnewbies mailing list
> Kernelnewbies at kernelnewbies.org
> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
> 



       I tried to do that,But it is reading the last element in the array(x[2] = 43), I have modified a bit but still not able read for x[0],below is the code,

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/types.h>
#include <linux/proc_fs.h>
#include <linux/fs.h>
#include <linux/kdev_t.h>
#include <linux/jiffies.h>
#include <linux/cdev.h>
#include <asm/uaccess.h>
#include <linux/mutex.h>

struct mutex timer;
static struct cdev my_cdev;
dev_t devn;
int maj = 300;
int min = 0;
int count = 1;
char modname[] = "mytimer";
short x[10] = {1,2,43,4,5,6,7,8,9,10};




ssize_t my_read(struct file *file,char *buf,size_t count,loff_t *pos) {

        unsigned long res;
        void *k = (void *)x;
        void *l = (void *)(x+1);
        void *j = (void *)(x+2);
 mutex_unlock(&timer);

        return 6;

}


static struct file_operations my_fops = {
        .owner = THIS_MODULE,
        .read = my_read,

};


static int __init my_init(void){
        int ret;
        devn = MKDEV(maj,min);

        ret = register_chrdev_region(devn,count,modname);

        cdev_init(&my_cdev,&my_fops);
        cdev_add(&my_cdev,devn,count);
        mutex_init(&timer);

        printk(KERN_CRIT "Register timer maj = %d\n",maj);




        return 0;
}


static void __exit my_exit(void){

        cdev_del(&my_cdev);
        unregister_chrdev_region(devn,count);
        printk("<1> Bye Bye \n");

}


module_init(my_init);
module_exit(my_exit);
MODULE_LICENSE("Dual BSD/GPL");


user space app

#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
        int nbytes ;
        char n[20];
         int     fd = open( "/dev/mytimer", O_RDONLY );
        if ( fd < 0 ) { perror( "/dev/mytimer" ); exit(1); }

        while ( 1 )
        {

                nbytes = read( fd, n, 20);
                if ( nbytes < 0 ) break;

        short a = *((short *)&n[0]);
        short b = *((short *)&n[2]);
        short c = *((short *)&n[4]);


                printf( "\r a = %d \n ", a);
                printf("\r b = %d \n",b);
                printf("\r c = %d \n",c);

                sleep(1);
                fflush( stdout );
        }
        return 0;
}



[root at Praval userspace]# ./my_app 
 a = 43 
 b = 0 
 c = -26552 
 a = 43 
 b = 0 
 c = -26552 
 a = 43 
 b = 0 
 c = -26552 
 a = 43 
 b = 0 
 c = -26552 
 a = 43 
 b = 0 
 c = -26552 


I think i still miss something,





More information about the Kernelnewbies mailing list