copy_to_user

Hemanth Kumar hemwire at yahoo.co.in
Wed Dec 22 19:59:09 EST 2010


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,


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







More information about the Kernelnewbies mailing list