On Sat, Oct 20, 2012 at 7:35 AM, Fan Yang <[email protected]> wrote:
> > > 2012/10/19 Rohan Puri <[email protected]> > >> >> >> On Fri, Oct 19, 2012 at 7:38 PM, Anuz Pratap Singh Tomar < >> [email protected]> wrote: >> >>> >>> >>> On Fri, Oct 19, 2012 at 2:46 PM, Fan Yang <[email protected]> wrote: >>> >>>> >>>> >>>> 2012/10/19 Arun KS <[email protected]> >>>> > >>>> > Hi Fan, >>>> > >>>> > On Fri, Oct 19, 2012 at 6:50 PM, Fan Yang <[email protected]> >>>> wrote: >>>> >> >>>> >> HI ALL: >>>> >> I just run a module on my machine, but it can't work. When the >>>> module run the kernel will painc. I don't know where is wrong. This is my >>>> code: >>>> >> >>>> >> 1 #include<linux/module.h> >>>> >> 2 #include<linux/kernel.h> >>>> >> 3 #include<linux/init.h> >>>> >> 4 #include<linux/sched.h> >>>> >> 5 >>>> >> 6 int input = 1; >>>> >> 7 module_param (input, int, S_IRUGO); >>>> >> 8 >>>> >> 9 static int __init printvma_init (void) >>>> >> 10 { >>>> >> 11 struct vm_area_struct *p, *start; >>>> >> 12 int i; >>>> >> 13 struct task_struct *thread; >>>> >>>> >> 14 >>>> >> 15 thread = current; >>>> >> 16 >>>> >> 17 while (1) >>>> >> 18 { >>>> >> 19 if (thread->pid == input) >>>> >> 20 break; >>>> >> 21 thread = list_entry (thread->tasks.next, struct >>>> task_struct, tasks); >>>> >> 22 } >>>> >> 23 p = thread->mm->mmap; >>>> >> 24 >>>> >> 25 do{ >>>> >> 26 printk ("%lx\t%lx\t%s\n", p->vm_start,\ >>>> >> 27 p->vm_end, p->vm_file->f_path.dentry->d_iname); >>>> >> 28 p = p->vm_next; >>>> >> 29 }while (p != NULL); >>>> >> 30 >>>> >> 31 printk ("vm_file address is:%d\tf_path address is:%d\ >>>> >> 32 \tname is:%s",& p->vm_file->f_path,\ >>>> >> 33 p->vm_file->f_path.dentry->d_iname); >>>> >> 34 >>>> >> 35 printk ("info from the kernel space:%s\n", thread->comm); >>>> >> 36 return 0; >>>> >> 37 } >>>> >> 38 >>>> >> 39 static void __exit printvma_exit (void) >>>> >> 40 { >>>> >> 41 printk ("the module will leave the kernel space..\n"); >>>> >> 42 } >>>> >> 43 >>>> >> 44 module_init (printvma_init); >>>> >> 45 module_exit (printvma_exit); >>>> >> 46 MODULE_LICENSE ("GPL"); >>>> >> >>>> >> >>>> >> what's wrong? >>>> > >>>> > >>>> > It would be good if you paste your crash log here. >>>> > >>>> > Thanks, >>>> > Arun >>>> >> >>>> >> >>>> >> thanks >>>> >> >>>> >> _______________________________________________ >>>> >> Kernelnewbies mailing list >>>> >> [email protected] >>>> >> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies >>>> >> >>>> > >>>> The module run in a virtual machine, I can't control the machine when >>>> it crashed, so I just got a picture when the kernel panic. >>>> >>>> you can run the module under uml, it wont be hard to copy the crash >>> log from terminal in uml. >>> >>>> >>>> >>>> >>>> >>>> Thanks >>>> Fan >>>> >>>> _______________________________________________ >>>> Kernelnewbies mailing list >>>> [email protected] >>>> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies >>>> >>>> >>> >>> _______________________________________________ >>> Kernelnewbies mailing list >>> [email protected] >>> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies >>> >>> >> Hi Fan, >> >> See the issue is thread->mm is NULL in your case. The simplest way to >> test this in your case is by the following : - >> >> Put these statements after the while loop >> >> if(!thread->mm) { printk("thread->mm is NULL\n"); return 0; } >> >> After this compile and load the module, you will see this statement >> printed in dmesg command output. >> >> >> General programming practice : - >> >> Always make checks for NULL pointer in your code, before dereferencing >> your code. >> >> - Rohan >> > Hi Rohan, > > I don't think the thread->mm is NULL, because when I print the several > vm_area_struct of the thread->mm it work well, but if put the code in the > loop to print all the vma, it crashed. > > Thinks > Fan > Hi Fan, Yes Fan, you are right, its NOT thread->mm NULL, but p->vm_file is NULL, to verify put the following as the fist statement in do {}while; loop if(!p->vm_file) { printk("p->vm_file NULL\n"); return 0;} This message gets printed to kernel log buffer. Also, you still need to NULL check pointer before dereferencing them. Let me know, whats the result on your system. - Rohan
_______________________________________________ Kernelnewbies mailing list [email protected] http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
