一种实现内存管理的方法

阅读: 评论:0

著录项
  • CN03123049.0
  • 20030429
  • CN1542623
  • 20041103
  • 华为技术有限公司
  • 丁阳华
  • G06F12/06(2006.01)
  • G06F12/06(2006.01) G06F9/00(2006.01)

  • 广东省深圳市科技园科发路华为用服大厦
  • 中国,CN,广东(44)
  • 北京德琦知识产权代理有限公司
  • 宋志强
摘要
本发明公开了一种实现内存管理的方法,该方法将内存划分为多个固定空间的内存块,并申请管理该内存块的缓冲区描述符(BD),与外界通信的数据处理程序将需要处理的数据保存在BD对应的内存块中,并通过数据处理程序处理该数据,再将处理后的数据通过与外界通信的数据处理程序发送出去。本发明解决了现有技术动态管理内存时内存地址不固定和静态管理内存时不能对内存空间统一管理的问题,实现了对内存空间的统一管理,且该统一管理对于软件系统来说是透明的,软件系统可以通过从固定地址获取全局变量来得知系统运行情况。
权利要求

1、一种实现内存管理的方法,其特征在于该方法至少包括以下步骤:

a.从内存中划分用于存储软件系统数据的数据内存空间,并将数据内存空 间划分为一个以上固定大小的内存块,对应每个内存块申请缓冲区描述符 (BD),所有BD构成空闲BD队列;

b.判断是否有数据需要接收,如果有,则从空闲BD队列中申请BD,在 该BD对应内存中存储数据,并把该BD组成BD接收队列,之后进入下一步, 否则返回步骤b;

c.判断是否有BD接收队列需要处理,如果有,则进一步判断BD接收队 列中BD对应的数据是否需要应答,如果需要,则将处理后的应答信息保存在 该BD对应内存中,并把该BD组成BD发送队列,之后进入步骤d,如果不需 要,则处理该数据,并将该BD发送到空闲BD队列,否则,返回步骤c;

d.判断是否有BD发送队列需要处理,如果需要,则将该BD对应的数据 发送出去,并将空闲的BD发送到空闲BD队列,否则返回步骤d。

2、根据权利要求1所述的方法,其特征在于所述步骤a中,所述BD中包 括前向指针、后向指针、BD对应内存的内存地址及该内存中保存数据的数据 长度,队列中的BD通过双链表的数据结构进行管理。

3、根据权利要求2所述的系统,其特征在于,所述步骤b之前进一步包括, 初始化BD中的前向指针、后向指针、BD对应内存的内存地址及该内存中保存 数据的数据长度。

4、根据权利要求2所述的方法,其特征在于,所述在处理BD时,设置当 前处理BD中的前向指针、后向指针及该内存中保存数据的数据长度。

5、根据权利要求1所述的方法,其特征在于,所述空闲BD队列、BD接 收队列和BD发送队列符合先进先出原则。

6、根据权利要求1所述的方法,其特征在于,所述BD接收队列中设 置首BD指针和尾BD指针,所述BD发送队列中设置首BD指针和尾BD 指针,通过BD接收队列的首BD指针将接收了数据的BD加入到BD接收 队列,并通过BD发送队列的尾BD指针从BD发送队列中获取BD,通过 BD接收队列的尾BD指针从BD接收队列中获取需要处理的BD,并通过 BD发送队列的首BD指针将处理后的BD发送到BD发送队列。

7、根据权利要求1所述的方法,其特征在于该方法进一步包括,预先 从空闲BD队列中申请一个或以上的、用作预设BD的空闲BD,

所述步骤b中将需要接收的数据存储到该预设BD中,且所述步骤b之 后进一步包括,

b1.从空闲BD队列中申请用作预设BD的空闲BD,并判断预设BD是 否少于预先申请的预设BD的个数,如果少于,则返回步骤b1,否则,进入 步骤c。

8、根据权利要求7所述的方法,其特征在于该方法进一步包括,将数据存 储到预先申请的预设BD后,判断预设BD对应的内存是否够用,如果够用, 则进入步骤c,否则,从空闲BD队列中申请BD,在该申请的BD对应内存中 保存数据,并设置该BD。

9、根据权利要求1所述的方法,其特征在于所述步骤c中,在原有BD对 应的内存中保存处理后的应答信息时,判断原有BD对应的内存是否够用,如 果正好够用,则直接把该BD组成BD发送队列;如果不够用,则从空闲BD 队列中申请BD,在所申请的BD对应内存中保存应答信息,并将该BD发送到 BD发送队列;如果有空闲的BD,则将该空闲BD发送到空闲BD队列,并将 应答信息对应的BD发送到BD发送队列。

10、根据权利要求1所述的方法,其特征在于该方法进一步包括,从内存 中划分用于存储全局变量和内存管理数据的静态内存空间。

11、根据权利要求1所述的方法,其特征在于该方法进一步包括,建立包 括一个以上空闲的BD、且符合先进先出原则的BD抓取队列,并设置记录该 BD抓取队列首BD的全局变量指针,通过全局变量指针将BD接收队列或BD 发送队列中BD对应内存中的数据从BD抓取队列的首BD开始,依次复制到 BD抓取队列的BD对应的内存中。

13、根据权利要求1所述的方法,其特征在于该方法进一步包括,设置子 服务程序,在处理子服务程序后,向空闲BD队列申请空闲的BD,将处理得到 的数据存储在BD对应的内存中,并将该BD发送到BD发送队列。

12、根据权利要求3所述的方法,其特征在于该方法进一步包括,设置用 于统计空闲BD队列、BD接收队列或BD发送队列中BD数目的全局变量,则 所述初始化进一步包括初始化全局变量。

说明书
技术领域

技术领域

本发明涉及内存管理技术,更确切地说是涉及一种实现内存管理的方 法。

背景技术

内存是计算机类产品的重要硬件设备,软件系统实现各种功能都离不开 对内存进行读写。目前业界对内存的管理通过操作系统实现,因此软件系统 使用内存时都要依赖于操作系统。操作系统对内存的管理可以分为动态管理 和静态管理两种。

目前操作系统对内存的管理主要是动态管理,软件系统通过调用空间申 请函数向操作系统申请内存时,操作系统动态地为该软件系统分配内存。从 使用者的角度来看,这种基于动态管理的操作系统对内存的分配是随机的, 没有可以遵循的规律,即操作系统分配内存对于使用者来说是透明的。基于 这样的动态管理,软件系统在实现其应用的过程中无须关心操作系统如何分 配和管理内存,操作系统动态管理内存的方法也使软件系统无法知道系统对 内存的管理情况,因此软件系统在使用内存时只能完全依赖操作系统所提供 的内存地址空间,因此操作系统出现问题时,软件系统往往无法得知这个情 况,仍然根据原有的内存地址查信息,而由于该内存中的信息可能已经不 存在了,因此会导致软件系统运行不稳定,甚至崩溃。并且,由于所有的内 存分配都是随机的,所以软件系统所使用的全局变量的内存地址就不会是固 定地址,也就不能通过直接访问已知的内存地址获得全局变量的值,使操作 系统或软件系统运行异常时,很难准确地定位所出现的问题。

操作系统静态管理内存的方案大多应用在底层硬件的功能实现方面,这 种静态管理是在操作系统中设置绝对内存,比如说设置芯片的PCI总线属性 寄存器或芯片中断寄存器,软件系统对内存空间的使用是可见的,软件系统 直接对操作系统空间中绝对内存的地址进行访问。这种访问基本上是离散 地,一般都是单独访问,即每次只访问一个固定地址。在这种对内存静态管 理的技术方案中,虽然软件系统可以实现对固定内存地址空间的直接访问, 不存在动态访问时需要通过操作系统动态申请内存空间的问题,但是这种方 案没有提出操作系统对内存空间进行统一管理的方法,因此不是一个独立、 封闭的内存管理方法。

综上所述,在现有的这两种操作系统对内存管理的方法中,由于动态管 理是随机分配地址,因此软件系统所使用的全局变量的内存地址不固定,不 能通过已知的内存地址直接访问全局变量的值,如果程序运行异常,往往很 难准确地定位所出现的问题;静态管理方法没有提出对内存空间统一管理的 方法,因此其不是一个独立、封闭的内存管理方法。

发明内容

有鉴于此,本发明的主要目的在于提供一种实现内存管理的方法,使在 保证软件系统能够使用固定地址内存的同时,对内存进行统一管理。

为达到以上目的,本发明的技术方案是这样实现的:一种实现内存管理的 方法,该方法至少包括以下步骤:

a.从内存中划分用于存储软件系统数据的数据内存空间,并将数据内存空 间划分为一个以上固定大小的内存块,对应每个内存块申请缓冲区描述符 (BD),所有BD构成空闲BD队列;

b.判断是否有数据需要接收,如果有,则从空闲BD队列中申请BD,在 该BD对应内存中存储数据,并把该BD组成BD接收队列,之后进入下一步, 否则返回步骤b;

