掌桥专利:专业的专利平台
掌桥专利
首页

一种小型CPU内存管理方法

文献发布时间:2023-06-19 18:25:54


一种小型CPU内存管理方法

技术领域

本发明属于计算机控制技术领域,涉及一种小型CPU内存管理方法。

背景技术

内存管理是计算机系统运行时是计算机内存分配以及使用的技术,内存管理的目的是更高效快速地分配内存,并在内存不再使用时将已分配的内存进行回收以供下次使用。对于可以装载Windows/linux 操作系统的大型CPU,操作系统提供成熟可靠的内存管理方式,如内存连续分配管理方式的站式管理,以及内存非连续管理方式的页式管理机制、段式管理机制以及页段式管理机制。

对于小型CPU如单片机或者某些特定功能芯片中的处理器在管理内存过程中使用标准库中的动态内存申请函数malloc以及内存释放free进行内存管理时,由于此类处理器硬件上没有任何内存管理机制,频繁地申请释放内存容易使得内存碎片随便急剧增多,导致系统运行崩溃。

发明内容

(一)发明目的

本发明的目的是:提供一种小型CPU内存管理方法,在内存中开辟了一段空间,通过对这段空间进行管理,内存申请效率高,同时在内存释放时,对这段空间的内存进行重新排布,避免了内存碎片的产生。

(二)技术方案

为了解决上述技术问题,本发明提供一种小型CPU内存管理方法,其包括以下步骤:

S1:设计一种内存池结构类型strupool;

S2:在CPU内存空间中定义内存池g_pool变量;

S3:对S2中定义的内存池g_pool变量进行初始化操作;

S4:定义内存信息管理结构体struinfo;

S5:进行内存申请操作;

S6:对申请到的内存进行释放操作;

S7打开临界区,使系统进入内核状态,关闭中断以及调度等操作,内存空间释放完成。

(三)有益效果

上述技术方案所提供的小型CPU内存管理方法,在内存中开辟了一段空间,通过对这段空间进行管理,内存申请效率高,同时在内存释放时,对这段空间的内存进行重新排布,避免了内存碎片的产生。

附图说明

图1:一种小型CPU内存申请流程图;

图2:一种小型CPU内存释放流程图;

图3:一种小型CPU内存分配图。

具体实施方式

为使本发明的目的、内容和优点更加清楚,下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。

参照图1至图3所示,本实施例小型CPU内存管理方法包括以下步骤:

S1:设计一种内存池结构类型strupool

内存池结构类型strupool包括:①当前可用内存的指针 memaddr,类型为无符号字符型指针,该内存空间以堆的方式操作。生长空间向上。②已申请空间的信息管理地址infoaddr,类型为无符号字符型指针,该内存空间以栈的方式操作,生长空间向下。③已经申请内存块的数量cnt,类型为无符号字符型。④可使用内存的长度len,类型为无符号短整形。⑤内存池空间,此空间以数组mempool 进行管理,类型为无符号字符型。长度为SIZE(本实例中设置为 1024)。

S2:在CPU内存空间中定义内存池g_pool变量

内存池g_pool变量为静态变量,变量类型为S1中定义的内存池结构类型strupool。

S3:对S2中定义的内存池g_pool变量进行初始化操作

初始化操作包括:①当前可用内存的指针memaddr设置为S1中数组mempool的地址。②已申请空间的信息管理地址infoaddr设置为S1中数组mempool的最后一个元素的地址。③已经申请内存块的数量cnt设置为0。④可使用内存的长度len设置为S1中数组mempool 的长度SIZE。⑤内存池空间所有值都设置为0,操作方法为使用内存设置函数memset进行操作。

S4:定义内存信息管理结构体struinfo

结构体struinfo共包括三个成员函数:①要申请内存指针的地址ptr,变量类型为无类型二级指针(void**)②要申请内存的地址 addr③要申请内存的长度length。

S5:进行内存申请操作

定义二级指针变量mclptr,申请到的内存指针存放到二级指针变量mclptr中。申请的长度为size,类型为无符号短整型。此结构体的长度设置为STRUINFO_LEN(计算方式以sizeof()进行计算)。

S5_1:首先判断size是否大于等于S1中定义的数组mempool的长度SIZE。如果是,则直接返回空指针,表示此次申请失败。如果否则转到S5_2

S5_2:使系统进入临界区,使系统进入内核状态,关闭中断以及调度等操作。

