copy_to_user

Hemanth Kumar hemwire at yahoo.co.in
Fri Dec 24 01:07:36 EST 2010



--- On Thu, 23/12/10, mukti jain <muktijn at gmail.com> wrote:

From: mukti jain <muktijn at gmail.com>
Subject: Re: copy_to_user
To: "Srinivas G." <srinivasg at esntechnologies.co.in>
Cc: "Dexter Haslem" <dexter.haslem at gmail.com>, "Hemanth Kumar" <hemwire at yahoo.co.in>, Kernelnewbies at kernelnewbies.org
Date: Thursday, 23 December, 2010, 11:07 AM



On Thu, Dec 23, 2010 at 10:05 AM, Srinivas G. <srinivasg at esntechnologies.co.in> wrote:

> On 12/22/2010 5:59 PM, Hemanth Kumar wrote:

> > Hi All,

> >

> >             I have small problem with copy_to_user in read

> function,below is my code,when I try to read from userspace I get

> segmentation fault,

> > Can any please point me where I went wrong,



I guess, you need to also implement open method in your driver. Because,

you are opening the device in your application. Could you try this?



Regards,

Srinivas G



> >

> >

> > #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,3,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_lock(&timer);

> >                               res =

> copy_to_user(buf,k,sizeof(short));

> >                               res =

> copy_to_user(buf,l,sizeof(short));

> >                               res =

> copy_to_user(buf,j,sizeof(short));

> >

> >                         /*    res =

> copy_to_user(buf,&x+4,sizeof(short));

> >                               res =

> copy_to_user(buf,&x+5,sizeof(short));

> >                               res =

> copy_to_user(buf,&x+6,sizeof(short));

> >                               res =

> copy_to_user(buf,&x+7,sizeof(short));

> >                               res =

> copy_to_user(buf,&x+8,sizeof(short));

> >                               res =

> copy_to_user(buf,&x+9,sizeof(short));

> >                          */

> >                   mutex_unlock(&timer);

> >

> >     return 20;

> >

> > }

> >

> >

> > 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);

> >

> >        printk("<1>  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");

> >

> >

> >

> >

> > my userspace App:

> >

> > #include<stdio.h>

> > #include<fcntl.h>

> > #include<stdlib.h>

> > #include<unistd.h>

> >

> > int main()

> > {

> >           int nbytes ;

> >           char n[20];

> >           short a = *((short *)&n[0]);

> >           short b = *((short *)&n[2]);

> >           short c = *((short *)&n[4]);

> >

> >          int     fd = open( "/dev/mytimer", O_RDONLY );

> >          if ( fd<  0 ) { perror( "/dev/mytimer" ); exit(1); }

> >

> > while ( 1 )

> >                  {

> >

> >                   nbytes = read( fd, n, 40 );

> >                  if ( nbytes<  0 ) break;

> >

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

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

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

> >

> >                  sleep(1);

> >                  fflush( stdout );

> >                  }

> > return 0;

> > }

> >

> >

> >

> >

> > Best regards,

> >

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




-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.kernelnewbies.org/pipermail/kernelnewbies/attachments/20101224/c69a2f0d/attachment-0001.html 


More information about the Kernelnewbies mailing list