mirror of
https://github.com/apache/nuttx.git
synced 2026-06-01 07:45:16 +08:00
libc/modlib: free memory resource when rmmod elf
Signed-off-by: dongjiuzhu1 <dongjiuzhu1@xiaomi.com>
This commit is contained in:
@@ -159,6 +159,10 @@ struct module_s
|
|||||||
struct mod_info_s modinfo; /* Module information */
|
struct mod_info_s modinfo; /* Module information */
|
||||||
FAR void *textalloc; /* Allocated kernel text memory */
|
FAR void *textalloc; /* Allocated kernel text memory */
|
||||||
FAR void *dataalloc; /* Allocated kernel memory */
|
FAR void *dataalloc; /* Allocated kernel memory */
|
||||||
|
#ifdef CONFIG_ARCH_USE_SEPARATED_SECTION
|
||||||
|
FAR void **sectalloc; /* All sections memory allocated when ELF file was loaded */
|
||||||
|
uint16_t nsect; /* Number of entries in sectalloc array */
|
||||||
|
#endif
|
||||||
int dynamic; /* Module is a dynamic shared object */
|
int dynamic; /* Module is a dynamic shared object */
|
||||||
#if defined(CONFIG_FS_PROCFS) && !defined(CONFIG_FS_PROCFS_EXCLUDE_MODULE)
|
#if defined(CONFIG_FS_PROCFS) && !defined(CONFIG_FS_PROCFS_EXCLUDE_MODULE)
|
||||||
size_t textsize; /* Size of the kernel .text memory allocation */
|
size_t textsize; /* Size of the kernel .text memory allocation */
|
||||||
|
|||||||
@@ -132,6 +132,34 @@ static inline int dlremove(FAR void *handle)
|
|||||||
|
|
||||||
if (!modp->dynamic)
|
if (!modp->dynamic)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_ARCH_USE_SEPARATED_SECTION
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < modp->nsect && modp->sectalloc[i] != NULL; i++)
|
||||||
|
{
|
||||||
|
# ifdef CONFIG_ARCH_USE_TEXT_HEAP
|
||||||
|
if (up_textheap_heapmember(modp->sectalloc[i]))
|
||||||
|
{
|
||||||
|
up_textheap_free(modp->sectalloc[i]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifdef CONFIG_ARCH_USE_DATA_HEAP
|
||||||
|
if (up_dataheap_heapmember(modp->sectalloc[i]))
|
||||||
|
{
|
||||||
|
up_dataheap_free(modp->sectalloc[i]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
lib_free(modp->sectalloc[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
lib_free(modp->sectalloc);
|
||||||
|
modp->sectalloc = NULL;
|
||||||
|
modp->nsect = 0;
|
||||||
|
#else
|
||||||
if (modp->textalloc != NULL)
|
if (modp->textalloc != NULL)
|
||||||
{
|
{
|
||||||
/* Free the module memory */
|
/* Free the module memory */
|
||||||
@@ -147,8 +175,13 @@ static inline int dlremove(FAR void *handle)
|
|||||||
{
|
{
|
||||||
/* Free the module memory */
|
/* Free the module memory */
|
||||||
|
|
||||||
|
#if defined(CONFIG_ARCH_USE_DATA_HEAP)
|
||||||
|
up_dataheap_free((FAR void *)modp->dataalloc);
|
||||||
|
#else
|
||||||
lib_free((FAR void *)modp->dataalloc);
|
lib_free((FAR void *)modp->dataalloc);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -238,6 +238,11 @@ static inline FAR void *dlinsert(FAR const char *filename)
|
|||||||
|
|
||||||
/* Save the load information */
|
/* Save the load information */
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARCH_USE_SEPARATED_SECTION
|
||||||
|
modp->sectalloc = (FAR void *)loadinfo.sectalloc;
|
||||||
|
modp->nsect = loadinfo.ehdr.e_shnum;
|
||||||
|
#endif
|
||||||
|
|
||||||
modp->textalloc = (FAR void *)loadinfo.textalloc;
|
modp->textalloc = (FAR void *)loadinfo.textalloc;
|
||||||
modp->dataalloc = (FAR void *)loadinfo.datastart;
|
modp->dataalloc = (FAR void *)loadinfo.datastart;
|
||||||
modp->dynamic = (loadinfo.ehdr.e_type == ET_DYN);
|
modp->dynamic = (loadinfo.ehdr.e_type == ET_DYN);
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ int modlib_unload(FAR struct mod_loadinfo_s *loadinfo)
|
|||||||
lib_free((FAR void *)loadinfo->sectalloc[i]);
|
lib_free((FAR void *)loadinfo->sectalloc[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
lib_free(loadinfo->sectalloc);
|
lib_free(loadinfo->sectalloc);
|
||||||
#else
|
#else
|
||||||
if (loadinfo->textalloc != 0)
|
if (loadinfo->textalloc != 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -127,15 +127,44 @@ int rmmod(FAR void *handle)
|
|||||||
|
|
||||||
if (!modp->dynamic)
|
if (!modp->dynamic)
|
||||||
{
|
{
|
||||||
#if defined(CONFIG_ARCH_USE_TEXT_HEAP)
|
#ifdef CONFIG_ARCH_USE_SEPARATED_SECTION
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < modp->nsect && modp->sectalloc[i] != NULL; i++)
|
||||||
|
{
|
||||||
|
# ifdef CONFIG_ARCH_USE_TEXT_HEAP
|
||||||
|
if (up_textheap_heapmember(modp->sectalloc[i]))
|
||||||
|
{
|
||||||
|
up_textheap_free(modp->sectalloc[i]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# ifdef CONFIG_ARCH_USE_DATA_HEAP
|
||||||
|
if (up_dataheap_heapmember(modp->sectalloc[i]))
|
||||||
|
{
|
||||||
|
up_dataheap_free(modp->sectalloc[i]);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
kmm_free(modp->sectalloc[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
kmm_free(modp->sectalloc);
|
||||||
|
modp->sectalloc = NULL;
|
||||||
|
modp->nsect = 0;
|
||||||
|
#else
|
||||||
|
# if defined(CONFIG_ARCH_USE_TEXT_HEAP)
|
||||||
up_textheap_free((FAR void *)modp->textalloc);
|
up_textheap_free((FAR void *)modp->textalloc);
|
||||||
#else
|
# else
|
||||||
kmm_free((FAR void *)modp->textalloc);
|
kmm_free((FAR void *)modp->textalloc);
|
||||||
#endif
|
# endif
|
||||||
#if defined(CONFIG_ARCH_USE_DATA_HEAP)
|
# if defined(CONFIG_ARCH_USE_DATA_HEAP)
|
||||||
up_dataheap_free((FAR void *)modp->dataalloc);
|
up_dataheap_free((FAR void *)modp->dataalloc);
|
||||||
#else
|
# else
|
||||||
kmm_free((FAR void *)modp->dataalloc);
|
kmm_free((FAR void *)modp->dataalloc);
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
Reference in New Issue
Block a user