c.判断是否有BD接收队列需要处理,如果有,则进一步判断BD接收队 列中BD对应的数据是否需要应答,如果需要,则将处理后的应答信息保存在 该BD对应内存中,并把该BD组成BD发送队列,之后进入步骤d,如果不需 要,则处理该数据,并将该BD发送到空闲BD队列,否则,返回步骤c;

d.判断是否有BD发送队列需要处理,如果需要,则将该BD对应的数据 发送出去,并将空闲的BD发送到空闲BD队列,否则返回步骤d。

所述步骤a中,所述BD中包括前向指针、后向指针、BD对应内存的内存 地址及该内存中保存数据的数据长度,队列中的BD通过双链表的数据结构进 行管理。

所述步骤b之前进一步包括,初始化BD中的前向指针、后向指针、BD对 应内存的内存地址及该内存中保存数据的数据长度。

所述在处理BD时,设置当前处理BD中的前向指针、后向指针及该内存 中保存数据的数据长度。

所述空闲BD队列、BD接收队列和BD发送队列符合先进先出原则。

所述BD接收队列中设置首BD指针和尾BD指针,所述BD发送队列 中设置首BD指针和尾BD指针,通过BD接收队列的首BD指针将接收了 数据的BD加入到BD接收队列,并通过BD发送队列的尾BD指针从BD 发送队列中获取BD,通过BD接收队列的尾BD指针从BD接收队列中获 取需要处理的BD,并通过BD发送队列的首BD指针将处理后的BD发送 到BD发送队列。

该方法进一步包括,预先从空闲BD队列中申请一个以上的、用作预设 BD的空闲BD,

所述步骤b中将需要接收的数据存储到该预设BD中,且所述步骤b之 后进一步包括,

b1.从空闲BD队列中申请用作预设BD的空闲BD,并判断预设BD是 否少于预先申请的预设BD的个数,如果少于,则返回步骤b1,否则,进入 步骤c。

该方法可以进一步包括,将数据存储到预先申请的预设BD后,判断预设 BD对应的内存是否够用,如果够用,则进入步骤c,否则,从空闲BD队列中 申请BD,在该申请的BD对应内存中保存数据,并设置该BD。

所述步骤c中,在原有BD对应的内存中保存处理后的应答信息时,判断 原有BD对应的内存是否够用,如果正好够用,则直接把该BD组成BD发送 队列;如果不够用,则从空闲BD队列中申请BD,在所申请的BD对应内存中 保存应答信息,并将该BD发送到BD发送队列;如果有空闲的BD,则将该空 闲BD发送到空闲BD队列,并将应答信息对应的BD发送到BD发送队列。

该方法可以进一步包括,从内存中划分用于存储全局变量和内存管理数据 的静态内存空间。

该方法可以进一步包括,建立包括一个以上空闲的BD、且符合先进先出原 则的BD抓取队列,并设置记录该BD抓取队列首BD的全局变量指针,通过 全局变量指针将BD接收队列或BD发送队列中BD对应内存中的数据从BD抓 取队列的首BD开始,依次复制到BD抓取队列的BD对应的内存中。

该方法还可以进一步包括,设置用于统计空闲BD队列、BD接收队列或 BD发送队列中BD数目的全局变量,则所述初始化进一步包括初始化全局变 量。

该方法还可以进一步包括,设置子服务程序,在处理子服务程序后,向空 闲BD队列申请空闲的BD,将处理得到的数据存储在BD对应的内存中,并将 该BD发送到BD发送队列。

本发明具有以下效果:

1)通过从内存中划分出存储软件系统数据的数据内存空间,将该数据 内存空间划分为多个固定大小的内存块,并设置对应每个内存块的BD,保 证能够根据软件系统的数据提供固定地址的内存空间,并且通过对BD的管 理实现对内存空间的统一管理,且对内存空间的管理对于软件系统来说是透 明的。

2)通过从内存中划分出存储全局变量及内存管理数据的静态内存空间, 使软件系统能够从固定地址获取全局变量,因此可以根据全局变量获取软件 系统运行故障的原因等。

3)通过设置动态统计BD队列中BD个数的全局变量,使软件系统可 以通过调用该全局变量得知BD的使用情况。

4)通过建立BD抓取队列,并设置记录该BD抓取队列首BD位置的全 局变量指针,实现在对BD对应内存中的数据进行查看的同时,不影响该数 据的处理。

附图说明

图1为本实施例的内存管理系统对划分后的内存空间的管理示意图;

图2为本实施例的内存管理系统实现内存管理的流程图;

图3为本实施例中BD抓取队列的示意图。

具体实施方式

