--- On Thu, 23/12/10, mukti jain <muktijn@gmail.com> wrote: From: mukti jain <muktijn@gmail.com> Subject: Re: copy_to_user To: "Srinivas G." <srinivasg@esntechnologies.co.in> Cc: "Dexter Haslem" <dexter.haslem@gmail.com>, "Hemanth Kumar" <hemwire@yahoo.co.in>, Kernelnewbies@kernelnewbies.org Date: Thursday, 23 December, 2010, 11:07 AM On Thu, Dec 23, 2010 at 10:05 AM, Srinivas G. <srinivasg@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, still have dont have success,Can any please share some idea, Regards,