From 25cd73821f81b2a0fbd2f979c2b79356c7a9181d Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Fri, 12 Nov 2021 18:24:52 +0800 Subject: [PATCH] fix a bug of malloc big memory failed --- Ubiquitous/XiUOS/kernel/memory/byte_manage.c | 43 +++++++++++++++----- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/Ubiquitous/XiUOS/kernel/memory/byte_manage.c b/Ubiquitous/XiUOS/kernel/memory/byte_manage.c index e3e1f1662..1f447528d 100644 --- a/Ubiquitous/XiUOS/kernel/memory/byte_manage.c +++ b/Ubiquitous/XiUOS/kernel/memory/byte_manage.c @@ -350,11 +350,12 @@ static void* BigMemMalloc(struct DynamicBuddyMemory *dynamic_buddy, x_size_t siz /* best-fit method */ for (node = dynamic_buddy->mm_freenode_list[ndx].next; - node && (node->size < allocsize); + (ndx < MEM_LINKNRS ) && (node->size < allocsize); node = node->next) { + ndx++; }; /* get the best-fit freeNode */ - if (node && (node->size > allocsize)) { + if (node && (node->size >= allocsize)) { struct DynamicFreeNode *remainder; struct DynamicFreeNode *next; uint32 remaining; @@ -1197,25 +1198,47 @@ SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHE */ void ShowBuddy(void) { + int i = 0; int lock = 0; struct DynamicFreeNode *debug = NONE; lock = CriticalAreaLock(); KPrintf("\n\033[41;1mlist memory information\033[0m\n", __func__); - for (debug = ByteManager.dynamic_buddy_manager.mm_freenode_list[0].next; - debug;debug = debug->next){ - KPrintf("%s,current is %x,next is %x, size %u, flag %x\n",__func__, debug, debug->next,debug->size,debug->flag); - }; + for(int level = 0; level < MEM_LINKNRS; level++) { + KPrintf("\n %s level [%d],memory size[2^%d] \n",__func__, level,level +6); + for (debug = &ByteManager.dynamic_buddy_manager.mm_freenode_list[level]; ; ) { + if(debug->size > 0) + KPrintf(" [current node %x,next node %x, size %u, flag %x]\n",debug, debug->next,debug->size,debug->flag); + else + KPrintf(" [listhead node %x,next node %x]\n",debug, debug->next); + if(debug->next) + debug = debug->next; + + if(debug->size == 0) + break; + }; + } + KPrintf("\nlist memory information\n\n"); #ifdef MEM_EXTERN_SRAM for(i = 0; i < EXTSRAM_MAX_NUM; i++) { if(NONE != ExtByteManager[i].done){ KPrintf("\nlist extern sram[%d] memory information\n\n",i); - for (debug = ExtByteManager[i].dynamic_buddy_manager.mm_freenode_list[0].next; - debug;debug = debug->next){ - KPrintf("%s,current is %x,next is %x, size %u, flag %x\n",__func__, debug, debug->next,debug->size,debug->flag); - }; + for(int lev = 0; lev < MEM_LINKNRS; lev++) { + KPrintf("\n %s level [%d],memory size[2^%d] \n",__func__, lev,lev +6); + for (debug = & ExtByteManager[i].dynamic_buddy_manager.mm_freenode_list[lev]; ; ) { + if(debug->size > 0) + KPrintf(" [current node %x,next node %x, size %u, flag %x]\n",debug, debug->next,debug->size,debug->flag); + else + KPrintf(" [listhead node %x,next node %x]\n",debug, debug->next); + if(debug->next) + debug = debug->next; + + if(debug->size == 0) + break; + } + } } }