下面结合附图及具体实施例对本发明方案作进一步详细的说明。

本发明通过内存管理系统实现对内存的管理,具体为通过与外界通信的 数据处理程序和数据处理程序对内存进行管理,这两个程序是内存管理系统 的驱动程序。该内存管理系统可以独立于操作系统,软件系统直接通过该内 存管理系统即可实现对内存的读写。

本实施例首先从内存中划分一块空间用于存储全局变量和内存管理数 据,将该部分空间称作静态内存空间,划分另一部分空间用于存储各种软件 程序在执行过程中形成的数据,将该部分空间称作数据内存空间,并进一步 将该数据内存空间划分为多个固定大小的内存块,划分内存块的大小以能够 保存一个数据为准。通过这样的设置,软件系统能够通过访问固定的内存地 址获得本系统的运行状况信息,即使本软件系统因故障等问题停止运行,只 要能够访问内存,也可以从内存管理数据及全局变量中获得出现问题的关键 信息。

还要根据需要设定与该内存管理系统相关的全局变量,并从操作系统中 申请用作BD的数据结构。所申请的BD与数据内存空间的内存块一一对应, BD中包括前向指针(pstPre)、后向指针(pstNext)、内存地址(udwAddress) 和数据长度(udwDataLength)四个字段,pstPre用于标识本BD的前一个 BD,pstNext用于标识本BD的后一个BD,udwAddress用于标识该BD所 对应的内存空间的地址,udwDataLength中存储该BD对应的内存空间中数 据的长度。

内存管理系统由空闲BD队列、BD接收队列、BD发送队列、空间申请 函数、与外界通信的数据处理程序以及数据处理程序组成。空闲BD队列由 所有空闲的BD构成;BD接收队列由与外界通信的数据处理程序根据外界 传递进来的数据所形成的BD组成;BD发送队列由数据处理程序根据处理 后的数据所形成的BD组成。软件程序通过空间申请函数使用内存。与外界 通信的数据处理程序接收可执行程序需要保存的数据,并将处理后的数据发 送给可执行程序。数据处理程序对BD对应内存中的数据进行处理。

空闲BD队列、BD接收队列及BD发送队列都符合先进先出(FIFO, First In First Out)的原则,且每个队列中的BD都通过双链表的数据结构进 行管理。在BD接收队列和BD发送队列中分别设置了指向该队列首BD的 首BD指针和指向从该队列尾BD的尾BD指针,对于BD接收队列,与外 界通信的数据处理程序通过首BD指针将接收了数据的BD加入到BD接收 队列中,数据处理程序通过尾BD指针从BD接收队列中获取需要处理的 BD;对于BD发送队列,数据处理程序通过BD发送队列的首BD指针将处 理后的BD发送到BD发送队列,与外界通信的数据处理程序通过BD发送 队列的尾BD指针将BD对应内存中的数据发送到外界。

该内存管理系统对划分之后的内存空间的管理参见图1,对应的管理流 程图参见图2,其管理过程对应以下步骤:

a.对内存管理系统进行初始化。

该初始化包括对操作系统及本内存管理系统中全局变量的初始化和对 BD的初始化。初始化BD时,逐个初始化所有的BD,初始化BD包括初始 化该BD中的pstPre、pstNext、udwAddress和udwDataLength。初始化 udwAddress时,即为在udwAddress中记录其所代表内存的起始地址,这个 地址一旦被设定,则以后的软件系统只通过对该值进行“读”操作来查内 存中的数据。

b.与外界通信的数据处理程序预先申请若干个空闲BD作为预设BD。

所申请的预设BD的个数固定,在设定时以足够处理数据为准。本实施 例将该处理程序中的预设BD设置为3个。

c.与外界通信的数据处理程序判断是否有数据需要接收,如果有,则 进入下一步,否则,返回步骤c。

与外界通信的数据处理程序可能是根据系统中的定时器或中断的情况 判断是否有数据需要接收,也可能是根据是否有消息需要处理来判断是否有 数据需要接收。

d.与外界通信的数据处理程序将该数据存储到预先申请的BD对应的 内存中,并设置该BD中的udwDataLength、pstPre和pstNext,之后将该BD 发送到BD接收队列,并判断步骤b所申请的空闲BD是否够用,如果够用, 则进入下一步,如果不够用,则向空闲BD队列申请空闲的BD,并返回步 骤d。

f.与外界通信的数据处理程序从空闲BD队列中申请空闲的BD,该空 闲BD补充到该处理程序中,并判断该处理程序中的预设BD是否小于步骤 b中设定的3个,如果小于,则返回步骤f,否则,进入下一步。

