Really a very informative and interesting thread.
Thank you all for your efforts.

Rgds,
Adil


On 3/16/08, Peter Teoh <[EMAIL PROTECTED]> wrote:
>
> Thank you everyone for the time spent in the analysis.   I understand
> better now.
>
> I was confused, as I thought the module_free() below actually free up
> the entire module.   But as you and Johannes and etc have highlighted,
> module_free() only free up the INIT section:
>
>        mutex_lock(&module_mutex);
>        /* Drop initial reference. */
>        module_put(mod);
>        unwind_remove_table(mod->unwind_info, 1);
>        module_free(mod, mod->module_init);
>        mod->module_init = NULL;
>        mod->init_size = 0;
>        mod->init_text_size = 0;
>        mutex_unlock(&module_mutex);
>
> Apologized for the confusion!!!!   Thanks :-).
>
> On Sun, Mar 16, 2008 at 1:22 AM, Thomas Petazzoni
> <[EMAIL PROTECTED]> wrote:
> > Hi,
> >
> >  Le Sun, 16 Mar 2008 00:57:00 +0800,
> >  "Peter Teoh" <[EMAIL PROTECTED]> a écrit :
> >
> >
> >  > may be....where is it??   i will continue the search....thank you for
> >  > the feedback.
> >
> >  Everything starts in sys_init_module()
> >   http://lxr.free-electrons.com/source/kernel/module.c#2090
> >
> >  It starts by loading the module using load_module()
> >   http://lxr.free-electrons.com/source/kernel/module.c#1650
> >
> >  Which at some points, calls layout_sections(), which computes
> >  mod->init_size:
> >
> >  1487         for (m = 0; m < ARRAY_SIZE(masks); ++m) {
> >  1488                 for (i = 0; i < hdr->e_shnum; ++i) {
> >  1489                         Elf_Shdr *s = &sechdrs[i];
> >  1490
> >  1491                         if ((s->sh_flags & masks[m][0]) !=
> masks[m][0]
> >  1492                             || (s->sh_flags & masks[m][1])
> >  1493                             || s->sh_entsize != ~0UL
> >  1494                             || strncmp(secstrings + s->sh_name,
> >  1495                                        ".init", 5) != 0)
> >  1496                                 continue;
> >  1497                         s->sh_entsize =
> (get_offset(&mod->init_size, s)
> >  1498                                          | INIT_OFFSET_MASK);
> >  1499                         DEBUGP("\t%s\n", secstrings + s->sh_name);
> >  1500                 }
> >  1501                 if (m == 0)
> >  1502                         mod->init_text_size = mod->init_size;
> >  1503         }
> >
> >  This loop has the effect of adding in mod->init_size the size of all
> >  ELF sections whose name starts with .init. So in load_module(), after
> >  the call to layout_sections(), mod->init_size is the size of .init.text
> >  + init.data + others .init sections.
> >
> >  Back in load_module(), it does:
> >
> >  1852         ptr = module_alloc(mod->init_size);
> >  1853         if (!ptr && mod->init_size) {
> >  1854                 err = -ENOMEM;
> >  1855                 goto free_core;
> >  1856         }
> >  1857         memset(ptr, 0, mod->init_size);
> >  1858         mod->module_init = ptr;
> >
> >  So it allocates a specific memory area for init code and data, which is
> >  pointed by mod->module_init.
> >
> >  Then, if you look back in sys_init_module(), you see that the init
> >  function of the module is called:
> >
> >  2125         if (mod->init != NULL)
> >  2126                 ret = mod->init();
> >
> >  And if everything went right during the initialization, the following
> >  line is executed:
> >
> >  2145         module_free(mod, mod->module_init);
> >
> >  Which frees the init code and data.
> >
> >
> >
> >  Sincerly,
> >
> >  Thomas
> >  --
> >  Thomas Petazzoni, Free Electrons
> >  Free Embedded Linux Training Materials
> >  on http://free-electrons.com/training
> >  (More than 1500 pages!)
> >
>
>
>
> --
> Regards,
> Peter Teoh
>
> --
> To unsubscribe from this list: send an email with
> "unsubscribe kernelnewbies" to [EMAIL PROTECTED]
> Please read the FAQ at http://kernelnewbies.org/FAQ
>
>

Reply via email to