S5_3:将g_pool中的已申请空间的信息管理地址infoaddr向下移动STRUINFO_LEN长度,infoaddr更新后的值为infoaddr减去 STRUINFO_LEN。

S5_4:将g_pool中的已申请空间的信息管理地址infoaddr的类型强制转化为S4中内存信息管理结构体struinfo类型并进行赋值操作,①将此结构体中的ptr的值设置为指针变量mclptr的地址。②将此结构中的要申请内存的地址addr赋值为g_pool中memaddr 的值③将此结构中要申请内存的长度length赋值为size。此时 g_pool中memaddr的值即为要申请的空间,将此值赋值到ptr

S5_5:g_pool中memaddr的值向上偏移size。memaddr更新后的值为memaddr加上size。g_pool中可使用内存的长度len的值更新为len减去size后再减去STRUINFO_LEN。g_pool中已经申请内存块的数量cnt进行加一操作。

S6:对申请到的内存进行释放操作

释放操作根据S5中二级指针变量mclptr进行释放。

S6_1:如果此时g_pool中已经申请内存块的数量cnt的值为0 或者二级指针变量mclptr为空指针,则直接进行返回,提示释放操作失败

S6_2:使系统进入临界区,使系统进入内核状态,没有中断以及调度等操作。定义S4中内存信息管理结构体类型指针变量curinfo,表示当前处理的信息管理数据,初值设置为g_pool中已申请空间的信息管理地址infoaddr的值。

S6_3:定义变量i,i的值0开始,对内存池进行遍历,判断i 的值小于g_pool中已经申请内存块的数量cnt。判断成功,则转到 S6_4,判断失败则直接返回,提示错误。

S6_4:获取S6_2结构体curinfo中要申请内存指针的地址ptr 值。比较ptr的值和mclptr值是否相等,如果相等则定义变量 freesize类型为无符号短整型,赋值为curinfo中要申请内存的长度length。并转到S6_5。如果不相等,先将curinfo值更新为curinfo 的值加上STRUINFO_LEN,并对S6_3定义的变量i进行加一操作再转到S6_3。

S6_5将结构体curinfo中要申请内存指针的地址ptr设置为空。根据当前i的值,将循环将0到i的内存中的数据以及内存信息管理结构体进行搬移。

S6_5_1判断i不为0,转到S6_5_2;

S6_5_2对i进行减一操作;

S6_5_3定义变量dstmem,此变量的值设置为结构体变量 curinfo中要申请内存的地址addr。

定义变量srcmem,表示需要拷贝的数据地址。定义变量srclen,表示需要拷贝的数据的长度。变量srcmem和变量srclen的值分别设置为结构体指针变量curinfo减去STRUINFO_LEN所指的内存信息管理结构体struinfo中当要申请内存的地址addr以及要申请内存的长度length。

S6_5_4将以srcmem为首地址,长度为srclen的数据拷贝到以 dstmem为首地址,长度为srclen的空间。

S6_5_5更新结构体指针变量curinfo变量的值

将结构体指针变量curinfo中要申请内存指针的地址ptr值设置为结构体指针变量curinfo减去STRUINFO_LEN所指的内存信息管理结构体struinfo中要申请内存指针的地址ptr的值,并将更新后的 curinfo中ptr所指向的地址中存放的数据更新为当前值减去将结构体指针变量curinfo中要申请内存的长度length;将结构体指针变量curinfo中要申请内存的地址addr设置为结构体指针变量curinfo 减去STRUINFO_LEN所指的内存信息管理结构体struinfo中要申请内存的地址addr值减去curinfo中要申请内存的长度length。

将结构体指针变量curinfo中要申请内存的长度length设置为结构体指针变量curinfo减去STRUINFO_LEN所指的内存信息管理结构体struinfo中要申请内存的长度length。

S6_5_6将curinfo值更新为curinfo的值减去STRUINFO_LEN。

S6_6更新内存池的信息

将内存池g_pool已经申请内存块的数量cnt进行减一操作,将内存池g_pool可使用内存的长度len更新为len值加上 STRUINFO_LEN再加上S6_4中freesize的值。

将内存池g_pool当前可用内存的指针memaddr更新为当前值减去S6_4中freesize的值,将内存池g_pool已申请空间的信息管理地址infoaddr更新为当前值加上STRUINFO_LEN的值。

S7打开临界区,使系统进入内核状态,关闭中断以及调度等操作,内存空间释放完成。

以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。

技术分类

06120115565856