g.数据处理程序通过查询BD接收队列判断其中是否有BD对应的数据 需要处理,如果有,则进入下一步,否则,返回步骤g。

h.数据处理程序判断该BD对应的数据是否需要应答,如果需要,则 进入i,否则,进入步骤j。

i.数据处理程序复用该BD对应的内存空间,将形成的应答数据保存在 该内存空间中,并将该BD发送到BD发送队列,并判断该内存空间是否够 用,如果正好够用,则进入步骤k,如果有空闲的BD,则将空闲BD中的 pstPre、pstNext和udwDataLength置0,并将该空闲BD发送到空闲BD队 列,之后进入步骤k,如果内存空间不够用,则根据需要从空闲BD队列中 申请空闲BD,并在该空闲BD对应的内存中保存数据,并将处理后的BD 发送到BD发送队列,之后进入步骤k。

j.数据处理程序在执行完相应的操作之后,将BD接收队列中BD的 pstPre、pstNext和udwDataLength置0,并将该BD发送到空闲BD队列中。

k.与外界通信的数据处理程序通过查询BD发送队列判断其中是否有 BD对应的数据需要发送,如果有,则将该BD对应的数据发送出去,并将 处理后的BD放回空闲BD队列,否则,返回步骤k。

基于本发明的内存管理系统,软件系统在访问内存时,通过该系统提供 的空间申请函数向操作系统申请内存,内存管理系统则通过以上步骤进行处 理。

由于外界系统中每次所发送的数据的数量有限,本实施例在与外界通信 的数据处理程序中预先设置的3个BD肯定够用,且每个BD对应的内存空 间也足够放置数据,所以可以对上述过程进行简化处理,即与外界通信的数 据处理程序不需要判断其预先设置的BD是否够用,数据处理程序处理完 BD对应数据后直接将该数据保存在该BD对应的内存中,而不需要再判断 该BD对应的内存是否够用。

本实施例中只建立了空闲BD队列、BD接收队列和BD发送队列,还 可以根据需要建立其他的BD队列。比如,为实现在系统应用过程中对正在 进行处理的消息进行观察,同时又不影响该消息的正常处理,因此可以建立 BD抓取队列,这个BD抓取队列同样需要符合FIFO原则。参见图3,该 BD抓取队列是从空闲BD队列中申请若干个BD,并将这些BD组成一个环 行的链表,选择其中的一个BD作为首BD,并设置一个全局变量指针记录 该头BD的位置。如果有消息进入消息接收队列或BD发送队列,则可以通 过这个全局变量指针依次从BD接收队列或BD发送队列的BD所对应的内 存中获取数据,并从BD抓取队列的首BD开始,将数据依次复制到BD抓 取队列的BD所对应的内存中,并在各个BD中记录相关的pstPre、pstNext 和udwDataLength。再通过查看BD抓取队列的BD对应内存中的数据来了 解消息的实际内容。

还可以根据需要设定用于统计该内存管理系统的各BD队列中BD个数 的全局变量,通过该全局变量动态统计各个队列当前的BD个数,软件系统 可以通过调用该全局变量得知BD的使用情况。

还可以对数据处理程序进行功能扩展,即在数据处理程序中根据需要设 置子服务程序,数据处理程序在处理子服务程序后,向空闲BD队列申请空 闲的BD,并将处理得到的数据存储在BD对应的内存中。下面以设置一个 系统时钟为例。

如果需要内存管理系统在应用过程中能够定时地向外部软件系统通知 本系统的“心跳”,则可以设置一个系统时钟,该系统时钟每隔一秒产生一 次中断,对应该时钟在数据处理程序中设置一个中断服务程序,数据处理程 序在处理该中断服务程序后,会产生需要向外部软件系统发送的数据,因此 数据处理程序向空闲BD队列申请空闲的BD,将处理得到的数据保存在该 空闲BD对应的内存中,并将该BD发送到BD发送队列。

本发明方法结合了现有操作系统动态管理内存的透明性和静态管理内 存时软件系统可以直接访问内存的特点,并能够对内存空间进行统一管理。 对软件系统来说,这个内存管理系统与传统的操作系统提供的内存空间管理 从软件系统的角度来说都是透明的,都可以通过简单地调用相应的空间申请 函数来获得软件系统需要的内存空间;但从本系统可以查看内存运行状况及 BD队列的使用情况、可以通过指定的地址查看重要的全局变量、可以在不 影响软件流程的情况下查看BD对应内存中的数据的角度来说,又是可见的, 非通明的。

本文发布于:2023-04-15 08:20:58,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/1/87689.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图