背景技术
在现有技术的通信设备中,根据内存管理系统的要求,内存池被划分为多个内存块,每个内存块包括一个缓存块。响应于进程的请求,内存管理系统动态地为进程分配空闲缓存块,或者接收进程归还的缓存块。缓存块具有规定的容量,例如64字节、128字节、2048字节等。根据缓存块容量的不同,内存块相应地分为多种类型。同一类型的内存块,通过指针链接成链,然后经过相应的内存块链头组成环。内存管理系统,利用内存块链头,对链接成环的内存块进行管理。
图1示意性地示出了现有技术中的内存块链结构。如图1所示,标号110表示内存块链头,标号120表示内存块。作为举例,图1中仅示出了三个内存块120,它们都包括相同容量的缓存块。
图2A是图1中的内存块链头的示意结构图。如图2A所示,内存块链头110具有前趋指针111、后继指针112、链信息113等字段。前趋指针111用于存放内存块链中最后一个内存块的起始地址;后继指针112用于存放内存块链中第一个内存块的起始地址;链信息113用于存放与当前内存块链有关的信息,例如当前内存块链中内存块的类型,例如所包括的缓存块的容量等。
图2B是图1中的内存块的示意结构图。如图2B所示,内存块120包括内存控制块130和缓存块124。内存控制块130包括前趋指针121、后继指针122以及块信息123等字段。前趋指针121用于存放内存块链中当前内存块的前一内存块的起始地址;后继指针122用于存放内存块链中当前内存块的后一内存块的起始地址;块信息123用于存放与管理内存块有关的信息,例如该内存块是否被占用等。缓存块124,在被分配给进程后,由进程使用。被分配给进程的缓存块,包括该缓存块的内存块从内存块链中摘除,并由操作系统将该内存块链接到该进程的进程控制块。这样,在进程崩溃时,进程所申请的内存块可以被操作系统释放。因此,在实际情况中,内存块链中链接的内存块都是空闲内存块。
当进程例如使用get_mem原语向内存管理系统请求分配一个指定类型(例如,64字节)的缓存块时,内存管理系统首先在图1所示的内存池中找到与该指定类型相应的内存块链头(例如内存块链头110),然后在该内存块链头为首的内存块链中,找到一个其缓存块空闲的内存块,作为空闲内存块。如前文所述,内存块链中链接的内存块都是空闲内存块。所以,上述步骤中,只需要简单地取内存块链表中的第一个内存块,即可获得一个空闲内存块。接着,内存管理系统对该空闲内存块进行分配处理。分配处理例如包括:(1)将请求分配缓存块的进程的进程号写入该空闲内存块的内存控制块中所包括的块信息中的特定位置,表明该空闲内存块已以占用;(2)从内存块链中摘除该内存块,并将该内存块链接到该进程的进程控制块。在分配处理完成之后,内存管理系统将该空闲缓存块的地址返回给进程。此后,进程即可使用该空闲缓存块。
当进程例如使用ret_mem原语请求归还缓存块时,该进程向内存管理系统指定一个内存地址,作为待归还缓存块的地址。因为内存控制块的结构和大小是由内存管理系统预先规定的(例如如图2B所示),所以内存管理系统将待归还缓存块的地址之前的一段存储器内容作为对应于待归还缓存块的内存块的内存控制块。本发明中将如此确定的内存控制块称为伪内存控制块,将对应于伪内存控制块的内存块称为伪内存块。接着,内存管理系统对伪内存块进行释放处理。释放处理例如包括:(1)将请求归还缓存块的进程的进程号从伪内存块的伪内存控制块中所包括的块信息中的特定位置处清除,表明该伪内存块变为空闲;(2)将该伪内存块与该进程的进程控制块(1)分离,并将该伪内存块插入内存块链(通常在链尾插入)。在释放处理完成之后,通知进程缓存块已成功归还。
然而,上述内存管理系统具有以下缺点。例如,当进程向内存管理系统请求归还缓存块但是由于各种原因而给出一个未指向待归还缓存块的地址(下称“无效地址”)时,内存管理系统不能察觉这一错误,而仍然象上文所述那样,将该无效地址之前的一段存储器内容作为对应于待归还缓存块的内存块的内存控制块(实际上是一个假内存控制块),对该段存储器内容错误地进行修改。这种修改是非常危险的,因为所修改的内容可能是正由其他进程或操作系统使用的内容。另外,这种对存储器内容的随意修改,极有可能破坏内存池中的各种链接。严重的情况下,导致系统崩溃。
现有的内存管理系统中,未提供针对上述情况的保护措施,所以,即使进程请求归还的缓存块地址是无效地址,进程也将继续运行,直至该进程或其他进程产生一般保护错误,即发生了对内存的未经授权的访问。一般保护错误发生在ret-mem原语中,而ret-mem原语可由任何进程调用。所以,很难跟踪和修复造成无效地址的错误。当无效指针破坏了内存池时,操作系统不得不重新启动。
发明内容
本发明的目的在于提高内存管理系统的防错性能,防止内存地址操作错误的进一步扩大,避免系统崩溃。
为达到上述目的,本发明提供一种内存管理方法,其特征在于包括以下步骤:
在初始化内存池时,将特定值赋给每个内存块的内存控制块中的检查指针;
响应于进程的缓存块分配请求,在所述内存池中查找一个空闲内存块,并将所述空闲内存块中包括的缓存块分配给所述进程;以及
响应于进程的缓存块归还请求,根据所述进程作为伪缓存块地址指定的内存地址,在所述内存池中定位一个伪内存控制块,并且仅在所述伪内存控制块中的检查指针的值满足特定条件时,才释放所述伪缓存块。
本发明还提供一种内存管理系统,其特征在于包括:
内存池,包括多个内存块,每个内存块包括一个内存控制块和一个缓存块,所述内存控制块中的检查指针被赋予特定值;
缓存块分配装置,用于响应于进程的缓存块分配请求,在所述内存池中查找一个空闲内存块,并将所述空闲内存块中包括的缓存块分配给所述进程;以及
缓存块释放装置,用于响应于进程的缓存块归还请求,根据所述进程作为伪缓存块地址指定的内存地址,在所述内存池中定位一个伪内存控制块,并且仅在所述伪内存控制块中的检查指针的值满足特定条件时,才释放所述伪缓存块。
根据本发明的内存管理系统和方法,可以在归还缓存块之前,检测待归还缓存块的地址的有效性。当检测到待归还缓存块的地址是一个无效地址时,也就是说,待归还缓存块是一个假缓存块时,可以不释放该缓存块,而将该无效地址以及请求归还该缓存块的进程的进程号和入口记录下来,以便于跟踪和修复有关错误。
结合附图阅读本发明实施方式的详细描述后,本发明的其他特点和优点将变得更加清楚。
具体实施方式
下面结合附图描述本发明的实施例。
图1示意性地示出了现有技术中的内存块链结构,图2A是图1中的内存块链头的示意结构图,图2B是图1中的内存块的示意结构图。这些图在前文已有描述。
在根据本发明的内存管理系统的一种实施例中,采用与图1所示的内存块链结构类似的结构。也就是说,在本发明的一种实施例中,将内存池划分为多个内存块,每个内存块包括一个缓存块。响应于进程的请求,内存管理系统动态地为进程分配空闲缓存块,或者释放进程归还的缓存块。缓存块具有规定的容量,例如64字节、128字节、2048字节等。根据缓存块容量的不同,内存块相应地分为多种类型。同一类型的内存块,通过指针链接成链,然后经过相应的内存块链头组成环。内存管理系统,利用内存块链头,对链接成环的内存块进行管理。本发明与现有技术的内存管理系统的主要不同在于内存块的结构。
图3是根据本发明的内存管理系统的一种实施例中采用的内存块示意结构图。如图3所示,内存块320包括内存控制块330和缓存块325。内存控制块330包括前趋指针321、后继指针322、块信息323以及检查指针324等字段。前趋指针321用于存放内存块链中当前内存块的前一内存块的起始地址;后继指针322用于存放内存块链中当前内存块的后一内存块的起始地址;块信息323用于存放与管理内存块有关的信息,例如该内存块是否被占用等;检查指针324用于存储缓存块325的起始地址。可替代的是,检查指针324也可存储一种由内存管理系统规定的、足以鉴别缓存块325是真缓存块还是假缓存块的特定值。缓存块325,在被分配给进程后,由进程使用。
在采用上述内存管理系统的通信设备的初始化过程中,内存管理系统对各个内存块链进行初始化。其中的一个重要步骤是对各个内存控制块中的检查指针进行赋值。
初始化之后,内存管理系统就可以响应于进程的请求,动态地为进程分配空闲缓存块,或者释放进程归还的缓存块。
图4是根据本发明的内存管理方法的一种实施例的流程图。如图4所示,流程从步骤401开始,然后在步骤402进行初始化。初始化与常规内存管理系统中进行的初始化类似,即对内存池中的各个内存块链中的各种指针、链信息、块信息等进行初始赋值。其中的一个重要步骤是对各个内存控制块(如图3中的内存控制块330)中的检查指针(如图3中的检查指针324所示)赋予特定值。在一个例子中,对于每个内存块来说,该特定值是该内存块中包括的缓存块的起始地址。在另一个例子中,该特定值是一个足以鉴别伪缓存块是真缓存块还是假缓存块的值,例如可以是0xFFFFFFFF。
在步骤402之后,流程进行到步骤403。步骤403至步骤430组成一个循环,用于响应进程的请求,动态地为进程分配空闲缓存块、释放进程归还的缓存块或进行其他处理,直至出现结束条件。下面对步骤403至步骤430进行详细描述。
在步骤403,内存管理系统接收进程的请求。
在步骤404,判断进程的请求是否是分配缓存块的请求。如果步骤404的判断结果为否,则流程进行到步骤414,否则进行到步骤405。
在步骤405,在内存池中查找一个与所请求分配的缓存块的类型(例如64字节、128字节、2048字节等)相应的内存块链头。该内存块链头的结构例如如图2A所示。
然后,在步骤406,在该内存块链头所链接的内存块链中,查找一个包括空闲缓存块的内存块(称为空闲内存块)。采用何种算法查找空闲内存块对本发明不构成限制。本发明可采用现有技术中的任何可行算法来查找一个空闲内存块。较好的是,采用速度最快的算法。如前文所述,一般地,内存块链中的第一个内存块即为空闲内存块。
在步骤407,判断是否找到一个空闲内存块。如果步骤407的判断结果是“否”,则流程进行到步骤410;否则进行到步骤408。
在步骤408,根据内存管理系统对分配缓存块过程的要求,对找到的空闲内存块进行分配处理。这里所述的分配处理与前文描述的现有技术中的空闲内存块分配处理相同,不再赘述。
然后,在步骤409,将该内存块中的缓存块的起始地址返回给进程。至此,完成对一个空闲缓存块的分配过程。
如果步骤407的判断结果为否,则流程进行到步骤410。
在步骤410,向进程返回一个表示缓存块分配失败的值。
如果步骤404的判断结果为否,则流程进行到步骤414。
在步骤414,判断进程的请求是否是归还缓存块的请求。如果步骤414的判断结果为是,则流程进行到步骤415;否则,流程进行到步骤421。
在步骤415,根据进程作为伪缓存块地址指定的内存地址,在内存池中定位一个伪内存控制块。以图3所示的内存块结构为例。假设内存地址为32位,即四个字节长,还假设块信息323也是四个字节长,则内存控制块330的长度为十六个字节。这样,因为将进程指定的内存地址认为是待归还的伪缓存块(如图3中的缓存块325)的起始地址,所以,在步骤415中,将进程指定的内存地址之前的十六个字节的存储器内容(如图3中的前趋指针321到检查指针324之间的内容)认为是包括伪缓存块的伪内存块(如图3中的内存块320)的伪内存控制块(如图3中的内存控制块330)。
在步骤416,对伪内存控制块中的检测指针的值与特定值进行比较。
在步骤417,根据步骤416中的比较结果,判断伪内存控制块中的检测指针的值是否满足特定条件,即是否与特定值匹配。如前文参照图3所述,检查指针的值可以是缓存块的起始地址,也可以是内存管理系统规定的、足以鉴别伪缓存块是真缓存块还是假缓存块的特定值。
当内存管理系统规定检查指针中存储的是缓存块的起始地址时,步骤417中判断出匹配的情况是指进程指定的内存地址与检查指针的值相等。
当内存管理系统规定检查指针中存储的是规定的特定值(比如,0xFFFFFFFF)时,步骤417中判断出匹配的情况是指进程指定的内存地址与该特定值相等。
总之,步骤416和步骤417是为了检验进程请求内存管理系统释放的内存地址是否是有效的缓存块起始地址。
如果步骤417的判断结果为是(即,进程归还真缓存块),则流程进行到步骤418;否则(即,进程归还假缓存块),进行到步骤420。
在步骤418,按照内存管理系统释放缓存块的过程,对步骤415确定的伪内存块进行释放处理。这里所述的释放处理与前文描述的现有技术中的伪内存块释放处理相同,不再赘述。
在步骤420,将进程号和入口地址以及进程指定的内存地址(已在步骤417确定为无效地址)记录到日志中,以便能够跟踪和修复有关错误。
步骤418和步骤420之后,流程均进行到步骤419。
在步骤419,向进程返回一个表示缓存块归还成功的值。
值得说明的是,在进程指定无效地址的情况下,流程经步骤420进行到步骤419,从而内存管理系统未对内存池中的任何内容进行修改,却向进程返回一个表示缓存块归还成功的值。这样做是基于进程并未实际占用其请求归还的内存地址指向的存储器空间。
当然,也可以选择在步骤420之后,向进程返回一个表示缓存块归还失败的值,进而由进程做相应的处理。或者,由内存管理系统调用一个跟踪过程。
另外,在步骤415与步骤416之间,也可以加入一个判断请求归还的内存地址是否位于内存池地址空间的步骤。如果判断出请求归还的内存地址在内存池地址空间之外,则流程直接进行到步骤420;否则进行到步骤416。
在步骤421,由内存管理系统对进程的其他请求进行处理。
在上述步骤410、409、419、421之后,流程进行到步骤430。
在步骤430,判断是否结束内存管理系统的操作。例如,当通信设备关机时,可以判断需要结束内存管理系统的操作。当然,步骤430也可位于流程中的其他位置,因而不构成对本发明的限制。
如果步骤430的判断结果为否,则流程返回到步骤403;否则,流程进行到步骤440。
在步骤440,流程结束。
图5是根据本发明的内存管理系统的一种实施例的示意结构图。如图5所示,本发明的内存管理系统包括内存池501、缓存块分配装置502、缓存块释放装置503、以及错误记录装置504。图5所示的内存管理系统根据图4所示的原理工作。
内存501中包括多个内存块,每个内存块包括一个内存控制块和一个缓存块,内存控制块中的检查指针被赋予特定值。内存块的结构可如图3所示,但不限于图3。
缓存块分配装置502,用于响应于进程505的缓存块分配请求,在内存池501中查找一个空闲内存块,并将该空闲内存块中包括的缓存块分配给进程505。
缓存块释放装503,用于响应于进程505的缓存块归还请求,根据进程505作为伪缓存块地址指定的内存地址,在内存池501中定位一个伪内存控制块,并且仅在该伪内存控制块中的检查指针的值满足特定条件时,才释放该伪缓存块。
缓存块释放装置503判断的特定条件是指伪内存控制块中的检查指针的值等于特定值。在内存池501中,对于每个内存块来说,该特定值是内存块中包括的缓存块的起始地址。另外,该特定值也可以是一个足以鉴别伪缓存块是真缓存块还是假缓存块的其他值。
当该特定值是内存块中包括的缓存块的起始地址时,缓存块释放装置503判断的特定条件是指伪内存控制块中的检查指针的值等于进程505作为伪缓存块地址指定的内存地址。
错误记录装置504,用于在伪内存控制块中的检查指针的值不满足特定条件时,记录伪缓存块地址、进程505的进程号、进程505的入口地址中的至少一项。
虽然以上结合附图描述了本发明的实施方式,但是本领域内熟练的技术人员可以在所附权利要求的范围内做出各种变形或修改。