Hi Nilesh & mukti, --- On Fri, 24/12/10, Nilesh Tayade <nilesh.tayade@xxxxxxxxxxxx> wrote: > From: Nilesh Tayade <nilesh.tayade@xxxxxxxxxxxx> > Subject: Re: copy_to_user > To: "Hemanth Kumar" <hemwire@xxxxxxxxxxx> > Cc: "Dexter Haslem" <dexter.haslem@xxxxxxxxx>, "mukti jain" <muktijn@xxxxxxxxx>, "Srinivas G." <srinivasg@xxxxxxxxxxxxxxxxxxxxx>, Kernelnewbies@xxxxxxxxxxxxxxxxx > 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@xxxxxxxxxxxxxxxxx > > http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies > > > -- > Thanks, > Nilesh > > -----Inline Attachment Follows----- > > _______________________________________________ > Kernelnewbies mailing list > Kernelnewbies@xxxxxxxxxxxxxxxxx > 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@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, _______________________________________________ Kernelnewbies mailing list Kernelnewbies@xxxxxxxxxxxxxxxxx http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies