2012/10/20 Rohan Puri <[email protected]> > > > 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 > Hi Roban: You are right, the p->vm_file is NULL cause the panic. But it's crazy to lead to the kernel panic for I just printk the NULL.
Ok, I know where I am wrong, thank you for your help, thank you everyone, thank you very much ! Fan
_______________________________________________ Kernelnewbies mailing list [email protected] http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
