|
±¾Ìû×îºóÓÉ WZH ÓÚ 2021-9-3 11:15 ±à¼
ǰÎÄ£ºÂÛ̳Ê×·¢£¬ÄÚ´æ¹ÜÀíËã·¨£¬Ö§³Ömalloc,realloc,align_alloc£¬ÅäÓÐÄÚ´æË鯬ºÏ²¢Ëã·¨http://armbbs.cn/forum.php?mod=v ... 08321&fromuid=24016
(³ö´¦: Ó²ººÇ¶ÈëʽÂÛ̳)
±¾´ÎËã·¨½øÐÐÁ˲¿·Ö¸üУ¬Ö÷ÒªÌí¼ÓÄÚ´æ³ØÊ½µÄ³õʼ»¯Óë·ÖÅä·½·¨£¬ÓëÓ²ºº¸çÔÚH7½Ì³ÌÖеÄÄÚ´æ¹ÜÀí·½·¨Ê¹Ó÷½Ê½ÍêȫһÖ£¬ÁíÍâ´úÂëÊǸù¾ÝC99±ê×¼±àдµÄ£¬Òò´Ë±àÒëʱÐèÒª¹´Ñ¡C99Ñ¡Ïî¡£
mem_manage.h
- /********************************************************************************
- * @File name: mem_manage.h
- * @Author: wzh
- * @Version: 1.2
- * @Date: 2021-9-3
- * @Description: ÄÚ´æ¹ÜÀíËã·¨£¬´øÓÐÄÚ´æË鯬ºÏ²¢Ëã·¨£¬Ö§³Ömalloc¡¢align_alloc¡¢
- * realloc¡¢freeµÈ³£¼ûµÄÄÚ´æ¹ÜÀíº¯Êý£¬Ö§³Ö¶à¿éÄÚ´æºÏ²¢¹ÜÀí
- *¸üмǼ£º
- * v1.0 2021-8-13 Ìí¼ÓMem_Manage_Heap_Init¡¢Mem_Manage_Malloc¡¢Mem_Manage_Realloc
- Mem_Manage_Aligned_Allocº¯Êý
- v1.1 2021-8-14 Ìí¼ÓMem_Manage_Get_Stateº¯Êý
- v1.2 2021-9-3 ¸ü¸ÄMem_Root½á¹¹Ìå³ÉÔ±£»¸ü¸ÄMem_State½á¹¹Ìå³ÉÔ±£»
- Ìí¼Óö¾ÙÀàÐÍMem_Err_Type£»½«º¯ÊýMem_Manage_Heap_InitÖØÃüÃûΪ
- Mem_Manage_Init£»ÐÞ¸ÄMem_Manage_Initº¯ÊýÉùÃ÷£»Ìí¼Óº¯ÊýMem_Manage_Get_Total_Size¡¢
- Mem_Manage_Get_Remain_Size¡¢Mem_Manage_Get_Errflag¡¢Mem_Manage_Pool_Init¡¢
- Mem_Manage_Pool_Malloc¡¢Mem_Manage_Pool_Realloc¡¢Mem_Manage_Pool_Aligned_Alloc¡¢
- Mem_Manage_Pool_Free¡¢Mem_Manage_Pool_Get_State¡¢Mem_Manage_Pool_Get_Total_Size¡¢
- Mem_Manage_Pool_Get_Remain_Size¡¢Mem_Manage_Pool_Get_Errflag£»
- * @Todo ¾ßÌåʹÓ÷½·¨ÈçÏÂ
- * 1¡¢Ê¹ÓÃMem_Manage_Init(Mem_Root* pRoot, const Mem_Region* pRigon)³õʼ»¯
- * ÄÚ´æÇø£¬pRootΪ¾ä±ú£¬pRigonÃèÊöÁËÄÚ´æÇø¸öÊýÒÔ¼°ÄÚ¸öÄÚ´æÇøÆðʼµØÖ·ºÍ´óС
- * pRigonµÄ¸ñʽÈçÏÂ
- * const Mem_Region pRigon[]=
- * {
- * (void*)(0x20000000),512*1024,
- * (void*)(0x80000000),256*1024,
- * ....
- * NULL,0
- * }
- * ×¢ÒâµØÖ·±ØÐèÓɵ͵½¸ßÅÅÁУ¬Í¬Ê±Ê¹ÓÃNULL£¬0±êʶ½á⣬ÄÚ´æÇøÈÝÁ¿²»ÒªÌ«Ð¡£¬ÖÁÉÙ´óÓÚ64¸ö×Ö½Ú
- * 2¡¢Ê¹ÓÃMem_Manage_Malloc¡¢Mem_Manage_Realloc¡¢Mem_Manage_Aligned_Alloc½øÐÐÄÚ´æ
- * ·ÖÅ䣬ÆäÖÐMem_Manage_Malloc¡¢Mem_Manage_ReallocĬÈϾùΪ8×Ö½Ú¶ÔÆë£¬¿ÉÐÞ¸Ä
- * .cÎļþÖеĺ궨ÒåÐ޸ģ¬Mem_Manage_Aligned_Alloc¿ÉÒÔÖ¸¶¨µØÖ·¶ÔÆë£¬µ«¶ÔÆëµÄ²ÎÊý
- * ÓÐÏÞÖÆ£¬align_sizeÐèҪΪ2µÄÕûÊý´ÎÃÝ£¬·ñÔò»áÖ±½Ó·µ»ØNULL¡£
- * 3¡¢ÄÚ´æÊ¹ÓÃÍê±ÏºóʹÓÃMem_Manage_Free½øÐÐÄÚ´æÊÍ·Å
- * 4¡¢¿Éͨ¹ýMem_Manage_Get_State²é¿´¿ÕÏÐÄÚ´æ×´Ì¬£¬Í¨¹ýMem_Manage_Get_Total_Size»ñÈ¡×ÜÄڴ棬
- * ͨ¹ýMem_Manage_Get_Remain_Size»ñȡʣÓàÄÚ´æ
- * 5¡¢Ëã·¨¹ÜÀíµÄµ¥¸öÄÚ´æÉÏÏÞΪ2GB£¨32λ»ú£©
- ********************************************************************************/
- #ifndef MEM_MANAGE_H_
- #define MEM_MANAGE_H_
- #include <stddef.h>
- #include <stdbool.h>
- #ifdef __cplusplus
- extern "C" {
- #endif
- typedef enum {
- MEM_NO_ERR=0X1234, //ÎÞ´íÎó
- MEM_NO_INIT=0, //ÄÚ´æÇøÎ´³õʼ»¯
- MEM_OVER_WRITE=1 //ÄÚ´æÇø½ÚµãÐÅϢλÖÃÊý¾ÝËð»µ
- }Mem_Err_Type;
- typedef struct Mem_Region {
- void* addr;//ÄÚ´æÇøÆðʼµØÖ·
- size_t mem_size;//ÄÚ´æ´óС
- }Mem_Region;
- typedef struct Mem_Node {
- struct Mem_Node* next_node;
- size_t mem_size;
- }Mem_Node;
- typedef struct Mem_Root {
- Mem_Node* pStart;
- Mem_Node* pEnd;
- size_t total_size; //×ÜÄÚ´æ
- size_t remain_size; //Ê£ÓàÄÚ´æ
- Mem_Err_Type err_flag; //´íÎó±ê¼Ç
- }Mem_Root;
- typedef struct Mem_State {
- size_t free_node_num; //¿ÕÏнڵã¸öÊý
- size_t max_node_size; //×î´ó½ÚµãÄÚ´æ
- size_t min_node_size; //×îС½ÚµãÄÚ´æ
- }Mem_State;
- bool Mem_Manage_Init(Mem_Root* pRoot, const Mem_Region* pRigon);
- void* Mem_Manage_Malloc(Mem_Root* pRoot, size_t want_size);
- void* Mem_Manage_Realloc(Mem_Root* pRoot, void* src_addr, size_t want_size);
- void* Mem_Manage_Aligned_Alloc(Mem_Root* pRoot, size_t align_size, size_t want_size);
- void Mem_Manage_Free(Mem_Root* pRoot, void* addr);
- void Mem_Manage_Get_State(Mem_Root* pRoot, Mem_State* pState);
- size_t Mem_Manage_Get_Total_Size(const Mem_Root* pRoot);
- size_t Mem_Manage_Get_Remain_Size(const Mem_Root* pRoot);
- Mem_Err_Type Mem_Manage_Get_Errflag(const Mem_Root* pRoot);
- bool Mem_Manage_Pool_Init(void* mem_addr,size_t mem_size);
- void* Mem_Manage_Pool_Malloc(void* mem_addr,size_t want_size);
- void* Mem_Manage_Pool_Realloc(void* mem_addr,void* src_addr,size_t want_size);
- void* Mem_Manage_Pool_Aligned_Alloc(void* mem_addr,size_t align_byte,size_t want_size);
- void Mem_Manage_Pool_Free(void* mem_addr,void* free_addr);
- void Mem_Manage_Pool_Get_State(void* mem_addr,Mem_State* pState);
- size_t Mem_Manage_Pool_Get_Total_Size(const void* mem_addr);
- size_t Mem_Manage_Pool_Get_Remain_Size(const void* mem_addr);
- Mem_Err_Type Mem_Manage_Pool_Get_Errflag(const void* mem_addr);
- #ifdef __cplusplus
- }
- #endif
- #endif
¸´ÖÆ´úÂë
mem_manage.h
- /********************************************************************************
- * @File name: mem_manage.c
- * @Author: wzh
- * @Version: 1.2
- * @Date: 2021-9-3
- * @Description: ÄÚ´æ¹ÜÀíËã·¨£¬´øÓÐÄÚ´æË鯬ºÏ²¢Ëã·¨£¬Ö§³Ömalloc¡¢align_alloc¡¢
- * realloc¡¢freeµÈ³£¼ûµÄÄÚ´æ¹ÜÀíº¯Êý£¬Ö§³Ö¶à¿éÄÚ´æºÏ²¢¹ÜÀí
- *¸üмǼ£º
- * v1.0 2021-8-13 Ìí¼ÓMem_Manage_Heap_Init¡¢Mem_Manage_Malloc¡¢Mem_Manage_Realloc
- Mem_Manage_Aligned_Allocº¯Êý
- v1.1 2021-8-14 Ìí¼ÓMem_Manage_Get_Stateº¯Êý
- v1.2 2021-9-3 ¸ü¸ÄMem_Root½á¹¹Ìå³ÉÔ±£»¸ü¸ÄMem_State½á¹¹Ìå³ÉÔ±£»
- Ìí¼Óö¾ÙÀàÐÍMem_Err_Type£»½«º¯ÊýMem_Manage_Heap_InitÖØÃüÃûΪ
- Mem_Manage_Init£»ÐÞ¸ÄMem_Manage_Initº¯ÊýÉùÃ÷£»Ìí¼Óº¯ÊýMem_Manage_Get_Total_Size¡¢
- Mem_Manage_Get_Remain_Size¡¢Mem_Manage_Get_Errflag¡¢Mem_Manage_Pool_Init¡¢
- Mem_Manage_Pool_Malloc¡¢Mem_Manage_Pool_Realloc¡¢Mem_Manage_Pool_Aligned_Alloc¡¢
- Mem_Manage_Pool_Free¡¢Mem_Manage_Pool_Get_State¡¢Mem_Manage_Pool_Get_Total_Size¡¢
- Mem_Manage_Pool_Get_Remain_Size¡¢Mem_Manage_Pool_Get_Errflag£»
- ********************************************************************************/
- #include <stdint.h>
- #include <string.h>
- #include "mem_manage.h"
- #define MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT 8
- #define MEM_MANAGE_BITS_PER_BYTE 8
- #define MEM_MANAGE_MEM_STRUCT_SIZE Mem_Manage_Align_Up(sizeof(Mem_Node),MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT)
- #define MEM_MANAGE_MINUM_MEM_SIZE (MEM_MANAGE_MEM_STRUCT_SIZE<<1)
- #define MEM_MANAGE_ALLOCA_LABAL ((size_t)(1<<(sizeof(size_t)*MEM_MANAGE_BITS_PER_BYTE-1)))
- #define MEM_MANAGE_MINUM_NODE_SIZE (MEM_MANAGE_MEM_STRUCT_SIZE+MEM_MANAGE_MINUM_MEM_SIZE)
- #define MEM_MANAGE_MEM_ROOT_SIZE Mem_Manage_Align_Up(sizeof(Mem_Root),MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT)
- static __inline size_t Mem_Manage_Align_Down(size_t data, size_t align_byte) {
- return data&~(align_byte - 1);
- }
- static __inline size_t Mem_Manage_Align_Up(size_t data, size_t align_byte) {
- return (data + align_byte - 1)&~(align_byte - 1);
- }
- static __inline Mem_Node* Mem_Manage_Addr_To_Mem(const void* addr) {
- return (Mem_Node*)((const uint8_t*)addr - MEM_MANAGE_MEM_STRUCT_SIZE);
- }
- static __inline void* Mem_Manage_Mem_To_Addr(const Mem_Node* mem_node) {
- return (void*)((const uint8_t*)mem_node + MEM_MANAGE_MEM_STRUCT_SIZE);
- }
- //½«ÄÚ´æ½Úµã²åÈë¿ÕÏÐÁбíÖÐ
- static __inline void Mem_Insert_Node_To_FreeList(Mem_Root* pRoot, Mem_Node* pNode) {
- Mem_Node* pPriv_Node;
- Mem_Node* pNext_Node;
- //ѰÕÒµØÖ·ÓëpNodeÏà½üµÄ½Úµã
- for (pPriv_Node = pRoot->pStart; pPriv_Node->next_node < pNode; pPriv_Node = pPriv_Node->next_node);
- pNext_Node = pPriv_Node->next_node;
- pRoot->remain_size += pNode->mem_size;
- //³¢ÊÔpNodeÓëǰһ¸ö¿é½øÐкϲ¢
- if ((uint8_t*)Mem_Manage_Mem_To_Addr(pPriv_Node) + pPriv_Node->mem_size == (uint8_t*)pNode) {
- if (pPriv_Node != pRoot->pStart) {//²»ÊÇStart¿éµÄ»°¿ÉÒԺϲ¢
- pPriv_Node->mem_size += MEM_MANAGE_MEM_STRUCT_SIZE + pNode->mem_size;
- pRoot->remain_size += MEM_MANAGE_MEM_STRUCT_SIZE;
- pNode = pPriv_Node;
- }
- else {//ºóÃæÈç¹ûÊÇStart¿é²»½øÐкϲ¢£¬ÒÔÃâÀË·ÑÄÚ´æ
- pRoot->pStart->next_node = pNode;
- }
- }
- else {//²»Äܺϲ¢Ê±Ö±½Ó²åÈëµ½¿ÕÏе¥Á´±íÖÐ
- pPriv_Node->next_node = pNode;
- }
- //³¢ÊÔºóÃæÒ»¸ö¿éÓëpNode½øÐкϲ¢
- if ((uint8_t*)Mem_Manage_Mem_To_Addr(pNode) + pNode->mem_size == (uint8_t*)pNext_Node) {
- if (pNext_Node != pRoot->pEnd) {//²»ÊÇend¿éµÄ»°¿ÉÒÔ½øÐпéºÏ²¢
- pNode->mem_size += MEM_MANAGE_MEM_STRUCT_SIZE + pNext_Node->mem_size;
- pRoot->remain_size += MEM_MANAGE_MEM_STRUCT_SIZE;
- pNode->next_node = pNext_Node->next_node;
- }
- else {//ºóÃæÈç¹ûÊÇend¿é²»½øÐкϲ¢£¬ÒÔÃâÀË·ÑÄÚ´æ
- pNode->next_node = pRoot->pEnd;
- }
- }
- else {//²»Äܺϲ¢Ê±Ö±½Ó²åÈëµ½¿ÕÏе¥Á´±íÖÐ
- pNode->next_node = pNext_Node;
- }
- }
- static __inline void Mem_Settle(Mem_Root* pRoot){
- Mem_Node* pNode=pRoot->pStart->next_node;
- while(pNode->next_node!=pRoot->pEnd){
- if((uint8_t*)Mem_Manage_Mem_To_Addr(pNode)+pNode->mem_size==(uint8_t*)pNode->next_node){
- pNode->mem_size += MEM_MANAGE_MEM_STRUCT_SIZE+pNode->next_node->mem_size;
- pRoot->remain_size += MEM_MANAGE_MEM_STRUCT_SIZE;
- pNode->next_node=pNode->next_node->next_node;
- }
- else
- pNode=pNode->next_node;
- }
- }
- //»ñÈ¡¹ÜÀíÄÚ´æµÄ״̬
- //pRoot:¾ä±úÖ¸Õë
- //pState:״̬ÐÅÏ¢½á¹¹ÌåÖ¸Õë
- //return:ÎÞ·µ»ØÖµ
- void Mem_Manage_Get_State(Mem_Root* pRoot,Mem_State* pState) {
-
- if(pRoot->err_flag!=MEM_NO_ERR){
- pState->free_node_num=0;
- pState->max_node_size=0;
- pState->min_node_size=0;
- return;
- }
-
- if(pRoot->pStart==NULL||pRoot->pEnd==NULL){
- pRoot->err_flag=MEM_NO_INIT;
- pState->free_node_num=0;
- pState->max_node_size=0;
- pState->min_node_size=0;
- return;
- }
- pState->max_node_size = pRoot->pStart->next_node->mem_size;
- pState->min_node_size = pRoot->pStart->next_node->mem_size;
- pState->free_node_num = 0;
- for (Mem_Node* pNode = pRoot->pStart->next_node; pNode->next_node != NULL; pNode = pNode->next_node) {
- pState->free_node_num ++;
- if (pNode->mem_size > pState->max_node_size)
- pState->max_node_size = pNode->mem_size;
- if (pNode->mem_size < pState->min_node_size)
- pState->min_node_size = pNode->mem_size;
- }
- }
- //ÓëC¿âº¯Êýaligned_alloc×÷ÓÃÒ»ÖÂ
- //pRoot:¾ä±úÖ¸Õë
- //align_size:ÆÚÍû·ÖÅäµÄÄڴ漸×Ö½Ú¶ÔÆë£¨8¡¢16¡¢32...)
- //want_size:ÆÚÍû·ÖÅäÄÚ´æ´óС
- //return: NULL ·ÖÅäʧ°Ü£¨ÄÚ´æ²»×ã»òÕß´íÎó±ê¼Ç²»ÎªMEM_NO_ERR£©£»
- // ÆäËûÖµ ·ÖÅä³É¹¦
- void* Mem_Manage_Aligned_Alloc(Mem_Root* pRoot,size_t align_size, size_t want_size) {
- void* pReturn = NULL;
- Mem_Node* pPriv_Node,*pNow_Node;
- if(pRoot->err_flag!=MEM_NO_ERR){
- return NULL;
- }
-
- if(pRoot->pStart==NULL||pRoot->pEnd==NULL){
- pRoot->err_flag=MEM_NO_INIT;
- return NULL;
- }
-
- if (want_size == 0) {
- return NULL;
- }
- if ((want_size&MEM_MANAGE_ALLOCA_LABAL) != 0) {//ÄÚ´æ¹ý´ó
- return NULL;
- }
- if (align_size&(align_size - 1)) {//ÄÚ´æ¶ÔÆëÊäÈë·Ç·¨Öµ
- return NULL;
- }
-
- if (want_size < MEM_MANAGE_MINUM_MEM_SIZE)
- want_size = MEM_MANAGE_MINUM_MEM_SIZE;
- if (align_size < MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT)
- align_size = MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT;
- //È·±£·ÖÅäµÄµ¥Ôª¶¼ÊÇMEM_MANAGE_ALIGNMENT_BYTE_DEFAULTµÄÕûÊý±¶
- want_size = Mem_Manage_Align_Up(want_size, MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
- pPriv_Node = pRoot->pStart;
- pNow_Node = pRoot->pStart->next_node;
-
- while (pNow_Node->next_node != NULL) {
- if (pNow_Node->mem_size >= want_size+ MEM_MANAGE_MEM_STRUCT_SIZE) {
- size_t use_align_size;
- size_t new_size;
- pReturn = (void*)Mem_Manage_Align_Up((size_t)Mem_Manage_Mem_To_Addr(pNow_Node), align_size);//¼ÆËã³ö¶ÔÆëµÄµØÖ·
- use_align_size = (uint8_t*)pReturn-(uint8_t*)Mem_Manage_Mem_To_Addr(pNow_Node);//¼ÆËã¶ÔÆëËùÏûºÄµÄÄÚ´æ
- if (use_align_size != 0) {//ÄÚ´æ²»¶ÔÆë
- if (use_align_size < MEM_MANAGE_MINUM_NODE_SIZE) {//²»¶ÔÆëµÄÖµ¹ýС
- pReturn = (void*)Mem_Manage_Align_Up(\
- (size_t)Mem_Manage_Mem_To_Addr(pNow_Node)+ MEM_MANAGE_MINUM_NODE_SIZE, align_size);
- use_align_size = (uint8_t*)pReturn - (uint8_t*)Mem_Manage_Mem_To_Addr(pNow_Node);
- }
- if (use_align_size <= pNow_Node->mem_size) {
- new_size = pNow_Node->mem_size - use_align_size;//¼ÆËãÈ¥³ý¶ÔÆëÏûºÄµÄÄÚ´æÊ£ÏµÄÄÚ´æ´óС
- if (new_size >= want_size) {//Âú×ãÌõ¼þ£¬¿ÉÒÔ½øÐзÖÅä
- Mem_Node* pNew_Node = Mem_Manage_Addr_To_Mem(pReturn);
- pNow_Node->mem_size -= new_size + MEM_MANAGE_MEM_STRUCT_SIZE;//·ÖÁѽڵã
- pRoot->remain_size -= new_size + MEM_MANAGE_MEM_STRUCT_SIZE;
- pNew_Node->mem_size = new_size;//нڵ㱾À´Ò²²»ÔÚ¿ÕÏÐÁ´±íÖУ¬²»ÓôӿÕÏÐÁ´±íÖÐÅųö
- pNew_Node->next_node = (Mem_Node*)MEM_NO_ERR;
- pNow_Node = pNew_Node;
- break;
- }
- }
- }
- else {//ÄÚ´æÖ±½Ó¾ÍÊÇ¶ÔÆëµÄ
- pPriv_Node->next_node = pNow_Node->next_node;//Åųö¿ÕÏÐÁ´±í
- pNow_Node->next_node = (Mem_Node*)MEM_NO_ERR;
- pRoot->remain_size -= pNow_Node->mem_size;
- break;
- }
- }
- pPriv_Node = pNow_Node;
- pNow_Node = pNow_Node->next_node;
- }
- if (pNow_Node->next_node == NULL){//·ÖÅäʧ°Ü
- if(pNow_Node!=pRoot->pEnd){
- pRoot->err_flag=MEM_OVER_WRITE;
- }
- return NULL;
- }
- pNow_Node->next_node = NULL;
- if (pNow_Node->mem_size >= MEM_MANAGE_MINUM_NODE_SIZE + want_size) {//½ÚµãÄڴ滹Óи»Óà
- Mem_Node* pNew_Node =(Mem_Node*)((uint8_t*)Mem_Manage_Mem_To_Addr(pNow_Node) + want_size);//¼ÆËã½«ÒªÒÆÈë¿ÕÏÐÁ´±íµÄ½ÚµãµØÖ·
- pNew_Node->mem_size = pNow_Node->mem_size - want_size - MEM_MANAGE_MEM_STRUCT_SIZE;
- pNew_Node->next_node = NULL;
- pNow_Node->mem_size = want_size;
- Mem_Insert_Node_To_FreeList(pRoot, pNew_Node);
- }
- pNow_Node->mem_size |= MEM_MANAGE_ALLOCA_LABAL;//±ê¼ÇÄÚ´æÒÑ·ÖÅä
- return pReturn;
- }
- //ÓëC¿âº¯Êýmalloc×÷ÓÃÏàͬ
- //pRoot:¾ä±úÖ¸Õë
- //want_size:ÆÚÍû·ÖÅäÄÚ´æ´óС
- //return: NULL ·ÖÅäʧ°Ü£¨ÄÚ´æ²»×ã»òÕß´íÎó±ê¼Ç²»ÎªMEM_NO_ERR£©£»
- // ÆäËûÖµ ·ÖÅä³É¹¦
- void* Mem_Manage_Malloc(Mem_Root* pRoot, size_t want_size) {
- return Mem_Manage_Aligned_Alloc(pRoot, MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT, want_size);
- }
- //ÓëC¿âº¯Êýrealloc×÷ÓÃÏàͬ
- //pRoot:¾ä±úÖ¸Õë
- //src_addr:Ô´µØÖ·Ö¸Õë
- //want_size:ÆÚÍû·ÖÅäÄÚ´æ´óС
- //return: NULL ·ÖÅäʧ°Ü£¨ÄÚ´æ²»×ã»òÕß¾ä±ú´íÎó±ê¼Ç²»ÎªMEM_NO_ERR£©£»
- // ÆäËûÖµ ·ÖÅä³É¹¦
- void* Mem_Manage_Realloc(Mem_Root* pRoot, void* src_addr, size_t want_size) {
- void* pReturn = NULL;
- Mem_Node* pNext_Node,*pPriv_Node;
- Mem_Node* pSrc_Node;
-
- if(pRoot->err_flag!=MEM_NO_ERR){
- return NULL;
- }
-
- if(pRoot->pStart==NULL||pRoot->pEnd==NULL){
- pRoot->err_flag=MEM_NO_INIT;
- return NULL;
- }
-
- if (src_addr == NULL) {
- return Mem_Manage_Aligned_Alloc(pRoot, MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT, want_size);
- }
- if (want_size == 0) {
- Mem_Manage_Free(pRoot, src_addr);
- return NULL;
- }
- if ((want_size&MEM_MANAGE_ALLOCA_LABAL) != 0){
- return NULL;
- }
- pSrc_Node = Mem_Manage_Addr_To_Mem(src_addr);
- if ((pSrc_Node->mem_size&MEM_MANAGE_ALLOCA_LABAL) == 0) {//Ô´µØÖ·Î´±»·ÖÅ䣬µ÷ÓôíÎó
- pRoot->err_flag=MEM_OVER_WRITE;
- return NULL;
- }
- pSrc_Node->mem_size &= ~MEM_MANAGE_ALLOCA_LABAL;//Çå³ý·ÖÅä±ê¼Ç
- if (pSrc_Node->mem_size >= want_size) {//¿éÔ¤ÁôµØÖ·×ã¹»´ó
- pSrc_Node->mem_size |= MEM_MANAGE_ALLOCA_LABAL;//»Ö¸´·ÖÅä±ê¼Ç
- pReturn = src_addr;
- return pReturn;
- }
- //¿ªÊ¼ÔÚ¿ÕÏÐÁбíÖÐѰÕÒÓë±¾¿éÏà½üµÄ¿é
- for (pPriv_Node = pRoot->pStart; pPriv_Node->next_node <pSrc_Node; pPriv_Node = pPriv_Node->next_node);
- pNext_Node = pPriv_Node->next_node;
- if (pNext_Node != pRoot->pEnd && \
- ((uint8_t*)src_addr + pSrc_Node->mem_size == (uint8_t*)pNext_Node) && \
- (pSrc_Node->mem_size + pNext_Node->mem_size + MEM_MANAGE_MEM_STRUCT_SIZE >= want_size)) {
- //Âú×ãÏÂÒ»½Úµã·Çend£¬ÄÚ´æÁ¬Ðø£¬ÄÚ´æÊ£Óà×ã¹»
- pReturn = src_addr;
- pPriv_Node->next_node = pNext_Node->next_node;//Åųö¿ÕÏÐÁбí
- pRoot->remain_size -= pNext_Node->mem_size;
- pSrc_Node->mem_size += MEM_MANAGE_MEM_STRUCT_SIZE + pNext_Node->mem_size;
- want_size = Mem_Manage_Align_Up(want_size, MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
- if (pSrc_Node->mem_size >= MEM_MANAGE_MINUM_NODE_SIZE+ want_size) {//È¥³ý·ÖÅäµÄÊ£Óà¿Õ¼ä×ã¹»¿ª±Ùпé
- Mem_Node* pNew_Node = (Mem_Node*)((uint8_t*)Mem_Manage_Mem_To_Addr(pSrc_Node) + want_size);
- pNew_Node->next_node = NULL;
- pNew_Node->mem_size = pSrc_Node->mem_size - want_size - MEM_MANAGE_MEM_STRUCT_SIZE;
- pSrc_Node->mem_size = want_size;
- Mem_Insert_Node_To_FreeList(pRoot, pNew_Node);
- }
- pSrc_Node->mem_size |= MEM_MANAGE_ALLOCA_LABAL;//»Ö¸´·ÖÅä±ê¼Ç
- }
- else {
- pReturn = Mem_Manage_Aligned_Alloc(pRoot, MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT, want_size);
- if (pReturn == NULL){
- pSrc_Node->mem_size |= MEM_MANAGE_ALLOCA_LABAL;//»Ö¸´·ÖÅä±ê¼Ç
- return NULL;
- }
- memcpy(pReturn, src_addr, pSrc_Node->mem_size);
- pSrc_Node->mem_size |= MEM_MANAGE_ALLOCA_LABAL;//»Ö¸´·ÖÅä±ê¼Ç
- Mem_Manage_Free(pRoot, src_addr);
- }
- return pReturn;
- }
- //ÓëC¿âº¯Êýfree×÷ÓÃÒ»ÖÂ
- //pRoot:¾ä±úÖ¸Õë
- //addr:ÊÍ·ÅÄÚ´æµÄÊ×µØÖ·
- //return:ÎÞ·µ»ØÖµ
- void Mem_Manage_Free(Mem_Root* pRoot,void* addr) {
- Mem_Node* pFree_Node;
-
- if(pRoot->err_flag!=MEM_NO_ERR){
- return;
- }
-
- if(pRoot->pStart==NULL||pRoot->pEnd==NULL){
- pRoot->err_flag=MEM_NO_INIT;
- return;
- }
-
- if (addr == NULL) {
- return;
- }
- pFree_Node = Mem_Manage_Addr_To_Mem(addr);
- if ((pFree_Node->mem_size&MEM_MANAGE_ALLOCA_LABAL) == 0) {//ÊÍ·Å´íÎó£¬Ã»Óбê¼Ç
- pRoot->err_flag=MEM_OVER_WRITE;
- return;
- }
- if (pFree_Node->next_node != NULL) {//ÊÍ·Å´íÎó
- pRoot->err_flag=MEM_OVER_WRITE;
- return;
- }
- pFree_Node->mem_size &= ~MEM_MANAGE_ALLOCA_LABAL;//Çå³ý·ÖÅä±ê¼Ç
- Mem_Insert_Node_To_FreeList(pRoot, pFree_Node);//²åÈëµ½¿ÕÏÐÁ´±íÖÐ
- }
- //»ñÈ¡¾ä±ú¹ÜÀíµÄÄÚ´æÇø×ÜÈÝÁ¿
- //pRoot:¾ä±úÖ¸Õë
- //return:ÄÚ´æÇø×ÜÈÝÁ¿£¨µ¥Î»£ºbyte£©
- size_t Mem_Manage_Get_Total_Size(const Mem_Root* pRoot){
- return pRoot->total_size;
- }
- //»ñÈ¡¾ä±ú¹ÜÀíµÄÄÚ´æÇøÊ£ÓàÈÝÁ¿
- //pRoot:¾ä±úÖ¸Õë
- //return:ÄÚ´æÇøÊ£ÓàÈÝÁ¿£¨µ¥Î»£ºbyte£©
- size_t Mem_Manage_Get_Remain_Size(const Mem_Root* pRoot){
- return pRoot->remain_size;
- }
- //»ñÈ¡¾ä±ú¹ÜÀíµÄÄÚ´æÇø´íÎó±ê¼Ç
- //pRoot:¾ä±úÖ¸Õë
- //return:´íÎó±ê¼Ç
- Mem_Err_Type Mem_Manage_Get_Errflag(const Mem_Root* pRoot){
- return pRoot->err_flag;
- }
- //ÄÚ´æ¹ÜÀí¾ä±ú³õʼ»¯
- //pRoot:¾ä±úÖ¸Õë
- //pRigon:ÄÚ´æÇø½á¹¹ÌåÖ¸Õë
- //return: true ³õʼ»¯³É¹¦;
- // false ³õʼ»¯Ê§°Ü
- bool Mem_Manage_Init(Mem_Root* pRoot,const Mem_Region* pRegion) {
- Mem_Node* align_addr;
- size_t align_size;
- Mem_Node* pPriv_node=NULL;
- pRoot->total_size = 0;
- pRoot->pEnd = NULL;
- pRoot->pStart = NULL;
- pRoot->err_flag = MEM_NO_INIT;
- pRoot->remain_size = 0;
- for (; pRegion->addr != NULL; pRegion++) {
- align_addr = (Mem_Node*)Mem_Manage_Align_Up((size_t)pRegion->addr, MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);//¼ÆËãÄÚ´æ¿é¶ÔÆëºóµÄµØÖ·
- if ((uint8_t*)align_addr > pRegion->mem_size+ (uint8_t*)pRegion->addr)//¶ÔÆëÏûºÄµÄÄڴ泬¹ýÄÚ´æÇø
- continue;
- align_size = pRegion->mem_size - ((uint8_t*)align_addr - (uint8_t*)pRegion->addr);//¼ÆËã¶ÔÆëºóʣϵÄÄÚ´æ´óС
- if (align_size < MEM_MANAGE_MINUM_MEM_SIZE+ MEM_MANAGE_MEM_STRUCT_SIZE)//¶ÔÆëʣϵÄÄÚ´æÌ«Ð¡
- continue;
- align_size -= MEM_MANAGE_MEM_STRUCT_SIZE;//Çó³ýÈ¥µô±íÍ·ºóÄÚ´æ¿éµÄ´óС
- align_addr->mem_size = align_size;
- align_addr->next_node = NULL;
- if (pRoot->pStart == NULL) {//Èç¹ûÊdzõʼ»¯
- pRoot->pStart = align_addr;//½«µ±Ç°ÄÚ´æ¿éµØÖ·¼ÇΪstart
- if (align_size >= MEM_MANAGE_MINUM_MEM_SIZE+ MEM_MANAGE_MEM_STRUCT_SIZE) {//ÈôʣϵĿé×ã¹»´ó
- align_size -= MEM_MANAGE_MEM_STRUCT_SIZE;//È¥µôÏÂÒ»¸ö¿éµÄ±íͷʣϵÄÄÚ´æ´óС
- align_addr = (Mem_Node*)((uint8_t*)pRoot->pStart + MEM_MANAGE_MEM_STRUCT_SIZE);//ÏÂÒ»¸ö¿éµÄ±íÍ·µØÖ·
- align_addr->mem_size = align_size;
- align_addr->next_node = NULL;
- pRoot->pStart->mem_size = 0;
- pRoot->pStart->next_node = align_addr;
- pRoot->total_size = align_addr->mem_size;
- }
- else {//ÄÚ´æÌ«Ð¡ÁË£¬½«µ±Ç°ÄÚ´æ¿éµØÖ·¼ÇΪstart
- pRoot->total_size = 0;
- pRoot->pStart->mem_size = 0;
- }
- }
- else {
- if (pPriv_node == NULL) {
- pRoot->err_flag = MEM_NO_INIT;
- return false;
- }
- pPriv_node->next_node = align_addr;//¸üÐÂÉÏÒ»½ÚµãµÄnext_node
- pRoot->total_size += align_size;
- }
- pPriv_node = align_addr;
- }
- if (pPriv_node == NULL) {
- pRoot->err_flag = MEM_NO_INIT;
- return false;
- }
- //´Ëʱ£¬pPriv_nodeΪ×îºóÒ»¸ö¿é£¬½ÓÏÂÀ´ÔÚ¿éβ·ÅÖñíβend
- //Çó³ö·ÅÖÃend¿éµÄµØÖ·,end¿é½öÊÇ·½±ã±éÀúʹÓã¬Òò´Ë¾¡Á¿Ð¡£¬·ÖÅäΪMEM_MANAGE_MEM_STRUCT_SIZE
- align_addr = (Mem_Node*)Mem_Manage_Align_Down(\
- (size_t)Mem_Manage_Mem_To_Addr(pPriv_node) + pPriv_node->mem_size - MEM_MANAGE_MEM_STRUCT_SIZE, MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
- align_size = (uint8_t*)align_addr-(uint8_t*)Mem_Manage_Mem_To_Addr(pPriv_node);//Çó³ö·ÖÅä³öend¿éºó£¬Ç°Ò»¸ö¿éÊ£Óà´óС
- if (align_size >= MEM_MANAGE_MINUM_MEM_SIZE) {//ÈôʣϵĿé×ã¹»´ó
- pRoot->total_size -= pPriv_node->mem_size - align_size;//È¥µô·ÖÅäend¿éÏûºÄµÄÄÚ´æ
- pRoot->pEnd = align_addr; //¸üбíβµÄµØÖ·
- pPriv_node->next_node = align_addr;
- pPriv_node->mem_size = align_size;
- align_addr->next_node = NULL;
- align_addr->mem_size = 0;//end¿é²»²ÎÓëÄÚ´æ·ÖÅ䣬Òò´ËÖ±½ÓΪ0¾Í¿ÉÒÔ
- }
- else {//×îºóÒ»¸ö¿é̫СÁË£¬Ö±½Ó×÷Ϊend¿é
- pRoot->pEnd = pPriv_node;
- pRoot->total_size -= pPriv_node->mem_size;
- }
- if(pRoot->pStart==NULL||pRoot->pEnd==NULL){
- pRoot->err_flag=MEM_NO_INIT;
- return false;
- }
- Mem_Settle(pRoot);
- pRoot->err_flag=MEM_NO_ERR;
- pRoot->remain_size=pRoot->total_size;
- return true;
- }
- //ÄÚ´æ³Ø³õʼ»¯
- //mem_addr:ÄÚ´æ³ØÊ×µØÖ·
- //mem_size:ÄÚ´æ³Ø´óС
- //return: true ³õʼ»¯³É¹¦;
- // false ³õʼ»¯Ê§°Ü
- bool Mem_Manage_Pool_Init(void* mem_addr,size_t mem_size){
- void* paddr=(uint8_t*)Mem_Manage_Align_Up((size_t)mem_addr,MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT)+MEM_MANAGE_MEM_ROOT_SIZE;
- Mem_Root* root_addr=(Mem_Root*)Mem_Manage_Align_Up((size_t)mem_addr,MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
- size_t align_size=(uint8_t*)paddr-(uint8_t*)mem_addr;
- Mem_Region buf_region[]={
- 0,0,
- NULL,0
- };
- if(mem_size<align_size)
- return 0;
- mem_size-=align_size;
- if(mem_size<2*MEM_MANAGE_MEM_STRUCT_SIZE+MEM_MANAGE_MINUM_NODE_SIZE)
- return 0;
- buf_region[0].addr=paddr;
- buf_region[0].mem_size=mem_size;
- return Mem_Manage_Init(root_addr,buf_region);
- }
- //ÓëC¿âº¯Êýmalloc×÷ÓÃÏàͬ
- //mem_addr:ÄÚ´æ³ØÊ×µØÖ·
- //want_size:ÆÚÍû·ÖÅäÄÚ´æ´óС
- //return: NULL ·ÖÅäʧ°Ü£¨ÄÚ´æ²»×ã»òÕß´íÎó±ê¼Ç²»ÎªMEM_NO_ERR£©£»
- // ÆäËûÖµ ·ÖÅä³É¹¦
- void* Mem_Manage_Pool_Malloc(void* mem_addr,size_t want_size){
- Mem_Root* root_addr=(Mem_Root*)Mem_Manage_Align_Up((size_t)mem_addr,MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
- return Mem_Manage_Malloc(root_addr,want_size);
- }
- //ÓëC¿âº¯Êýrealloc×÷ÓÃÏàͬ
- //mem_addr:ÄÚ´æ³ØÊ×µØÖ·
- //src_addr:Ô´µØÖ·Ö¸Õë
- //want_size:ÆÚÍû·ÖÅäÄÚ´æ´óС
- //return: NULL ·ÖÅäʧ°Ü£¨ÄÚ´æ²»×ã»òÕß´íÎó±ê¼Ç²»ÎªMEM_NO_ERR£©£»
- // ÆäËûÖµ ·ÖÅä³É¹¦
- void* Mem_Manage_Pool_Realloc(void* mem_addr,void* src_addr,size_t want_size){
- Mem_Root* root_addr=(Mem_Root*)Mem_Manage_Align_Up((size_t)mem_addr,MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
- return Mem_Manage_Realloc(root_addr,src_addr,want_size);
- }
- //ÓëC¿âº¯Êýaligned_alloc×÷ÓÃÒ»ÖÂ
- //mem_addr:ÄÚ´æ³ØÊ×µØÖ·
- //align_size:ÆÚÍû·ÖÅäµÄÄڴ漸×Ö½Ú¶ÔÆë£¨8¡¢16¡¢32...)
- //want_size:ÆÚÍû·ÖÅäÄÚ´æ´óС
- //return: NULL ·ÖÅäʧ°Ü£¨ÄÚ´æ²»×ã»òÕß¾ä±ú´íÎó±ê¼Ç²»ÎªMEM_NO_ERR£©£»
- // ÆäËûÖµ ·ÖÅä³É¹¦
- void* Mem_Manage_Pool_Aligned_Alloc(void* mem_addr,size_t align_byte,size_t want_size){
- Mem_Root* root_addr=(Mem_Root*)Mem_Manage_Align_Up((size_t)mem_addr,MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
- return Mem_Manage_Aligned_Alloc(root_addr,align_byte,want_size);
- }
- //ÓëC¿âº¯Êýfree×÷ÓÃÒ»ÖÂ
- //mem_addr:ÄÚ´æ³ØÊ×µØÖ·
- //free_addr:ÊÍ·ÅÄÚ´æµÄÊ×µØÖ·
- //return:ÎÞ·µ»ØÖµ
- void Mem_Manage_Pool_Free(void* mem_addr,void* free_addr){
- Mem_Root* root_addr=(Mem_Root*)Mem_Manage_Align_Up((size_t)mem_addr,MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
- Mem_Manage_Free(root_addr,free_addr);
- }
- //»ñÈ¡ÄÚ´æ³ØµÄ״̬
- //mem_addr:ÄÚ´æ³ØÊ×µØÖ·
- //pState:״̬ÐÅÏ¢½á¹¹ÌåÖ¸Õë
- //return:ÎÞ·µ»ØÖµ
- void Mem_Manage_Pool_Get_State(void* mem_addr,Mem_State* pState){
- Mem_Root* root_addr=(Mem_Root*)Mem_Manage_Align_Up((size_t)mem_addr,MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
- Mem_Manage_Get_State(root_addr,pState);
- }
- //»ñÈ¡ÄÚ´æ³Ø×ÜÈÝÁ¿
- //mem_addr:ÄÚ´æ³ØÊ×µØÖ·
- //return:ÄÚ´æÇø×ÜÈÝÁ¿£¨µ¥Î»£ºbyte£©
- size_t Mem_Manage_Pool_Get_Total_Size(const void* mem_addr){
- Mem_Root* root_addr=(Mem_Root*)Mem_Manage_Align_Up((size_t)mem_addr,MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
- return Mem_Manage_Get_Total_Size(root_addr);
- }
- //»ñÈ¡ÄÚ´æ³ØÊ£ÓàÈÝÁ¿
- //mem_addr:ÄÚ´æ³ØÊ×µØÖ·
- //return:ÄÚ´æÇøÊ£ÓàÈÝÁ¿£¨µ¥Î»£ºbyte£©
- size_t Mem_Manage_Pool_Get_Remain_Size(const void* mem_addr){
- Mem_Root* root_addr=(Mem_Root*)Mem_Manage_Align_Up((size_t)mem_addr,MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
- return Mem_Manage_Get_Remain_Size(root_addr);
- }
- //»ñÈ¡ÄÚ´æ³Ø´íÎó±ê¼Ç
- //mem_addr:ÄÚ´æ³ØÊ×µØÖ·
- //return:´íÎó±ê¼Ç
- Mem_Err_Type Mem_Manage_Pool_Get_Errflag(const void* mem_addr){
- Mem_Root* root_addr=(Mem_Root*)Mem_Manage_Align_Up((size_t)mem_addr,MEM_MANAGE_ALIGNMENT_BYTE_DEFAULT);
- return Mem_Manage_Get_Errflag(root_addr);
- }
¸´ÖÆ´úÂë
|
ÆÀ·Ö
-
²é¿´È«²¿ÆÀ·Ö
|