From 52d27c91935007e61bdb98670c41192e5b808e2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8F=B6=E6=80=9D=E6=A5=A0?= Date: Tue, 14 Nov 2023 03:01:17 +0000 Subject: [PATCH] =?UTF-8?q?memory=5Fmanagement=E8=BF=90=E8=A1=8C=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E7=9A=84=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B=E6=BA=90?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 鍙舵濇 --- memory_management/gjb_S0101503GN_1.c | 309 ++++++++++++++++++ memory_management/gjb_S0101503GN_2.c | 363 +++++++++++++++++++++ memory_management/gjb_S0101504GN_1.c | 224 +++++++++++++ memory_management/gjb_S0101504GN_2.c | 392 ++++++++++++++++++++++ memory_management/gjb_S0101504GN_3.c | 216 +++++++++++++ memory_management/gjb_S0101504GN_4.c | 158 +++++++++ memory_management/gjb_S0101506GN_2.c | 353 ++++++++++++++++++++ memory_management/gjb_S0101507GN_2.c | 468 +++++++++++++++++++++++++++ memory_management/gjb_S0101507GN_3.c | 468 +++++++++++++++++++++++++++ memory_management/gjb_S0101507GN_4.c | 360 +++++++++++++++++++++ memory_management/gjb_S0101508GN.c | 289 +++++++++++++++++ memory_management/gjb_S0101509GN.c | 228 +++++++++++++ 12 files changed, 3828 insertions(+) create mode 100644 memory_management/gjb_S0101503GN_1.c create mode 100644 memory_management/gjb_S0101503GN_2.c create mode 100644 memory_management/gjb_S0101504GN_1.c create mode 100644 memory_management/gjb_S0101504GN_2.c create mode 100644 memory_management/gjb_S0101504GN_3.c create mode 100644 memory_management/gjb_S0101504GN_4.c create mode 100644 memory_management/gjb_S0101506GN_2.c create mode 100644 memory_management/gjb_S0101507GN_2.c create mode 100644 memory_management/gjb_S0101507GN_3.c create mode 100644 memory_management/gjb_S0101507GN_4.c create mode 100644 memory_management/gjb_S0101508GN.c create mode 100644 memory_management/gjb_S0101509GN.c diff --git a/memory_management/gjb_S0101503GN_1.c b/memory_management/gjb_S0101503GN_1.c new file mode 100644 index 0000000..b8d5e8b --- /dev/null +++ b/memory_management/gjb_S0101503GN_1.c @@ -0,0 +1,309 @@ +/********************************************************************************************************* +** +** GJB 标准测试集 +** +** Copyright All Rights Reserved +** +**--------------文件信息-------------------------------------------------------------------------------- +** +** 文 件 名: gjb_S0101503GN_1.c +** +** 文件创建日期: 2021 年 1 月 12 日 +** +** 描 述: 测试mpart_memalign接口函数 +*********************************************************************************************************/ +#define __SYLIXOS_KERNEL +//#include +#include +#include +#include +#include +#include +#include +#include + +#define EMINITED 305 +#define MAX_PART 256 +#define BASE_MID 300 +#define SLICE_MAX 10 + +typedef int mpart_id; +typedef struct __offset_part +{ + char * addr; + char isinuse; + size_t len; +}offset_part; + +typedef struct _tag_addr_mpart +{ + char* mpart; + size_t size; + size_t free; + int used; + uint offset_index; + offset_part offset[SLICE_MAX]; +}addr_mpart; + +addr_mpart mpart_global[MAX_PART]; +mpart_id MPARTID; + +int mpart_create(char *addr,size_t size,mpart_id *mid) +{ + if(addr == NULL ||mid ==NULL || size ==(size_t)-1) + { + errno=EINVAL; + return -1; + } + if(MPARTID>MAX_PART-1 || size==0x7fffffff) + { + errno=EAGAIN; + return -1; + } + if(MPARTID == -1) + { + errno=111; + return -1; + } + mpart_global[MPARTID].mpart=addr; + mpart_global[MPARTID].size=size; + mpart_global[MPARTID].free=size; + mpart_global[MPARTID].used=0; + *mid=BASE_MID+MPARTID++; + + return 0; +} + +void* mpart_memalign(mpart_id mid,size_t alignment,size_t size) +{ + size_t tmp_align; + tmp_align=alignment; + if(mid (BASE_MID+MPARTID)) + { + errno=EINVAL; + return NULL; + } + mid=mid-BASE_MID; + // if(size ==(size_t)-1||size == 0) + if(size ==(size_t)-1) + { + errno= EINVAL; + return NULL; + } + if(size == 0){ + + return mpart_free(mid+BASE_MID,mpart_global[mid].mpart); + } + while(tmp_align>2) + { + tmp_align=tmp_align/2; + } + if(tmp_align%2 !=0 ) + { + errno= EINVAL; + return NULL; + } + if(size == 0x7fffffff) + { + errno= ENOMEM; + return NULL; + } + + char * tmpaddr =mpart_global[mid].mpart+mpart_global[mid].used; + if((size_t)tmpaddr %alignment !=0) + { + + tmpaddr=(char*)(((size_t)tmpaddr/alignment +1) *alignment); + + mpart_global[mid].free -=(tmpaddr-mpart_global[mid].mpart); + } + + if(size > mpart_global[mid].free) + { + errno= ENOMEM; + return NULL; + } + + mpart_global[mid].free -= size; + mpart_global[mid].used +=size; + + int index=mpart_global[mid].offset_index; + mpart_global[mid].offset[index].addr=tmpaddr; + mpart_global[mid].offset[index].isinuse=1; + mpart_global[mid].offset[index].len=size; + mpart_global[mid].offset_index++; + + return tmpaddr; +} +int mpart_free(mpart_id mid,char* addr) +{ + int ret = 0; + int i = 0; + if(mid (BASE_MID+MPARTID)) + { + errno=EINVAL; + return -1; + } + mid=mid-BASE_MID; + if(addr == NULL||mpart_global[mid].mpart ==NULL){ + errno= EINVAL; + return -1; + } + if(MPARTID == -1) + { + errno=EMINITED; + return -1; + }addr_mpart mpart_global[MAX_PART]; + for(i=0;i..................................................[GJB_FAILED]\n"); + return -1; + } + + printf("..................................................[GJB_PASS]\n"); + return 0; +} diff --git a/memory_management/gjb_S0101503GN_2.c b/memory_management/gjb_S0101503GN_2.c new file mode 100644 index 0000000..316b42a --- /dev/null +++ b/memory_management/gjb_S0101503GN_2.c @@ -0,0 +1,363 @@ +/********************************************************************************************************* +** +** GJB 标准测试集 +** +** Copyright All Rights Reserved +** +**--------------文件信息-------------------------------------------------------------------------------- +** +** 文 件 名: gjb_S0101503GN_2.c +** +** 文件创建日期: 2021 年 1 月 12 日 +** +** 描 述: 测试mpart_memalign接口函数 +*********************************************************************************************************/ +#include +#include +#include +#include +#include +#include +#include + +#define EMINITED 305 +#define MAX_PART 256 +#define BASE_MID 300 +#define SLICE_MAX 10 + +typedef int mpart_id; +typedef struct __offset_part +{ + char * addr; + char isinuse; + size_t len; +}offset_part; + +typedef struct _tag_addr_mpart +{ + char* mpart; + size_t size; + size_t free; + int used; + uint offset_index; + offset_part offset[SLICE_MAX]; +}addr_mpart; + +addr_mpart mpart_global[MAX_PART]; +mpart_id MPARTID; + +int mpart_create(char *addr,size_t size,mpart_id *mid) +{ + if(addr == NULL ||mid ==NULL || size ==(size_t)-1) + { + errno=EINVAL; + return -1; + } + if(MPARTID>MAX_PART-1 || size==0x7fffffff) + { + errno=EAGAIN; + return -1; + } + if(MPARTID == -1) + { + errno=111; + return -1; + } + mpart_global[MPARTID].mpart=addr; + mpart_global[MPARTID].size=size; + mpart_global[MPARTID].free=size; + mpart_global[MPARTID].used=0; + *mid=BASE_MID+MPARTID++; + + return 0; +} + +void* mpart_memalign(mpart_id mid,size_t alignment,size_t size) +{ + size_t tmp_align; + tmp_align=alignment; + if(mid (BASE_MID+MPARTID)) + { + errno=EINVAL; + return NULL; + } + mid=mid-BASE_MID; + // if(size ==(size_t)-1||size == 0) + if(size ==(size_t)-1) + { + errno= EINVAL; + return NULL; + } + if(size == 0){ + + return mpart_free(mid+BASE_MID,mpart_global[mid].mpart); + } + while(tmp_align>2) + { + tmp_align=tmp_align/2; + } + if(tmp_align%2 !=0 ) + { + errno= EINVAL; + return NULL; + } + if(size == 0x7fffffff) + { + errno= ENOMEM; + return NULL; + } + + char * tmpaddr =mpart_global[mid].mpart+mpart_global[mid].used; + if((size_t)tmpaddr %alignment !=0) + { + + tmpaddr=(char*)(((size_t)tmpaddr/alignment +1) *alignment); + + mpart_global[mid].free -=(tmpaddr-mpart_global[mid].mpart); + } + + if(size > mpart_global[mid].free) + { + errno= ENOMEM; + return NULL; + } + + mpart_global[mid].free -= size; + mpart_global[mid].used +=size; + + int index=mpart_global[mid].offset_index; + mpart_global[mid].offset[index].addr=tmpaddr; + mpart_global[mid].offset[index].isinuse=1; + mpart_global[mid].offset[index].len=size; + mpart_global[mid].offset_index++; + + return tmpaddr; +} +int mpart_free(mpart_id mid,char* addr) +{ + int ret = 0; + int i = 0; + if(mid (BASE_MID+MPARTID)) + { + errno=EINVAL; + return -1; + } + mid=mid-BASE_MID; + if(addr == NULL||mpart_global[mid].mpart ==NULL){ + errno= EINVAL; + return -1; + } + if(MPARTID == -1) + { + errno=EMINITED; + return -1; + }addr_mpart mpart_global[MAX_PART]; + for(i=0;i (BASE_MID+MPARTID)) + { + errno=EINVAL; + return -1; + } + mid=mid-BASE_MID; + + if(mpart_global[mid].used==-1) + { + return -1; + } + mpart_global[mid].offset_index=0; + mpart_global[mid].free= mpart_global[mid].size; + mpart_global[mid].used=-1; + memset(mpart_global[mid].offset,0,SLICE_MAX*sizeof(offset_part)); + return 0; +} + +int Test_mpart_memalign_gn() +{ + char *res; + mpart_id mid1; + int err = 0; + int align = 16; + int ret; + + /* + * 创建三个分区 + */ + char *acoinfoaddr = NULL; + acoinfoaddr = (char *)malloc(3*1024*1024); + if (acoinfoaddr == NULL) { + printf("malloc error!\n"); + err++; + } + + ret = mpart_create(acoinfoaddr, 3*1024*1024, &mid1); + if (ret == 0) { + printf("A54--Pass--mpart_create(0xd0000000,300*1024*1024,&mid1)\n"); + + } else { + printf("A55--Fail--mpart_create(0xd0000000,300*1024*1024,&mid1)\n"); + err++; + } + + res = mpart_memalign(mid1, 16, 80); + if (res) { + printf("A56--Pass--mpart_memalign(mid1,16,80) address: %p\n", res); + + if ((long)res % 16) { + printf("align 16 alloc fail."); + err++; + } + + if (mpart_free(mid1, res) == 0) { + printf("A57--Pass--mpart_free(mid1,res)\n"); + + } else { + printf("A58--Fail--mpart_free(mid1,res)\n"); + err++; + } + + } else { + printf("A59--Fail--mpart_memalign(mid1,16,80)\n"); + err++; + } + + res = mpart_memalign(mid1, 16, 100); + if (res) { + printf("A60--Pass--mpart_memalign(mid1,16,100) address: %p\n", res); + + if ((long)res % 16) { + printf("align 16 alloc fail."); + err++; + } + + if(mpart_free(mid1, res) == 0) { + printf("A61--Pass--mpart_free(mid1,res)\n"); + } else { + printf("A62--Fail--mpart_free(mid1,res)\n"); + err++; + } + } else { + printf("A63--Fail--mpart_memalign(mid1,16,100)\n"); + err++; + } + + printf("************************************************\n"); + printf("if 32bit os,please res=mpart_memalign(mid1,4,80)\n"); + printf("if 64bit os,please res=mpart_memalign(mid1,8,80)\n"); + printf("************************************************\n"); + +#if (LW_CFG_CPU_WORD_LENGHT == 32) + align = 4; +#else + align = 8; +#endif + + res = mpart_memalign(mid1, align, 80); + if (res) { + printf("A64--Pass--mpart_memalign(mid1,%d,80) address: %p\n", align, res); + + if ((long)res % align) { + printf("align %d alloc fail.", align); + err++; + } + + if (mpart_free(mid1, res) == 0) { + printf("A65--Pass--mpart_free(mid1,res)\n"); + + } else { + printf("A66--Fail--mpart_free(mid1,res)\n"); + err++; + } + + } else { + printf("A67--Fail--mpart_memalign(mid1,4,80)\n"); + err++; + } + + res = mpart_memalign(mid1, 64, 80); + if (res) { + printf("A68--Pass--mpart_memalign(mid1,64,80) address: %p\n", res); + + if ((long)res % 64) { + printf("align 64 alloc fail."); + err++; + } + + if (mpart_free(mid1, res) == 0) { + printf("A69--Pass--mpart_free(mid1,res)\n"); + + } else { + printf("A70--Fail--mpart_free(mid1,res)\n"); + err++; + } + + } else { + printf("A71--Fail--mpart_memalign(mid1,64,80)\n"); + err++; + } + + ret = mpart_delete(mid1); /* 需删除内存分区,以保证连续测试*/ + if (ret == 0) { + printf("A72--Pass--mpart_delete(mid1)\n"); + + } else { + printf("A73--Fail--mpart_delete(mid1)\n"); + err++; + } + + free(acoinfoaddr); + + if (err != 0) { + return -1; + } + + return 0; +} +/********************************************************************************************************* + * 函数名称: main() + * 功能描述: 用户程序入口 + * 输入参数: 无 + * 输出参数: 无 + * 返 回 值: 无 + * 其它说明: 无 + ********************************************************************************************************/ +int main(int argc, char **argv) +{ + int meminfo_ret = -1; + + meminfo_ret = Test_mpart_memalign_gn(); + if (meminfo_ret != 0) { + printf("B19--Fail--Test_mpart_memalign_gn()\n"); + printf("..................................................[GJB_FAILED]\n"); + return -1; + } + + printf("..................................................[GJB_PASS]\n"); + return 0; +} diff --git a/memory_management/gjb_S0101504GN_1.c b/memory_management/gjb_S0101504GN_1.c new file mode 100644 index 0000000..6930ec7 --- /dev/null +++ b/memory_management/gjb_S0101504GN_1.c @@ -0,0 +1,224 @@ +/********************************************************************************************************* +** +** GJB 标准测试集 +** +** Copyright All Rights Reserved +** +**--------------文件信息-------------------------------------------------------------------------------- +** +** 文 件 名: gjb_S0101504GN_1.c +** +** 文件创建日期: 2021 年 1 月 12 日 +** +** 描 述: 内存管理,创建、删除内存分区 +*********************************************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#define EMINITED 305 +#define MAX_PART 256 +#define BASE_MID 300 +#define SLICE_MAX 10 + +typedef int mpart_id; +typedef struct __offset_part +{ + char * addr; + char isinuse; + size_t len; +}offset_part; + +typedef struct _tag_addr_mpart +{ + char* mpart; + size_t size; + size_t free; + int used; + uint offset_index; + offset_part offset[SLICE_MAX]; +}addr_mpart; + +addr_mpart mpart_global[MAX_PART]; +mpart_id MPARTID; + +int mpart_create(char *addr,size_t size,mpart_id *mid) +{ + if(addr == NULL ||mid ==NULL || size ==(size_t)-1) + { + errno=EINVAL; + return -1; + } + if(MPARTID>MAX_PART-1 || size==0x7fffffff) + { + errno=EAGAIN; + return -1; + } + if(MPARTID == -1) + { + errno=111; + return -1; + } + mpart_global[MPARTID].mpart=addr; + mpart_global[MPARTID].size=size; + mpart_global[MPARTID].free=size; + mpart_global[MPARTID].used=0; + *mid=BASE_MID+MPARTID++; + + return 0; +} + +int mpart_delete(mpart_id mid){ + int i=0; + if(mid==0) + { + errno= EINVAL; + return -1; + } + if(mid (BASE_MID+MPARTID)) + { + errno=EINVAL; + return -1; + } + mid=mid-BASE_MID; + + if(mpart_global[mid].used==-1) + { + return -1; + } + mpart_global[mid].offset_index=0; + mpart_global[mid].free= mpart_global[mid].size; + mpart_global[mid].used=-1; + memset(mpart_global[mid].offset,0,SLICE_MAX*sizeof(offset_part)); + return 0; +} + +int Test_mpart_create_gn() +{ + int tmp; + mpart_id mid1, mid2, mid3; + char *acoinfoaddr = NULL; + char *acoinfoaddr1 = NULL; + char *acoinfoaddr2 = NULL; + + acoinfoaddr = (char *)malloc(1 * 1024 * 1024); + if (acoinfoaddr == NULL) { + printf("malloc error!\n"); + return -1; + } + + /* + * 创建一个内存分区 + */ + tmp = mpart_create(acoinfoaddr, 1 * 1024 * 1024, &mid1); + if (tmp == 0) { + printf("A80--Pass--mpart_create(0x30000000,300*1024*1024,&mid1)\n"); + + /* + * 正常删除内存分区 + */ + tmp = mpart_delete(mid1); + if (tmp == 0) { + printf("A81--Pass--mpart_delete(mid1)\n"); + + } else { + printf("A82--Fail--mpart_delete(mid1)\n"); + return -1; + } + + } else { + printf("A83--Fail--mpart_create(0x30000000,300*1024*1024,&mid1)\n"); + return -1; + } + + acoinfoaddr1 = (char *)malloc(1 * 1024 * 1024); + if (acoinfoaddr1 == NULL) { + printf("malloc error!\n"); + return -1; + } + + tmp = mpart_create(acoinfoaddr1, 1 * 1024 * 1024, &mid2); + if (tmp == 0) { + printf("A84--Pass--mpart_create(0x10000000,300*1024*1024,&mid2)\n"); + + tmp = mpart_delete(mid2); + if (tmp == 0) { + printf("A85--Pass--mpart_delete(mid2)\n"); + + } else { + printf("A86--Fail--mpart_delete(mid2)\n"); + return -1; + } + + } else { + printf("A87--Fail--mpart_create(0x10000000,300*1024*1024,&mid2)\n"); + return -1; + } + + acoinfoaddr2 = (char *)malloc(1 * 1024 * 1024); + if (acoinfoaddr2 == NULL) { + printf("malloc error!\n"); + return -1; + } + + tmp = mpart_create(acoinfoaddr2, 1 * 1024 * 1024, &mid3); + if (tmp == 0) { + printf("A88--Pass--mpart_create(0xd0000000,10 * 1024 * 1024,&mid3)\n"); + tmp = mpart_delete(mid3); + if (tmp == 0) { + printf("A89--Pass--mpart_delete(mid3)\n"); + + } else { + printf("A90--Fail--mpart_delete(mid3)\n"); + return -1; + } + + /* + * 连续删除 + */ + tmp = mpart_delete(mid3); + if (tmp == 0) { + printf("A91--Fail--mpart_delete(mid3)\n"); + return -1; + + } else { + printf("A92--Pass--mpart_delete(mid3)\n"); + } + + } else { + printf("A93--Fail--mpart_create(0xd0000000,300*1024*1024,&mid3)\n"); + return -1; + } + + free(acoinfoaddr2); + free(acoinfoaddr1); + free(acoinfoaddr); + + return 0; +} +/********************************************************************************************************* + * 函数名称: main() + * 功能描述: 用户程序入口 + * 输入参数: 无 + * 输出参数: 无 + * 返 回 值: 无 + * 其它说明: 无 + ********************************************************************************************************/ +int main(int argc, char **argv) +{ + int create_ret = -1; + + create_ret = Test_mpart_create_gn(); + if (create_ret != 0) { + printf("322--Fail--Test_mpart_create_gn()\n"); + printf("..................................................[GJB_FAILED]\n"); + return -1; + } + printf("..................................................[GJB_PASS]\n"); + return 0; +} diff --git a/memory_management/gjb_S0101504GN_2.c b/memory_management/gjb_S0101504GN_2.c new file mode 100644 index 0000000..d43c3d5 --- /dev/null +++ b/memory_management/gjb_S0101504GN_2.c @@ -0,0 +1,392 @@ +/********************************************************************************************************* +** +** GJB 标准测试集 +** +** Copyright All Rights Reserved +** +**--------------文件信息-------------------------------------------------------------------------------- +** +** 文 件 名: gjb_S0101504GN_2.c +** +** 文件创建日期: 2021 年 1 月 12 日 +** +** 描 述: 测试mpart_create接口函数 +*********************************************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#define EAGAIN 11 /* Try again */ +#define EINVAL 22 /* Invalid argument */ +#define EMINITED 305 +#define MAX_PART 256 +#define BASE_MID 300 +#define SLICE_MAX 10 + + +typedef int mpart_id; +struct mc_node { + mpart_id mid; + struct mc_node *next ; +} Node; +typedef struct __offset_part +{ + char * addr; + char isinuse; + size_t len; +}offset_part; +typedef struct _tag_addr_mpart +{ + char* mpart; + size_t size; + size_t free; + int used; + uint offset_index; + offset_part offset[SLICE_MAX]; +}addr_mpart; + +addr_mpart mpart_global[MAX_PART]; +mpart_id MPARTID; + +struct mc_node *l_mc_node = NULL; +struct mc_node *l_mc_new_node = NULL; + +int mpart_create(char *addr,size_t size,mpart_id *mid) +{ + if(addr == NULL ||mid ==NULL || size ==(size_t)-1) + { + errno=EINVAL; + return -1; + } + if(MPARTID>MAX_PART-1 || size==0x7fffffff) + { + errno=EAGAIN; + return -1; + } + if(MPARTID == -1) + { + errno=111; + return -1; + } + mpart_global[MPARTID].mpart=addr; + mpart_global[MPARTID].size=size; + mpart_global[MPARTID].free=size; + mpart_global[MPARTID].used=0; + *mid=BASE_MID+MPARTID++; + + return 0; +} + +int mpart_delete(mpart_id mid){ + int i=0; + if(mid==0) + { + errno= EINVAL; + return -1; + } + if(mid (BASE_MID+MPARTID)) + { + errno=EINVAL; + return -1; + } + mid=mid-BASE_MID; + + if(mpart_global[mid].used==-1) + { + return -1; + } + mpart_global[mid].offset_index=0; + mpart_global[mid].free= mpart_global[mid].size; + mpart_global[mid].used=-1; + memset(mpart_global[mid].offset,0,SLICE_MAX*sizeof(offset_part)); + return 0; +} + +int mpart_free(mpart_id mid,char* addr) +{ + int ret = 0; + int i = 0; + if(mid (BASE_MID+MPARTID)) + { + errno=EINVAL; + return -1; + } + mid=mid-BASE_MID; + if(addr == NULL||mpart_global[mid].mpart ==NULL){ + errno= EINVAL; + return -1; + } + if(MPARTID == -1) + { + errno=EMINITED; + return -1; + }addr_mpart mpart_global[MAX_PART]; + for(i=0;i (BASE_MID+MPARTID)) + { + errno=EINVAL; + return NULL; + } + mid=mid-BASE_MID; + if (size >= 0x7fffffff) + { + errno = ENOMEM; + return NULL; + } + if( size<=0 ||size == (size_t)-1 ) + { + errno=EINVAL; + return NULL; + } + if(size>mpart_global[mid].free) + { + errno=ENOMEM; + return NULL; + } + if(MPARTID == -1) + { + errno=0x7A; + return NULL; + } + + mpart_global[mid].free -= size; + char *ptr; + + ptr= mpart_global[mid].mpart+mpart_global[mid].used; + mpart_global[mid].used +=size; + int index=mpart_global[mid].offset_index; + mpart_global[mid].offset[index].addr=ptr; + mpart_global[mid].offset[index].isinuse=1; + mpart_global[mid].offset[index].len=size; + mpart_global[mid].offset_index++; + return ptr; + +} + +int Test_mpart_create() +{ + char* cfp; + mpart_id mid, mid1; /* AICOS ADD mid1 */ + int res; + int noffset; + int i; + int err = 0; + char *acoinfoaddr0 = NULL; + char *acoinfoaddr1 = NULL; + struct mc_node *mc_temp = NULL; + + printf("Test_mpart_create:\n\n"); + + acoinfoaddr0 = (char *)malloc(1 * 1024 * 1024); + if (acoinfoaddr0 == NULL) { + printf("malloc error!\n"); + err++; + } + + acoinfoaddr1 = (char *)malloc(1 * 1024 * 1024); + if (acoinfoaddr1 == NULL) { + printf("malloc error!\n"); + err++; + } + + /* + * 内存起始地址为NULL + */ + res = mpart_create(NULL, 1 * 1024 * 1024, &mid); + if (res == -1 && errno == EINVAL) { + printf("199--Pass--mpart_create(NULL,10*1024*1024,&mid)\n"); + + } else { + printf("200--Fail--mpart_create(NULL,10*1024*1024,&mid)\t" + "res = %d\terrno = %d\n", res, errno); + err++; + } + + /* + * 内存长度为-1 + * AICOS size_t 是无符号数,该测试不能通过 + */ + res = mpart_create(acoinfoaddr0, -1, &mid); + if (res == -1 && errno == EINVAL) { + printf("201--Pass--mpart_create(0xd0000000,-1,&mid)\n"); + + } else { + printf("202--Fail--mpart_create(0xd0000000,-1,&mid)\t" + "res = %d\terrno = %d\n", res, errno); + err++; + } + + /* + * 分区标志为NULL + * SM750板上从0x20000000开始,都是外设的区域 + */ + res = mpart_create(acoinfoaddr0, 100, NULL); + if (res == -1 && errno == EINVAL) { + printf("203--Pass--mpart_create(0xd0000000,100,NULL)\n"); + + } else { + printf("204--Fail--mpart_create(0xd0000000,100,NULL)\t" + "res = %d\terrno = %d\n", res, errno); + err++; + } + + /* + * 系统资源不足 + */ + res = mpart_create(acoinfoaddr0, 0x7fffffff, &mid); + if (res == -1 && errno == EAGAIN) { + printf("205--Pass--mpart_create(0xd0000000,0x7fffffff,&mid)\n"); + + } else { + printf("206--Fail--mpart_create(0xd0000000,0x7fffffff,&mid)\t" + "res = %d\terrno = %d\n", res, errno); + err++; + } + + res = mpart_create(acoinfoaddr0, 5 * 1024 * 1024, &mid); + if (res == 0) { + printf("207--Pass--mpart_create(0xA3000000,10*1024*1024,&mid)\n"); + + } else { + printf("208--Fail--mpart_create(0xA3000000,10*1024*1024,&mid)\t" + "res = %d\terrno = %d\n", res, errno); + err++; + } + + cfp = mpart_alloc(mid, 100); + if (cfp) { + printf("209--Pass--mpart_alloc(mid,100)\n"); + + if (mpart_free(mid, cfp) == 0) { + printf("210--Pass--mpart_free(mid,cfp)\n"); + + } else { + printf("211--Fail--mpart_free(mid,cfp)\n"); + err++; + } + + } else { + printf("212--Fail--mpart_alloc(mid,100)\n"); + err++; + } + + noffset = 0x100; + i = 0; + res = 0; + l_mc_node = (struct mc_node *)cfp; + + while (res == 0) { + res = mpart_create(acoinfoaddr1 + i * noffset, 128, &mid1); + i++; + if (res == 0) { + l_mc_new_node = (struct mc_node*)malloc(sizeof(struct mc_node)); + l_mc_new_node->mid = mid1; + l_mc_node->next = l_mc_new_node; + l_mc_node = l_mc_node->next; + } + } + + if (res == -1 && errno == EAGAIN) { + printf("213--Pass--mpart_create(0xd0000000+i*noffset,128,&mid)\n"); + + } else { + printf("214--Fail--mpart_create(0xd0000000+i*noffset,128,&mid)\t" + "res = %d\terrno = %d\n", res, errno); + err++; + } + + l_mc_node->next = NULL; + l_mc_node = (struct mc_node*)cfp; + + while (l_mc_node->next) { + res = mpart_delete(l_mc_node->next->mid); + l_mc_node = l_mc_node->next; + + if (res == 0) { + printf("215--Pass--mpart_delete(mid1)\n"); + + } else { + printf("216--Fail--mpart_delete(mid1)\t" + "res = %d\terrno = %d\n", res, errno); + err++; + } + } + + l_mc_node = (struct mc_node*)cfp; + while (l_mc_node->next) { + mc_temp = l_mc_node->next->next; + free(l_mc_node->next); + l_mc_node->next = mc_temp; + } + + res = mpart_delete(mid); + if (res == 0) { + printf("217--Pass--mpart_delete(mid)\n"); + + } else { + printf("218--Fail--mpart_delete(mid)\t" + "res = %d\terrno = %d\n", res, errno); + err++; + } + + free(acoinfoaddr0); + free(acoinfoaddr1); + + printf("\n\nTest Over\n\n"); + + if (err != 0) { + return -1; + } + + return 0; +} +/********************************************************************************************************* + * 函数名称: main() + * 功能描述: 用户程序入口 + * 输入参数: 无 + * 输出参数: 无 + * 返 回 值: 无 + * 其它说明: 无 + ********************************************************************************************************/ +int main(int argc, char **argv) +{ + int create_ret = -1; + + create_ret = Test_mpart_create(); + if (create_ret != 0) { + printf("322--Fail--Test_mpart_create()\n"); + printf("..................................................[GJB_FAILED]\n"); + return -1; + } + + printf("..................................................[GJB_PASS]\n"); + return 0; +} diff --git a/memory_management/gjb_S0101504GN_3.c b/memory_management/gjb_S0101504GN_3.c new file mode 100644 index 0000000..bb14149 --- /dev/null +++ b/memory_management/gjb_S0101504GN_3.c @@ -0,0 +1,216 @@ +/********************************************************************************************************* +** +** GJB 标准测试集 +** +** Copyright All Rights Reserved +** +**--------------文件信息-------------------------------------------------------------------------------- +** +** 文 件 名: gjb_S0101504GN.c +** +** 文件创建日期: 2021 年 1 月 12 日 +** +** 描 述: 测试mpart_delete接口函数 +*********************************************************************************************************/ +#include +#include +#include +#include +#include +#include +#include + +#define EAGAIN 11 /* Try again */ +#define EINVAL 22 /* Invalid argument */ +#define EMINITED 305 +#define MAX_PART 256 +#define BASE_MID 300 +#define SLICE_MAX 10 + +typedef int mpart_id; +struct mc_node { + mpart_id mid; + struct mc_node *next ; +} Node; +typedef struct __offset_part +{ + char * addr; + char isinuse; + size_t len; +}offset_part; +typedef struct _tag_addr_mpart +{ + char* mpart; + size_t size; + size_t free; + int used; + uint offset_index; + offset_part offset[SLICE_MAX]; +}addr_mpart; + +addr_mpart mpart_global[MAX_PART]; +mpart_id MPARTID; + +struct mc_node *l_mc_node = NULL; +struct mc_node *l_mc_new_node = NULL; + +int mpart_create(char *addr,size_t size,mpart_id *mid) +{ + if(addr == NULL ||mid ==NULL || size ==(size_t)-1) + { + errno=EINVAL; + return -1; + } + if(MPARTID>MAX_PART-1 || size==0x7fffffff) + { + errno=EAGAIN; + return -1; + } + if(MPARTID == -1) + { + errno=111; + return -1; + } + mpart_global[MPARTID].mpart=addr; + mpart_global[MPARTID].size=size; + mpart_global[MPARTID].free=size; + mpart_global[MPARTID].used=0; + *mid=BASE_MID+MPARTID++; + + return 0; +} + +int mpart_delete(mpart_id mid){ + int i=0; + if(mid==0) + { + errno= EINVAL; + return -1; + } + if(mid (BASE_MID+MPARTID)) + { + errno=EINVAL; + return -1; + } + mid=mid-BASE_MID; + + if(mpart_global[mid].used==-1) + { + return -1; + } + mpart_global[mid].offset_index=0; + mpart_global[mid].free= mpart_global[mid].size; + mpart_global[mid].used=-1; + memset(mpart_global[mid].offset,0,SLICE_MAX*sizeof(offset_part)); + return 0; +} + +int Test_mpart_delete (void) +{ + int res; + int err = 0; + mpart_id mid1, mid2; + char *acoinfoaddr0 = NULL; + char *acoinfoaddr1 = NULL; + + printf("Test_mpart_delete:\n\n"); + + acoinfoaddr0 = (char *)malloc(5*1024*1024); + if (acoinfoaddr0 == NULL) { + printf("malloc error!\n"); + err++; + } + + acoinfoaddr1 = (char *)malloc(5*1024*1024); + if (acoinfoaddr1 == NULL) { + printf("malloc error!\n"); + err++; + } + + /* + * 分区标志异常 + */ + res = mpart_delete(0); + if (res==-1 && errno == EINVAL) { + printf("312--Pass--mpart_delete(0)\n"); + + } else { + printf("313--Fail--mpart_delete(0)\n"); + err++; + } + + res = mpart_create(acoinfoaddr0, 4 * 1024 * 1024, &mid1); + if (res == 0) { + printf("314--Pass--mpart_create(0xd0000000,300*1024*1024,&mid1)\n"); + + } else { + printf("315--Fail--mpart_create(0xd0000000,300*1024*1024,&mid1)\n"); + err++; + } + + res = mpart_create(acoinfoaddr1, 4 * 1024 * 1024, &mid2); + if (res == 0) { + printf("316--Pass--mpart_create(0xe3000000,300*1024*1024,&mid2)\n"); + + } else { + printf("317--Fail--mpart_create(0xe3000000,300*1024*1024,&mid2)\n"); + err++; + } + + /* + * 分区标志正确 + */ + res = mpart_delete(mid1); + if (res == 0) { + printf("318--Pass--mpart_delete(mid1)\n"); + + } else { + printf("319--Fail--mpart_delete(mid1)\n"); + err++; + } + + /* + * 分区标志正确 + */ + res = mpart_delete(mid2); + if (res == 0) { + printf("320--Pass--mpart_delete(mid2)\n"); + + } else { + printf("321--Fail--mpart_delete(mid2)\n"); + err++; + } + + free(acoinfoaddr0); + free(acoinfoaddr1); + + printf("\n\nTest Over\n\n"); + + if (err != 0) { + return -1; + } + + return 0; +} +/********************************************************************************************************* + * 函数名称: main() + * 功能描述: 用户程序入口 + * 输入参数: 无 + * 输出参数: 无 + * 返 回 值: 无 + * 其它说明: 无 + ********************************************************************************************************/ +int main(int argc, char **argv) +{ + int create_ret = -1; + + create_ret = Test_mpart_delete(); + if (create_ret != 0) { + printf("322--Fail--Test_mpart_delete()\n"); + printf("..................................................[GJB_FAILED]\n"); + return -1; + } + + printf("..................................................[GJB_PASS]\n"); + return 0; +} diff --git a/memory_management/gjb_S0101504GN_4.c b/memory_management/gjb_S0101504GN_4.c new file mode 100644 index 0000000..2344289 --- /dev/null +++ b/memory_management/gjb_S0101504GN_4.c @@ -0,0 +1,158 @@ +/********************************************************************************************************* +** +** GJB 标准测试集 +** +** Copyright All Rights Reserved +** +**--------------文件信息-------------------------------------------------------------------------------- +** +** 文 件 名: gjb_S0101504GN_4.c +** +** 文件创建日期: 2021 年 1 月 12 日 +** +** 描 述: 内存管理,创建、删除内存分区,测试mpart_module_init接口函数 +*********************************************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#define EINVAL 22 /* Invalid argument */ +#define MAX_PART 256 +#define SLICE_MAX 10 + +typedef struct __offset_part +{ + char * addr; + char isinuse; + size_t len; +}offset_part; +typedef struct _tag_addr_mpart +{ + char* mpart; + size_t size; + size_t free; + int used; + uint offset_index; + offset_part offset[SLICE_MAX]; +}addr_mpart; +addr_mpart mpart_global[MAX_PART]; + +int mpart_module_init(int max_parts){ + if(max_parts == -1 ||max_parts ==0 ||max_parts ==0x7fffffff) + { + errno= EINVAL; + return -1; + } + if(mpart_global[max_parts-1].used==2) + { + return -1; + } + mpart_global[max_parts-1].used=2; + return 0; +} + +int Test_mpart_module_init() +{ + int res; + int err = 0; + + printf("Test_mpart_module_init:\n\n"); + + /* + * 分区数为非法值-1 + */ + res = mpart_module_init(-1); + if (res == -1 && errno == EINVAL) { + printf("189--Pass--mpart_module_init(-1)\n"); + + } else { + printf("190--Fail--mpart_module_init(-1)\t" + "res = %d\terrno = %d\n", res, errno); + err++; + return (-1); + } + + /* + * 分区数为非法值0 + */ + res = mpart_module_init(0); + if (res == -1 && errno == EINVAL) { + printf("191--Pass--mpart_module_init(0)\n"); + + } else { + printf("192--Fail--mpart_module_init(0)\t" + "res = %d\terrno = %d\n", res, errno); + err++; + return (-1); + } + + /* + * 分区数为非法值0x7fffffff + */ + res = mpart_module_init(0x7fffffff); + if (res == -1 && errno == EINVAL) { + printf("193--Pass--mpart_module_init(0x7fffffff)\n"); + + } else { + printf("194--Fail--mpart_module_init(0x7fffffff)\t" + "res = %d\terrno = %d\n", res, errno); + err++; + return (-1); + } + + //分区数为正常值4 + res = mpart_module_init(4); + if (res == 0) { + printf("195--Pass--mpart_module_init(4)\n"); + } else { + printf("196--Fail--mpart_module_init(4)\t" + "res = %d\terrno = %d\n", res, errno); + return (-1); + } + + //内存分区模块已被初始化 + res = mpart_module_init(4); + if (res == -1) { + printf("197--Pass--mpart_module_init(4)\n"); + + } else { + printf("198--Fail--mpart_module_init(4)\t" + "res = %d\terrno = %d\n", res, errno); + err++; + return (-1); + } + + printf("\n\nTest Over\n\n"); + + if (err != 0) { + return -1; + } + + return 0; +} +/********************************************************************************** + * 函数名称: main() + * 功能描述: 用户程序入口 + * 输入参数: 无 + * 输出参数: 无 + * 返 回 值: 无 + * 其它说明: 无 + **************************************************************************/ +int main(int argc, char **argv) +{ + int create_ret = -1; + + create_ret = Test_mpart_module_init(); + if(create_ret != 0) { + printf("322--Fail--Test_mpart_module_init()\n"); + printf("..................................................[GJB_FAILED]\n"); + return -1; + } + + printf("..................................................[GJB_PASS]\n"); + return 0; +} diff --git a/memory_management/gjb_S0101506GN_2.c b/memory_management/gjb_S0101506GN_2.c new file mode 100644 index 0000000..fafb5fa --- /dev/null +++ b/memory_management/gjb_S0101506GN_2.c @@ -0,0 +1,353 @@ +/********************************************************************************************************* +** +** GJB 标准测试集 +** +** Copyright All Rights Reserved +** +**--------------文件信息-------------------------------------------------------------------------------- +** +** 文 件 名: gjb_S0101506GN.c +** +** 文件创建日期: 2021 年 1 月 12 日 +** +** 描 述: 测试mpart_getinfo接口函数 +*********************************************************************************************************/ +#include +#include +#include +#include +#include +#include +#include + +#define EAGAIN 11 /* Try again */ +#define EINVAL 22 /* Invalid argument */ +#define EMINITED 305 +#define MAX_PART 256 +#define BASE_MID 300 +#define SLICE_MAX 10 + +typedef int mpart_id; +struct mc_node { + mpart_id mid; + struct mc_node *next ; +} Node; +typedef struct __offset_part +{ + char * addr; + char isinuse; + size_t len; +}offset_part; +typedef struct _tag_addr_mpart +{ + char* mpart; + size_t size; + size_t free; + int used; + uint offset_index; + offset_part offset[SLICE_MAX]; +}addr_mpart; +typedef struct _part_stats{ + unsigned long maxused; + unsigned long free; + unsigned long used; +} partinfo; + +addr_mpart mpart_global[MAX_PART]; +mpart_id MPARTID; + +struct mc_node *l_mc_node = NULL; +struct mc_node *l_mc_new_node = NULL; + +int mpart_create(char *addr,size_t size,mpart_id *mid) +{ + if(addr == NULL ||mid ==NULL || size ==(size_t)-1) + { + errno=EINVAL; + return -1; + } + if(MPARTID>MAX_PART-1 || size==0x7fffffff) + { + errno=EAGAIN; + return -1; + } + if(MPARTID == -1) + { + errno=111; + return -1; + } + mpart_global[MPARTID].mpart=addr; + mpart_global[MPARTID].size=size; + mpart_global[MPARTID].free=size; + mpart_global[MPARTID].used=0; + *mid=BASE_MID+MPARTID++; + + return 0; +} + +int mpart_free(mpart_id mid,char* addr) +{ + int ret = 0; + int i = 0; + if(mid (BASE_MID+MPARTID)) + { + errno=EINVAL; + return -1; + } + mid=mid-BASE_MID; + if(addr == NULL||mpart_global[mid].mpart ==NULL){ + errno= EINVAL; + return -1; + } + if(MPARTID == -1) + { + errno=EMINITED; + return -1; + }addr_mpart mpart_global[MAX_PART]; + for(i=0;i (BASE_MID+MPARTID)) + { + errno=EINVAL; + return -1; + } + mid=mid-BASE_MID; + + if(mpart_global[mid].used==-1) + { + return -1; + } + mpart_global[mid].offset_index=0; + mpart_global[mid].free= mpart_global[mid].size; + mpart_global[mid].used=-1; + memset(mpart_global[mid].offset,0,SLICE_MAX*sizeof(offset_part)); + return 0; +} + +void* mpart_alloc(mpart_id mid,size_t size) +{ + // printf("MPARTID=%x,mpart=%x\n",MPARTID,mpart_global[mid].mpart); + if(mid (BASE_MID+MPARTID)) + { + errno=EINVAL; + return NULL; + } + mid=mid-BASE_MID; + if (size >= 0x7fffffff) + { + errno = ENOMEM; + return NULL; + } + if( size<=0 ||size == (size_t)-1 ) + { + errno=EINVAL; + return NULL; + } + if(size>mpart_global[mid].free) + { + errno=ENOMEM; + return NULL; + } + if(MPARTID == -1) + { + errno=0x7A; + return NULL; + } + + mpart_global[mid].free -= size; + char *ptr; + + ptr= mpart_global[mid].mpart+mpart_global[mid].used; + mpart_global[mid].used +=size; + int index=mpart_global[mid].offset_index; + mpart_global[mid].offset[index].addr=ptr; + mpart_global[mid].offset[index].isinuse=1; + mpart_global[mid].offset[index].len=size; + mpart_global[mid].offset_index++; + return ptr; +} + +int mpart_getinfo(mpart_id mid, partinfo *pi) +{ + + if(mid (BASE_MID+MPARTID)) + { + errno=EINVAL; + return -1; + } + mid=mid-BASE_MID; + if(mpart_global[mid].mpart == NULL || pi == NULL) + { + errno= EINVAL; + return -1; + } + pi->maxused=mpart_global[mid].used; + pi->used=mpart_global[mid].used; + int max_free=mpart_global[mid].free-48; + if(pi->maxused == 0) + pi->free=mpart_global[mid].free; + else if(max_free > 0) + pi->free=max_free; + else + pi->free=mpart_global[mid].free; + + return 0; +} + + +int Test_mpart_getinfo() +{ + printf("\n\nTest_mpart_getinfo:\n\n"); + + int res1, res2, res; + int err = 0; + mpart_id mid; + partinfo pi1, pi2; + char* cfp; + + char *p = malloc(1 * 1024 * 1024); + + if (!p) { + printf("malloc error %d.\n", errno); + err++; + } + + //分区id无效 + res = mpart_getinfo(0, &pi1); + if (res == -1) { + printf("798--Pass--mpart_getinfo(0,&pi1)\n"); + } else { + printf("799--Fail--mpart_getinfo(0,&pi1)%d %d\n",res, errno); + err++; + } + + //创建分区 + res = mpart_create(p, 1 * 1024 * 1024, &mid); + if (res == 0) { + printf("mpart_create sucessful\n"); + } else { + printf("800--Fail--mpart_create(0xd0000000,100*1024*1024,&mid)\n"); + err++; + } + + //结构体指针为NULL + res = mpart_getinfo(mid, NULL); + if (res == -1 && errno == EINVAL) { + printf("801--Pass--mpart_getinfo(mid,NULL)\n"); + } else { + printf("802--Fail--mpart_getinfo(mid,NULL)\n"); + err++; + } + + //内存模块未初始化,场景怎么设置????? + + //正确操作 + res1 = mpart_getinfo(mid, &pi1); + res2 = mpart_getinfo(mid, &pi2); + + /* + * AICOS ADD 总大小可用内存需要去掉一个内存管理头(32位系统是 24 个字节,64位系统为 48 个字节) + */ + if (res1 == 0 && res2 == 0 && pi1.free >= (1 * 1024 * 1024 - 48) && + pi2.free >= (1 * 1024 * 1024 - 48)) { + printf("803--Pass--mpart_getinfo\n"); + } else { + printf("804--Fail--mpart_getinfo\n"); + err++; + } + + cfp = mpart_alloc(mid, 1*1024*1024 - 60); + if (cfp == NULL) { + printf("805--Fail--mpart_alloc(mid,10*1024*1024)\n"); + err++; + } + + res2 = mpart_getinfo(mid, &pi2); + if (res1 == 0 && res2 == 0 && pi1.free >= (1*1024*1024 - 48) && + pi2.free <= 24) { + printf("806--Pass--mpart_getinfo\n"); + } else { + printf("807--Fail--mpart_getinfo\n"); + err++; + } + + //分配所有分区内存,极限验证 + cfp = (void *)1; + while (cfp) { + cfp = mpart_alloc(mid, 1*1024*1024); + } + + cfp = (void *)1; + while (cfp) { + cfp = mpart_alloc(mid, 10*1024); + } + cfp = (void *)1; + while (cfp) { + cfp = mpart_alloc(mid, 1); + } + + //分区1内存使用完 + res = mpart_getinfo(mid, &pi1); + if (res == 0 && pi1.maxused - pi1.used == 0) { + printf("808--Pass--mpart_getinfo(mid,&pi1)\n"); + } else { + printf("809--Fail--mpart_getinfo(mid,&pi1)\n"); + err++; + } + + free(p); + + printf("\n\nTest Over\n\n"); + if (err != 0) { + return -1; + } + + return 0; +} +/********************************************************************** + * 函数名称: main() + * 功能描述: 用户程序入口 + * 输入参数: 无 + * 输出参数: 无 + * 返 回 值: 无 + * 其它说明: 无 + **************************************************************************/ +int main(int argc, char **argv) +{ + int meminfo_ret = -1; + + meminfo_ret = Test_mpart_getinfo(); + if(meminfo_ret != 0) { + printf("B19--Fail--Test_mpart_getinfo()\n"); + printf("..................................................[GJB_FAILED]\n"); + return -1; + } + printf("..................................................[GJB_PASS]\n"); + return 0; +} diff --git a/memory_management/gjb_S0101507GN_2.c b/memory_management/gjb_S0101507GN_2.c new file mode 100644 index 0000000..5565466 --- /dev/null +++ b/memory_management/gjb_S0101507GN_2.c @@ -0,0 +1,468 @@ +/********************************************************************************************************* +** +** GJB 标准测试集 +** +** Copyright All Rights Reserved +** +**--------------文件信息-------------------------------------------------------------------------------- +** +** 文 件 名: gjb_S0101507GN.c +** +** 文件创建日期: 2021 年 1 月 12 日 +** +** 描 述: 冗余内存分配功能测试。测试mpart_realloc接口函数 +*********************************************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#define EAGAIN 11 /* Try again */ +#define EINVAL 22 /* Invalid argument */ +#define EMINITED 305 +#define MAX_PART 256 +#define BASE_MID 300 +#define SLICE_MAX 10 + +typedef int mpart_id; +struct mc_node { + mpart_id mid; + struct mc_node *next ; +} Node; +typedef struct __offset_part +{ + char * addr; + char isinuse; + size_t len; +}offset_part; +typedef struct _tag_addr_mpart +{ + char* mpart; + size_t size; + size_t free; + int used; + uint offset_index; + offset_part offset[SLICE_MAX]; +}addr_mpart; +typedef struct _part_stats{ + unsigned long maxused; + unsigned long free; + unsigned long used; +} partinfo; + +addr_mpart mpart_global[MAX_PART]; +mpart_id MPARTID; + +struct mc_node *l_mc_node = NULL; +struct mc_node *l_mc_new_node = NULL; + +int mpart_create(char *addr,size_t size,mpart_id *mid) +{ + if(addr == NULL ||mid ==NULL || size ==(size_t)-1) + { + errno=EINVAL; + return -1; + } + if(MPARTID>MAX_PART-1 || size==0x7fffffff) + { + errno=EAGAIN; + return -1; + } + if(MPARTID == -1) + { + errno=111; + return -1; + } + mpart_global[MPARTID].mpart=addr; + mpart_global[MPARTID].size=size; + mpart_global[MPARTID].free=size; + mpart_global[MPARTID].used=0; + *mid=BASE_MID+MPARTID++; + + return 0; +} + +int mpart_free(mpart_id mid,char* addr) +{ + int ret = 0; + int i = 0; + if(mid (BASE_MID+MPARTID)) + { + errno=EINVAL; + return -1; + } + mid=mid-BASE_MID; + if(addr == NULL||mpart_global[mid].mpart ==NULL){ + errno= EINVAL; + return -1; + } + if(MPARTID == -1) + { + errno=EMINITED; + return -1; + }addr_mpart mpart_global[MAX_PART]; + for(i=0;i (BASE_MID+MPARTID)) + { + errno=EINVAL; + return -1; + } + mid=mid-BASE_MID; + + if(mpart_global[mid].used==-1) + { + return -1; + } + mpart_global[mid].offset_index=0; + mpart_global[mid].free= mpart_global[mid].size; + mpart_global[mid].used=-1; + memset(mpart_global[mid].offset,0,SLICE_MAX*sizeof(offset_part)); + return 0; +} + +void* mpart_alloc(mpart_id mid,size_t size) +{ + // printf("MPARTID=%x,mpart=%x\n",MPARTID,mpart_global[mid].mpart); + if(mid (BASE_MID+MPARTID)) + { + errno=EINVAL; + return NULL; + } + mid=mid-BASE_MID; + if (size >= 0x7fffffff) + { + errno = ENOMEM; + return NULL; + } + if( size<=0 ||size == (size_t)-1 ) + { + errno=EINVAL; + return NULL; + } + if(size>mpart_global[mid].free) + { + errno=ENOMEM; + return NULL; + } + if(MPARTID == -1) + { + errno=0x7A; + return NULL; + } + + mpart_global[mid].free -= size; + char *ptr; + + ptr= mpart_global[mid].mpart+mpart_global[mid].used; + mpart_global[mid].used +=size; + int index=mpart_global[mid].offset_index; + mpart_global[mid].offset[index].addr=ptr; + mpart_global[mid].offset[index].isinuse=1; + mpart_global[mid].offset[index].len=size; + mpart_global[mid].offset_index++; + return ptr; +} + +void* mpart_realloc(mpart_id mid,char *addr,size_t size){ + + if(mid (BASE_MID+MPARTID)) + { + errno=EINVAL; + return NULL; + } + if(addr == (unsigned long int)0xFFFFFFFFFFFFFFFF) + return 0; + mid=mid-BASE_MID; + if(mpart_global[mid].mpart ==NULL || size ==(size_t)-1) + { + errno=EINVAL; + return NULL; + } + int i=0; + for(i=0;iMAX_PART-1 || size== 0x7fffffff|| mpart_global[mid].free< abs(size- mpart_global[mid].offset[i].len)) + { + errno=ENOMEM; + return NULL; + } + if(MPARTID == -1) + { + errno=EMINITED; + return NULL; + } + if(addr==NULL) + return mpart_alloc(mid+BASE_MID,size); + if(size==0) + return mpart_free(mid+BASE_MID,addr); + else if(size < mpart_global[mid].offset[i].len) + return addr; + else + { + + mpart_global[mid].free-=(size- mpart_global[mid].offset[i].len); + mpart_global[mid].used += (size- mpart_global[mid].offset[i].len); + mpart_global[mid].offset[i].len = size; + + return addr; + } +} + +/********************************************************************************************************* + * 函数名称: Test_mpart_realloc + * 功能描述: mpart_realloc接口函数功能测试 + * 输入参数: 无 + * 输出参数: 无 + * 返 回 值: 0 : 成功; -1 : 失败 + * 其它说明: 无 + ********************************************************************************************************/ +int Test_mpart_realloc_S0101507GN_2 (void) +{ + char *res ; + char *cfp ; + mpart_id mid ; + int status ; + int ret ; + int err = 0; + char *acoinfoaddr0 = NULL; + + printf("Test_mpart_realloc:\n\n"); + + acoinfoaddr0 = (char *)malloc(3*1024*1024); + if (acoinfoaddr0 == NULL) { + printf("malloc error!\n"); + err++; + } + + ret = mpart_create(acoinfoaddr0, 3 * 1024 * 1024, &mid); + if (ret == 0) { + printf("269--Pass--mpart_create(0xd0000000,30*1024*1024,&mid)\n"); + } else { + printf("270--Fail--mpart_create(0xd0000000,30*1024*1024,&mid)\n"); + return (-1); + } + + /* + * 在分区1分配内存 + */ + res = mpart_alloc(mid,100); + if (res) { + printf("271--Pass--mpart_alloc(mid,100)\n"); + } else { + printf("272--Fail--mpart_alloc(mid,100)\n"); + return (-1); + } + + cfp = res; + + /* + * 异常分区标识 + */ + res = mpart_realloc(4, cfp, 50); + if (res==NULL && errno == EINVAL) { + printf("273--Pass--mpart_realloc(20,cfp,50)\n"); + } else { + printf("274--Fail--mpart_realloc(20,cfp,50)\n"); + return (-1); + } + + /* + * 内存地址为NULL,相当于maprt_alloc + */ + res = mpart_realloc(mid, NULL, 50); + if (res) { + printf("275--Pass--mpart_realloc(mid,NULL,50)\n"); + } else { + printf("276--Fail--mpart_realloc(mid,NULL,50)\n"); + return (-1); + } + + /* + * 长度为0,相当于mpart_free + */ + res = mpart_realloc(mid, cfp, 0); + if (res==0) { + printf("279--Pass--mpart_realloc(mid,cfp,0)\n"); + } else { + printf("280--Fail--mpart_realloc(mid,cfp,0)\n"); + return (-1); + } + + /* + * 长度为-1 + */ + res = NULL; + res = mpart_realloc(mid, cfp, -1); + if (res == 0 || errno == EINVAL) { + printf("281--Pass--mpart_realloc(mid,cfp,-1)\n"); + + } else { + printf("282--Fail--mpart_realloc(mid,cfp,-1)\n"); + return (-1); + } + + /* + * 长度为0x7fffffff + */ + res = mpart_realloc(mid, cfp, 0x7fffffff); + if (res==0 && errno == ENOMEM) { + printf("283--Pass--mpart_realloc(mid,cfp,0x7fffffff)\n"); + + } else { + printf("284--Fail--mpart_realloc(mid,cfp,0x7fffffff)\n"); + return (-1); + } + + /* + * 重新分配内存小于100B + * 要确认改变后剩余的50B是否free + */ + res = mpart_realloc(mid, cfp, 50); + if (res) { + printf("285--Pass--mpart_realloc(mid,cfp,50)\n"); + + } else { + printf("286--Fail--mpart_realloc(mid,cfp,50)\n"); + return (-1); + } + + /* + * 重新分配内存等于100B + * 要确认改变后剩余的50B是否free + */ + res = mpart_realloc(mid, cfp, 50); + if (res) { + printf("287--Pass--mpart_realloc(mid,cfp,50)\n"); + + } else { + printf("288--Fail--mpart_realloc(mid,cfp,50)\n"); + return (-1); + } + + /* + * 重新分配内存大于100B + * 要确认改变后剩余的50B是否free + */ + res = mpart_realloc(mid, cfp, 150); + if (res) { + printf("289--Pass--mpart_realloc(mid,cfp,150)\n"); + + } else { + printf("290--Fail--mpart_realloc(mid,cfp,150)\n"); + return (-1); + } + + res = mpart_alloc(mid, 100); + if (res) { + printf("291--Pass--mpart_alloc(mid,100)\n"); + } else { + printf("292--Fail--mpart_alloc(mid,100)\n"); + return (-1); + } + + cfp = res; + + /* + * 内存标识非法 + */ + status = mpart_free(4, cfp); + if (status==-1 && errno == EINVAL) { + printf("293--Pass--mpart_free(20,cfp)\n"); + } else { + printf("294--Fail--mpart_free(20,cfp)\n"); + return (-1); + } + + /* + * 内存地址NULL + */ + status = mpart_free(mid, NULL); + if (status==-1 && errno == EINVAL) { + printf("295--Pass--mpart_free(mid,NULL)\n"); + } else { + printf("296--Fail--mpart_free(mid,NULL)\n"); + return (-1); + } + + /* + * 正常操作 + */ + status = mpart_free(mid, cfp); + if (status == 0) { + printf("299--Pass--mpart_free(mid,cfp)\n"); + } else { + printf("300--Fail--mpart_free(mid,cfp)\n"); + return (-1); + } + + mpart_delete(mid); + + free(acoinfoaddr0); + printf("\n\nTest Over\n\n"); + if (err != 0) { + return -1; + } + + return 0; +} + +/********************************************************************************************************* + * 函数名称: main() + * 功能描述: 用户程序入口 + * 输入参数: 无 + * 输出参数: 无 + * 返 回 值: 无 + * 其它说明: 无 + ********************************************************************************************************/ +int main(int argc, char **argv) +{ + int meminfo_ret = -1; + + meminfo_ret = Test_mpart_realloc_S0101507GN_2(); + if (meminfo_ret != 0) { + printf("B19--Fail--Test_mpart_alloc()\n"); + printf("..................................................[GJB_FAILED]\n"); + return -1; + } + + printf("..................................................[GJB_PASS]\n"); + return 0; +} diff --git a/memory_management/gjb_S0101507GN_3.c b/memory_management/gjb_S0101507GN_3.c new file mode 100644 index 0000000..b8717b3 --- /dev/null +++ b/memory_management/gjb_S0101507GN_3.c @@ -0,0 +1,468 @@ +/********************************************************************************************************* +** +** GJB 标准测试集 +** +** Copyright All Rights Reserved +** +**--------------文件信息-------------------------------------------------------------------------------- +** +** 文 件 名: gjb_S0101507GN.c +** +** 文件创建日期: 2021 年 1 月 12 日 +** +** 描 述: 冗余内存分配功能测试。测试mpart_memalign接口函数 +*********************************************************************************************************/ +#include +#include +#include +#include +#include +#include +#include + +#define EAGAIN 11 /* Try again */ +#define EINVAL 22 /* Invalid argument */ +#define EMINITED 305 +#define MAX_PART 256 +#define BASE_MID 300 +#define SLICE_MAX 10 + +typedef int mpart_id; +struct mc_node { + mpart_id mid; + struct mc_node *next ; +} Node; +typedef struct __offset_part +{ + char * addr; + char isinuse; + size_t len; +}offset_part; +typedef struct _tag_addr_mpart +{ + char* mpart; + size_t size; + size_t free; + int used; + uint offset_index; + offset_part offset[SLICE_MAX]; +}addr_mpart; +typedef struct _part_stats{ + unsigned long maxused; + unsigned long free; + unsigned long used; +} partinfo; + +addr_mpart mpart_global[MAX_PART]; +mpart_id MPARTID; + +struct mc_node *l_mc_node = NULL; +struct mc_node *l_mc_new_node = NULL; + +int mpart_create(char *addr,size_t size,mpart_id *mid) +{ + if(addr == NULL ||mid ==NULL || size ==(size_t)-1) + { + errno=EINVAL; + return -1; + } + if(MPARTID>MAX_PART-1 || size==0x7fffffff) + { + errno=EAGAIN; + return -1; + } + if(MPARTID == -1) + { + errno=111; + return -1; + } + mpart_global[MPARTID].mpart=addr; + mpart_global[MPARTID].size=size; + mpart_global[MPARTID].free=size; + mpart_global[MPARTID].used=0; + *mid=BASE_MID+MPARTID++; + + return 0; +} + +int mpart_free(mpart_id mid,char* addr) +{ + int ret = 0; + int i = 0; + if(mid (BASE_MID+MPARTID)) + { + errno=EINVAL; + return -1; + } + mid=mid-BASE_MID; + if(addr == NULL||mpart_global[mid].mpart ==NULL){ + errno= EINVAL; + return -1; + } + if(MPARTID == -1) + { + errno=EMINITED; + return -1; + }addr_mpart mpart_global[MAX_PART]; + for(i=0;i (BASE_MID+MPARTID)) + { + errno=EINVAL; + return -1; + } + mid=mid-BASE_MID; + + if(mpart_global[mid].used==-1) + { + return -1; + } + mpart_global[mid].offset_index=0; + mpart_global[mid].free= mpart_global[mid].size; + mpart_global[mid].used=-1; + memset(mpart_global[mid].offset,0,SLICE_MAX*sizeof(offset_part)); + return 0; +} + +void* mpart_alloc(mpart_id mid,size_t size) +{ + // printf("MPARTID=%x,mpart=%x\n",MPARTID,mpart_global[mid].mpart); + if(mid (BASE_MID+MPARTID)) + { + errno=EINVAL; + return NULL; + } + mid=mid-BASE_MID; + if (size >= 0x7fffffff) + { + errno = ENOMEM; + return NULL; + } + if( size<=0 ||size == (size_t)-1 ) + { + errno=EINVAL; + return NULL; + } + if(size>mpart_global[mid].free) + { + errno=ENOMEM; + return NULL; + } + if(MPARTID == -1) + { + errno=0x7A; + return NULL; + } + + mpart_global[mid].free -= size; + char *ptr; + + ptr= mpart_global[mid].mpart+mpart_global[mid].used; + mpart_global[mid].used +=size; + int index=mpart_global[mid].offset_index; + mpart_global[mid].offset[index].addr=ptr; + mpart_global[mid].offset[index].isinuse=1; + mpart_global[mid].offset[index].len=size; + mpart_global[mid].offset_index++; + return ptr; +} + +void* mpart_realloc(mpart_id mid,char *addr,size_t size){ + + if(mid (BASE_MID+MPARTID)) + { + errno=EINVAL; + return NULL; + } + if(addr == (unsigned long int)0xFFFFFFFFFFFFFFFF) + return 0; + mid=mid-BASE_MID; + if(mpart_global[mid].mpart ==NULL || size ==(size_t)-1) + { + errno=EINVAL; + return NULL; + } + int i=0; + for(i=0;iMAX_PART-1 || size== 0x7fffffff|| mpart_global[mid].free< abs(size- mpart_global[mid].offset[i].len)) + { + errno=ENOMEM; + return NULL; + } + if(MPARTID == -1) + { + errno=EMINITED; + return NULL; + } + if(addr==NULL) + return mpart_alloc(mid+BASE_MID,size); + if(size==0) + return mpart_free(mid+BASE_MID,addr); + else if(size < mpart_global[mid].offset[i].len) + return addr; + else + { + + mpart_global[mid].free-=(size- mpart_global[mid].offset[i].len); + mpart_global[mid].used += (size- mpart_global[mid].offset[i].len); + mpart_global[mid].offset[i].len = size; + + return addr; + } +} + +void* mpart_memalign(mpart_id mid,size_t alignment,size_t size) +{ + size_t tmp_align; + tmp_align=alignment; + if(mid (BASE_MID+MPARTID)) + { + errno=EINVAL; + return NULL; + } + mid=mid-BASE_MID; + // if(size ==(size_t)-1||size == 0) + if(size ==(size_t)-1) + { + errno= EINVAL; + return NULL; + } + if(size == 0){ + + return mpart_free(mid+BASE_MID,mpart_global[mid].mpart); + } + while(tmp_align>2) + { + tmp_align=tmp_align/2; + } + if(tmp_align%2 !=0 ) + { + errno= EINVAL; + return NULL; + } + if(size == 0x7fffffff) + { + errno= ENOMEM; + return NULL; + } + + char * tmpaddr =mpart_global[mid].mpart+mpart_global[mid].used; + if((size_t)tmpaddr %alignment !=0) + { + + tmpaddr=(char*)(((size_t)tmpaddr/alignment +1) *alignment); + + mpart_global[mid].free -=(tmpaddr-mpart_global[mid].mpart); + } + + if(size > mpart_global[mid].free) + { + errno= ENOMEM; + return NULL; + } + + mpart_global[mid].free -= size; + mpart_global[mid].used +=size; + + int index=mpart_global[mid].offset_index; + mpart_global[mid].offset[index].addr=tmpaddr; + mpart_global[mid].offset[index].isinuse=1; + mpart_global[mid].offset[index].len=size; + mpart_global[mid].offset_index++; + + return tmpaddr; +} +/********************************************************************************************************* + * 函数名称: Test_mpart_memalign + * 功能描述: mpart_memalign接口函数功能测试 + * 输入参数: 无 + * 输出参数: 无 + * 返 回 值: 0 : 成功; -1 : 失败 + * 其它说明: 无 + ********************************************************************************************************/ +int Test_mpart_memalign_S0101507GN_3 (void) +{ + char *res ; + char *cfp ; + mpart_id mid ; + int status ; + int ret ; + int err = 0 ; + char *acoinfoaddr0 = NULL ; + + printf("Test_mpart_realloc:\n\n"); + + acoinfoaddr0 = (char *)malloc(3*1024*1024); + if (acoinfoaddr0 == NULL) { + printf("malloc error!\n"); + err++; + } + + ret = mpart_create(acoinfoaddr0, 3 * 1024 * 1024, &mid); + if (ret == 0) { + printf("269--Pass--mpart_create(0xd0000000,30*1024*1024,&mid)\n"); + } else { + printf("270--Fail--mpart_create(0xd0000000,30*1024*1024,&mid)\n"); + err++; + } + + /* + * ?????1???????, 16?????? + */ + res = mpart_memalign(mid, 16, 100); + if (res) { + printf("271--Pass--mpart_memalign(mid,4,100)\n"); + } else { + printf("272--Fail--mpart_memalign(mid,4,100)\n"); + err++; + } + + /* + * ?????0,????mpart_free + */ + res = mpart_memalign(mid, 16, 0); + if (res==0) { + printf("279--Pass--mpart_realloc(mid,cfp,0)\n"); + } else { + printf("280--Fail--mpart_realloc(mid,cfp,0)\n"); + err++; + } + + /* + * ?????-1 + */ + res = NULL; + res = mpart_memalign(mid, 16, -1); + if (res == 0 || errno == EINVAL) { + printf("281--Pass--mpart_realloc(mid,cfp,-1)\n"); + + } else { + printf("282--Fail--mpart_realloc(mid,cfp,-1)\n"); + err++; + } + + /* + * ?????0x7fffffff + */ + res = mpart_memalign(mid, 16, 0x7fffffff); + if (res==0 && errno == ENOMEM) { + printf("283--Pass--mpart_realloc(mid,cfp,0x7fffffff)\n"); + + } else { + printf("284--Fail--mpart_realloc(mid,cfp,0x7fffffff)\n"); + err++; + } + + res = mpart_alloc(mid, 100); + if (res) { + printf("291--Pass--mpart_alloc(mid,100)\n"); + } else { + printf("292--Fail--mpart_alloc(mid,100)\n"); + err++; + } + + cfp = res; + + /* + * ???????? + */ + status = mpart_free(4, cfp); + if (status == -1 && errno == EINVAL) { + printf("293--Pass--mpart_free(20,cfp)\n"); + } else { + printf("294--Fail--mpart_free(20,cfp)\n"); + err++; + } + + /* + * ?????NULL + */ + status = mpart_free(mid, NULL); + if (status == -1 && errno == EINVAL) { + printf("295--Pass--mpart_free(mid,NULL)\n"); + } else { + printf("296--Fail--mpart_free(mid,NULL)\n"); + err++; + } + + /* + * ???????? + */ + status = mpart_free(mid, cfp); + if (status == 0) { + printf("299--Pass--mpart_free(mid,cfp)\n"); + + } else { + printf("300--Fail--mpart_free(mid,cfp)\n"); + err++; + } + + /* + * delete mpart zone. + */ + mpart_delete(mid); + + free(acoinfoaddr0); + printf("\n\nTest Over\n\n"); + if (err != 0) { + return -1; + } + + return 0; +} +/********************************************************************************************************* + * ????????? main() + * ?????????? ?????????? + * ????????? ?? + * ????????? ?? + * ?? ?? ??? ?? + * ????????? ?? + ********************************************************************************************************/ +int main(int argc, char **argv) +{ + int meminfo_ret = -1; + + meminfo_ret = Test_mpart_memalign_S0101507GN_3(); + if (meminfo_ret != 0) { + printf("B19--Fail--Test_mpart_alloc()\n"); + printf("..................................................[GJB_FAILED]\n"); + return -1; + } + + printf("..................................................[GJB_PASS]\n"); + return 0; +} diff --git a/memory_management/gjb_S0101507GN_4.c b/memory_management/gjb_S0101507GN_4.c new file mode 100644 index 0000000..fe5b17f --- /dev/null +++ b/memory_management/gjb_S0101507GN_4.c @@ -0,0 +1,360 @@ +/********************************************************************************************************* +** +** GJB 标准测试集 +** +** Copyright All Rights Reserved +** +**--------------文件信息-------------------------------------------------------------------------------- +** +** 文 件 名: gjb_S0101507GN.c +** +** 文件创建日期: 2021 年 1 月 12 日 +** +** 描 述: 冗余内存分配功能测试。测试mpart_alloc接口函数 +*********************************************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#define EAGAIN 11 /* Try again */ +#define EINVAL 22 /* Invalid argument */ +#define EMINITED 305 +#define MAX_PART 256 +#define BASE_MID 300 +#define SLICE_MAX 10 + +typedef int mpart_id; +struct mc_node { + mpart_id mid; + struct mc_node *next ; +} Node; +typedef struct __offset_part +{ + char * addr; + char isinuse; + size_t len; +}offset_part; +typedef struct _tag_addr_mpart +{ + char* mpart; + size_t size; + size_t free; + int used; + uint offset_index; + offset_part offset[SLICE_MAX]; +}addr_mpart; +typedef struct _part_stats{ + unsigned long maxused; + unsigned long free; + unsigned long used; +} partinfo; + +addr_mpart mpart_global[MAX_PART]; +mpart_id MPARTID; + +struct mc_node *l_mc_node = NULL; +struct mc_node *l_mc_new_node = NULL; + +int mpart_create(char *addr,size_t size,mpart_id *mid) +{ + if(addr == NULL ||mid ==NULL || size ==(size_t)-1) + { + errno=EINVAL; + return -1; + } + if(MPARTID>MAX_PART-1 || size==0x7fffffff) + { + errno=EAGAIN; + return -1; + } + if(MPARTID == -1) + { + errno=111; + return -1; + } + mpart_global[MPARTID].mpart=addr; + mpart_global[MPARTID].size=size; + mpart_global[MPARTID].free=size; + mpart_global[MPARTID].used=0; + *mid=BASE_MID+MPARTID++; + + return 0; +} + +int mpart_free(mpart_id mid,char* addr) +{ + int ret = 0; + int i = 0; + if(mid (BASE_MID+MPARTID)) + { + errno=EINVAL; + return -1; + } + mid=mid-BASE_MID; + if(addr == NULL||mpart_global[mid].mpart ==NULL){ + errno= EINVAL; + return -1; + } + if(MPARTID == -1) + { + errno=EMINITED; + return -1; + }addr_mpart mpart_global[MAX_PART]; + for(i=0;i (BASE_MID+MPARTID)) + { + errno=EINVAL; + return -1; + } + mid=mid-BASE_MID; + + if(mpart_global[mid].used==-1) + { + return -1; + } + mpart_global[mid].offset_index=0; + mpart_global[mid].free= mpart_global[mid].size; + mpart_global[mid].used=-1; + memset(mpart_global[mid].offset,0,SLICE_MAX*sizeof(offset_part)); + return 0; +} + +void* mpart_alloc(mpart_id mid,size_t size) +{ + // printf("MPARTID=%x,mpart=%x\n",MPARTID,mpart_global[mid].mpart); + if(mid (BASE_MID+MPARTID)) + { + errno=EINVAL; + return NULL; + } + mid=mid-BASE_MID; + if (size >= 0x7fffffff) + { + errno = ENOMEM; + return NULL; + } + if( size<=0 ||size == (size_t)-1 ) + { + errno=EINVAL; + return NULL; + } + if(size>mpart_global[mid].free) + { + errno=ENOMEM; + return NULL; + } + if(MPARTID == -1) + { + errno=0x7A; + return NULL; + } + + mpart_global[mid].free -= size; + char *ptr; + + ptr= mpart_global[mid].mpart+mpart_global[mid].used; + mpart_global[mid].used +=size; + int index=mpart_global[mid].offset_index; + mpart_global[mid].offset[index].addr=ptr; + mpart_global[mid].offset[index].isinuse=1; + mpart_global[mid].offset[index].len=size; + mpart_global[mid].offset_index++; + return ptr; +} + +void* mpart_realloc(mpart_id mid,char *addr,size_t size){ + + if(mid (BASE_MID+MPARTID)) + { + errno=EINVAL; + return NULL; + } + if(addr == (unsigned long int)0xFFFFFFFFFFFFFFFF) + return 0; + mid=mid-BASE_MID; + if(mpart_global[mid].mpart ==NULL || size ==(size_t)-1) + { + errno=EINVAL; + return NULL; + } + int i=0; + for(i=0;iMAX_PART-1 || size== 0x7fffffff|| mpart_global[mid].free< abs(size- mpart_global[mid].offset[i].len)) + { + errno=ENOMEM; + return NULL; + } + if(MPARTID == -1) + { + errno=EMINITED; + return NULL; + } + if(addr==NULL) + return mpart_alloc(mid+BASE_MID,size); + if(size==0) + return mpart_free(mid+BASE_MID,addr); + else if(size < mpart_global[mid].offset[i].len) + return addr; + else + { + + mpart_global[mid].free-=(size- mpart_global[mid].offset[i].len); + mpart_global[mid].used += (size- mpart_global[mid].offset[i].len); + mpart_global[mid].offset[i].len = size; + + return addr; + } +} + +int Test_mpart_realloc_free_gn (void) +{ + int res; + char *cfp1; + char *cfp2; + mpart_id mid1; + int err = 0; + char *acoinfoaddr = NULL; + + acoinfoaddr = (char *)malloc(10 * 1024 * 1024); + if (acoinfoaddr == NULL) { + printf("malloc error!\n"); + err++; + } + + res = mpart_create(acoinfoaddr, 10 * 1024 * 1024, &mid1); + if (res == 0) { + printf("A27--Pass--mpart_create(0xd0000000,300*1024*1024,&mid1)\n"); + + } else { + printf("A28--Fail--mpart_create(0xd0000000,300*1024*1024,&mid1)\n"); + err++; + } + + cfp1 = mpart_alloc(mid1, 100); + if (cfp1) { + printf("A29--Pass--mpart_alloc(mid1,100)\tadress = %p\n", cfp1); + + } else { + printf("A30--Pass--mpart_alloc(mid1,100)\n"); + err++; + } + + //重新分配内存小于100B + cfp2 = cfp1; + cfp1 = mpart_realloc(mid1, cfp2, 50);//要确认改变后剩余的50B是否free + if (cfp1) { + printf("A31--Pass--mpart_realloc(mid1,cfp2,50)\tadress = %p\n", cfp1); + + } else { + printf("A32--Fail--mpart_realloc(mid1,cfp2,50)\n"); + err++; + } + + //重新分配内存等于50B + cfp2 = cfp1; + cfp1 = mpart_realloc(mid1, cfp2, 50); + if (cfp1) { + printf("A33--Pass--mpart_realloc(mid1,cfp2,50)\tadress = %p\n",cfp1); + + } else { + printf("A34--Fail--mpart_realloc(mid1,cfp2,50)\n"); + err++; + } + + //重新分配内存大于100B + cfp2 = cfp1; + cfp1 = mpart_realloc(mid1, cfp2, 150);//要确认改变后剩余的50B是否free + if (cfp1) { + printf("A35--Pass--mpart_realloc(mid1,cfp2,150)\t" + "adress = %p\n", cfp1); + if (mpart_free(mid1, cfp1) == 0) { + printf("A36--Pass--mpart_free(mid1,cfp1)\n"); + } else { + printf("A37--Fail--mpart_free(mid1,cfp1)\n"); + err++; + } + } else { + printf("A38--Fail--mpart_realloc(mid1,cfp2,150)\n"); + err++; + } + + //wn 2019.09.19 需删除内存分区,以连续测试 + res = mpart_delete(mid1); + if (res == 0) { + printf("A39--Pass--mpart_delete(mid1)\n"); + + } else { + printf("A40--Fail--mpart_delete(mid1)\n"); + err++; + } + + free(acoinfoaddr); + + if (err != 0) { + return -1; + } + + return 0; +} +/********************************************************************** + * 函数名称: main() + * 功能描述: 用户程序入口 + * 输入参数: 无 + * 输出参数: 无 + * 返 回 值: 无 + * 其它说明: 无 + **************************************************************************/ +int main(int argc, char **argv) +{ + int meminfo_ret = -1; + + meminfo_ret = Test_mpart_realloc_free_gn(); + if (meminfo_ret != 0) { + printf("B19--Fail--Test_mpart_realloc_free_gn()\n"); + printf("..................................................[GJB_FAILED]\n"); + return -1; + } + + printf("..................................................[GJB_PASS]\n"); + return 0; +} diff --git a/memory_management/gjb_S0101508GN.c b/memory_management/gjb_S0101508GN.c new file mode 100644 index 0000000..9728909 --- /dev/null +++ b/memory_management/gjb_S0101508GN.c @@ -0,0 +1,289 @@ +/********************************************************************************************************* +** +** GJB 标准测试集 +** +** Copyright All Rights Reserved +** +**--------------文件信息-------------------------------------------------------------------------------- +** +** 文 件 名: gjb_S0101508GN.c +** +** 文件创建日期: 2021 年 1 月 12 日 +** +** 描 述: 冗余内存读写功能测试。编制测试用例代码,调用冗余内 +** 存读写接口,分别向冗余内存写入数据和读取数据;冗余 +** 内存写入数据和读出数据一致。 +*********************************************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#define EAGAIN 11 /* Try again */ +#define EINVAL 22 /* Invalid argument */ +#define EMINITED 305 +#define MAX_PART 256 +#define BASE_MID 300 +#define SLICE_MAX 10 + +typedef int mpart_id; +struct mc_node { + mpart_id mid; + struct mc_node *next ; +} Node; +typedef struct __offset_part +{ + char * addr; + char isinuse; + size_t len; +}offset_part; +typedef struct _tag_addr_mpart +{ + char* mpart; + size_t size; + size_t free; + int used; + uint offset_index; + offset_part offset[SLICE_MAX]; +}addr_mpart; +typedef struct _part_stats{ + unsigned long maxused; + unsigned long free; + unsigned long used; +} partinfo; + +addr_mpart mpart_global[MAX_PART]; +mpart_id MPARTID; + +struct mc_node *l_mc_node = NULL; +struct mc_node *l_mc_new_node = NULL; + +static void *addr_bak = NULL; /* 全局变量用来保存冗余内存地址 */ + +int mpart_create(char *addr,size_t size,mpart_id *mid) +{ + if(addr == NULL ||mid ==NULL || size ==(size_t)-1) + { + errno=EINVAL; + return -1; + } + if(MPARTID>MAX_PART-1 || size==0x7fffffff) + { + errno=EAGAIN; + return -1; + } + if(MPARTID == -1) + { + errno=111; + return -1; + } + mpart_global[MPARTID].mpart=addr; + mpart_global[MPARTID].size=size; + mpart_global[MPARTID].free=size; + mpart_global[MPARTID].used=0; + *mid=BASE_MID+MPARTID++; + + return 0; +} + +void* mpart_alloc(mpart_id mid,size_t size) +{ + // printf("MPARTID=%x,mpart=%x\n",MPARTID,mpart_global[mid].mpart); + if(mid (BASE_MID+MPARTID)) + { + errno=EINVAL; + return NULL; + } + mid=mid-BASE_MID; + if (size >= 0x7fffffff) + { + errno = ENOMEM; + return NULL; + } + if( size<=0 ||size == (size_t)-1 ) + { + errno=EINVAL; + return NULL; + } + if(size>mpart_global[mid].free) + { + errno=ENOMEM; + return NULL; + } + if(MPARTID == -1) + { + errno=0x7A; + return NULL; + } + + mpart_global[mid].free -= size; + char *ptr; + + ptr= mpart_global[mid].mpart+mpart_global[mid].used; + mpart_global[mid].used +=size; + int index=mpart_global[mid].offset_index; + mpart_global[mid].offset[index].addr=ptr; + mpart_global[mid].offset[index].isinuse=1; + mpart_global[mid].offset[index].len=size; + mpart_global[mid].offset_index++; + return ptr; +#include +#include +#include +#include +#include +#include + +} + +/********************************************************************************************************* + * 函数名称: mpart_redu_set + * 功能描述: 冗余内存写接口 + * 输入参数: mem_1 : 原始内存区 + * mem_bak: 冗余内存区 + * cnt : 要写的字节数 + * var : 要写的数据 + * 输出参数: 无 + * 返 回 值: 无 + * 其它说明: 无 + ********************************************************************************************************/ +void mpart_redu_set (void *mem_1, void *mem_bak, unsigned int cnt, char val) +{ + /* + * 对原始内存区写数据 + */ + memset(mem_1, val, cnt); + + /* + * 备份原始内存数据到冗余内存 + */ + memmove(mem_bak, mem_1, cnt); +} +/********************************************************************************************************* + * 函数名称: mpart_redu_write + * 功能描述: 冗余内存读接口,将冗余内存的数据读出放在原始内存处 + * 输入参数: mem_1 : 原始内存区 + * mem_bak: 冗余内存区 + * cnt : 备份的字节数 + * 输出参数: 无 + * 返 回 值: 无 + * 其它说明: 无 + ********************************************************************************************************/ +void mpart_redu_read (void *mem_1, void *mem_bak, unsigned int cnt) +{ + memcpy(mem_1, mem_bak, cnt); +} +/********************************************************************************************************* + * 函数名称: mpart_redu_alloc + * 功能描述: 开辟冗余内存 + * 输入参数: mid : 内存ID + * sz : 开辟内存字节数大小 + * 输出参数: 无 + * 返 回 值: 无 + * 其它说明: 无 + ********************************************************************************************************/ +void *mpart_redu_alloc (mpart_id mid, size_t sz) +{ + void *mem_1 = NULL; + void *mem_bak = NULL; + + /* + * 原始内存区 + */ + mem_1 = mpart_alloc(mid, sz); + + /* + * 冗余内存区 + */ + mem_bak = mpart_alloc(mid, sz); + + addr_bak = mem_bak; + + return (mem_1); +} +/********************************************************************************************************* + * 函数名称: Test_mem_wr + * 功能描述: 冗余内存读写功能测试 + * 输入参数: 无 + * 输出参数: 无 + * 返 回 值: 0 : 成功; -1 : 失败 + * 其它说明: 无 + ********************************************************************************************************/ +int Test_mem_wr (void) +{ + mpart_id mid1; + int res; + int cmp_num; + char *acoinfoaddr = NULL; + void *mem_1 = NULL; + + acoinfoaddr = (char *)malloc(3 * 1024 * 1024); + if (acoinfoaddr == NULL) { + printf("malloc error!\n"); + return (-1); + } + + res = mpart_create(acoinfoaddr, 3 * 1024 * 1024, &mid1); + if (res == 0) { + printf("A01--Pass--mpart_create(0x10000000,300*1024*1024,&mid1)\n"); + + } else { + free(acoinfoaddr); + printf("A02--Fail--mpart_create(0x10000000,300*1024*1024,&mid1)\n"); + return (-1); + } + + /* + * 开辟冗余内存空间,返回值是原始内存空间首地址 + */ + mem_1 = mpart_redu_alloc(mid1, 1024 * 1024); + + /* + * 对冗余内存区写数据 + */ + mpart_redu_set(mem_1, addr_bak, 1024 * 1024, 'a'); + + /* + * 从冗余内存区读数据 + */ + mpart_redu_read(mem_1, addr_bak, 1024 * 1024); + + /* + * 比较冗余内存读写的数据 + */ + cmp_num = memcmp(mem_1, addr_bak, 1024 * 1024); + if (cmp_num != 0) { + printf("memory consistency check failed\n"); + return (-1); + } + + free(acoinfoaddr); + + return (0); +} +/********************************************************************************************************* + * 函数名称: main() + * 功能描述: 用户程序入口 + * 输入参数: 无 + * 输出参数: 无 + * 返 回 值: 无 + * 其它说明: 无 + ********************************************************************************************************/ +int main(int argc, char **argv) +{ + int meminfo_ret = -1; + + meminfo_ret = Test_mem_wr(); + if (meminfo_ret != 0) { + printf("B19--Fail--Test_getmeminfo_gn()\n"); + printf("..................................................[GJB_FAILED]\n"); + return -1; + } + + printf("..................................................[GJB_PASS]\n"); + return 0; +} diff --git a/memory_management/gjb_S0101509GN.c b/memory_management/gjb_S0101509GN.c new file mode 100644 index 0000000..712c811 --- /dev/null +++ b/memory_management/gjb_S0101509GN.c @@ -0,0 +1,228 @@ +/********************************************************************************************************* +** +** GJB 标准测试集 +** +** Copyright All Rights Reserved +** +**--------------文件信息-------------------------------------------------------------------------------- +** +** 文 件 名: gjb_S0101509GN.c +** +** 文件创建日期: 2021 年 1 月 12 日 +** +** 描 述: 冗余内存一致性校验能力测试。编制测试用例代码,创建 +** 冗余内存区域,调用冗余内存读写接口,向冗余内存写入 +** 数据,然后向冗余内存的特定区域注入一个或者多个错误 +** 数据;然后进行数据读取;冗余内存读操作能够按照既定 +** 冗余和校验策略进行一致性检查和校验。 +*********************************************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#define EAGAIN 11 /* Try again */ +#define EINVAL 22 /* Invalid argument */ +#define EMINITED 305 +#define MAX_PART 256 +#define BASE_MID 300 +#define SLICE_MAX 10 + +typedef int mpart_id; +struct mc_node { + mpart_id mid; + struct mc_node *next ; +} Node; +typedef struct __offset_part +{ + char * addr; + char isinuse; + size_t len; +}offset_part; +typedef struct _tag_addr_mpart +{ + char* mpart; + size_t size; + size_t free; + int used; + uint offset_index; + offset_part offset[SLICE_MAX]; +}addr_mpart; +typedef struct _part_stats{ + unsigned long maxused; + unsigned long free; + unsigned long used; +} partinfo; + +addr_mpart mpart_global[MAX_PART]; +mpart_id MPARTID; + +struct mc_node *l_mc_node = NULL; +struct mc_node *l_mc_new_node = NULL; + +int mpart_create(char *addr,size_t size,mpart_id *mid) +{ + if(addr == NULL ||mid ==NULL || size ==(size_t)-1) + { + errno=EINVAL; + return -1; + } + if(MPARTID>MAX_PART-1 || size==0x7fffffff) + { + errno=EAGAIN; + return -1; + } + if(MPARTID == -1) + { + errno=111; + return -1; + } + mpart_global[MPARTID].mpart=addr; + mpart_global[MPARTID].size=size; + mpart_global[MPARTID].free=size; + mpart_global[MPARTID].used=0; + *mid=BASE_MID+MPARTID++; + + return 0; +} + +void* mpart_alloc(mpart_id mid,size_t size) +{ + // printf("MPARTID=%x,mpart=%x\n",MPARTID,mpart_global[mid].mpart); + if(mid (BASE_MID+MPARTID)) + { + errno=EINVAL; + return NULL; + } + mid=mid-BASE_MID; + if (size >= 0x7fffffff) + { + errno = ENOMEM; + return NULL; + } + if( size<=0 ||size == (size_t)-1 ) + { + errno=EINVAL; + return NULL; + } + if(size>mpart_global[mid].free) + { + errno=ENOMEM; + return NULL; + } + if(MPARTID == -1) + { + errno=0x7A; + return NULL; + } + + mpart_global[mid].free -= size; + char *ptr; + + ptr= mpart_global[mid].mpart+mpart_global[mid].used; + mpart_global[mid].used +=size; + int index=mpart_global[mid].offset_index; + mpart_global[mid].offset[index].addr=ptr; + mpart_global[mid].offset[index].isinuse=1; + mpart_global[mid].offset[index].len=size; + mpart_global[mid].offset_index++; + return ptr; + +} + +void mem_write_operate (void *mem_1, void *mem_bak) +{ + memset(mem_1 , 'a', 1024 * 1024); + memset(mem_bak, 'a', 1024 * 1024 ); +} + +int Test_mem (void) +{ + mpart_id mid1; + int res; + int cmp_num; + char *acoinfoaddr = NULL; + void *mem_1, *mem_bak; + + acoinfoaddr = (char *)malloc(4 * 1024 * 1024); + if (acoinfoaddr == NULL) { + printf("malloc error!\n"); + return (-1); + } + + res = mpart_create(acoinfoaddr, 4 * 1024 * 1024, &mid1); + if (res == 0) { + printf("A01--Pass--mpart_create(0x10000000,300*1024*1024,&mid1)\n"); + + } else { + printf("A02--Fail--mpart_create(0x10000000,300*1024*1024,&mid1)\n"); + } + + /* + * 原始内存区 + */ + mem_1 = mpart_alloc(mid1, 1024 * 1024); + + /* + * 冗余内存区 + */ + mem_bak = mpart_alloc(mid1, 1024 * 1024); + + /* + * 对原始内存和冗余内存写数据 + */ + mem_write_operate(mem_1, mem_bak); + + cmp_num = memcmp(mem_1, mem_bak, 1024 * 1024); + if (cmp_num != 0) { + printf("memory compare fail\n"); + printf("..................................................[GJB_FAILED]\n"); + return -1; + } + + /* + * 构造错误数据 + */ + memset((mem_1 + 100), 'b', 1); + + /* + * 对原始内存和冗余内存数据进行比较 + */ + cmp_num = memcmp(mem_1, mem_bak, 1024 * 1024); + if (cmp_num == 0) { + free(acoinfoaddr); + printf("memory consistency check failed\n"); + printf("..................................................[GJB_FAILED]\n"); + return -1; + } + + free(acoinfoaddr); + + return 0; +} +/********************************************************************** + * 函数名称: main() + * 功能描述: 用户程序入口 + * 输入参数: 无 + * 输出参数: 无 + * 返 回 值: 无 + * 其它说明: 无 + **************************************************************************/ +int main(int argc, char **argv) +{ + int meminfo_ret = -1; + + meminfo_ret = Test_mem(); + if (meminfo_ret != 0) { + printf("fail\n"); + printf("..................................................[GJB_FAILED]\n"); + return -1; + } + + printf("..................................................[GJB_PASS]\n"); + return 0; +} -- Gitee