对安全控制模块内存进行集中控制的方法 【技术领域】
本发明属于安全操作系统领域,是一种对安全控制模块运行中所使用的内存进行集中分配及管理的方法。该方法不仅能够提高系统资源的使用效率,而且还能为安全控制模块所使用的数据提供更高强度的保护。
背景技术
国标GB17859-1999要求结构化保护级以上级别的操作系统需要对系统中所有主客体进行安全标记,而在大型服务器中,系统中的主、客体总数可能达到上百万个的量级,并且有可能动态变化。操作系统实施强制访问控制策略,需要对这些客体的名称进行检索、对比等查找行为。相应地,需要为这些主客体的安全标记等在内存中分配空间。
《信息系统等级保护安全设计技术要求》规定,结构化保护级的操作系统,在关键安全保护部件中需要划分功能层次。对安全标记的维护和访问控制策略裁决行为作为安全功能中最核心的内容,需要在关键安全保护部件功能层中的最底层完成,而使用系统自身的内存分配机制,可能导致缺页中断等现象,既影响系统的性能,又可能出现客体重用问题,为攻击者提供攻击途径。
结构化保护级安全操作系统中,运行时需要用到的安全标记和访问控制策略最好始终保持在内存中,不应在删除前被释放,也不应被置换到磁盘空间中。这就要求我们在关键安全保护部件功能层次最底层使用专门的内存分配机制来维护安全标记的内存分配,同时要做到内存分配尽量高效、节省。
安全标记的内存需求可以分为两个部分,一部分是安全属性的内存需求,一个安全属性一般有固定的内存空间需求,这些内存空间需求比较容易进行管理。而另一部分是这些安全标记所对应的主客体对象名称的空间需求,这些主客体对象名称的特点是:数量众多、总长度不定,但平均值较小(以文件为例,如果只记录当前目录下对象名称,其长度一般在几个字节到十几个字节之间,最大不会超过255个字节)、变化不很频繁,另外,运行过程中,只有唯一的指针(安全标记中对象名称指针)指向该内存空间需求。一般的内存分配算法对其进行处理时效率欠佳。
【发明内容】
本发明的目的在于针对安全操作系统中安全模块使用内存的特点,设计一种内存分配算法,在提高系统资源使用效率的同时,为安全控制模块所使用的数据提供更高强度的保护。
本发明是采用以下技术手段实现的:
一种对安全控制模块内存进行集中控制的方法,以双向链表维护名称空间内存块,以堆栈机制分配名称空间;包括以下步骤:预定义参数:用alloc_pages()函数分配N个大小为Bz的内存块和建立名称空间管理机制;名称空间处理安全模块的内存分配请求;名称空间处理安全模块的内存释放请求;名称空间自检操作。
本发明与现有技术相比,具有以下明显的优势和有益效果:
1,在核心层外执行系统内存分配,可以保证核心层操作的原子性,同时方便系统采用内存隔离机制保护结构化保护级操作系统的核心层,避免客体重用问题。
2,每一次名称空间内存分配操作,需执行的指令少,因此可以保证系统的高性能内存分配。
3,通过内存回收操作,可以始终保持名称空间的空洞内存不会过大,避免内存浪费。
【附图说明】
图1名称空间内存分配机制工作流程;
图2名称空间内存分配机制运行流程。
【具体实施方式】
本发明阐述了一种高效的结构化保护级操作系统核心层名称空间内存分配方法。它以双向链表维护名称空间内存块,以堆栈机制分配名称空间,并以分解的排序方法对空洞值动态增加的空洞内存块进行大致排序,以保证执行内存块回收操作时,能迅速找到内存块的回收对象。
为达到上述目的,本发明的具体实施方式是这样实现的:设定一个内存初始值,在系统中预分配内存初始值大小的内存,由名称空间内存分配机制集中管理,系统定期检查(可以定时检查或定次检查)预分配内存的总空间和空闲空间,当预分配的内存空闲空间小于分配阈值时,系统补充预分配内存;当预分配内存总空间大于内存初始值,且空闲空间大于回收阈值时,系统从预分配内存中回收内存。系统内存分配及管理的流程如图2所示。
本算法的核心部分可以用逻辑电路或程序语言来实现,同时,为外层调用提供初始化、名称空间分配、名称空间监测、名称空间补充和名称空间回收五个调用接口。算法主要以以下四个步骤实现:
一、预定义以下参数:
名称空间使用内存块大小,应为4K的整数倍(记为Bz)。
初始化时分配内存块数量(记为N)。
内存块整理阀值(记为p)。
名称空间内存分配阀值(记为q1)。
名称空间内存释放阀值(记为q2)。
每次新增/释放内存块数量(记为i)。
二、用alloc_pages()函数分配N个大小为Bz的内存块和建立名称空间管理机制。
系统定义一个名称空间管理数据结构,其中记录如下内容。
一个地址指针,指向当前使用的名称空间内存块。
一个整数值,记录当前分配内存块数量(记为Bn),初始为N。
一个整数值,记录当前空闲内存块数量(记为Bf),初始为N。
名称空间双向链表地址,所有名称空间占用内存块挂载在链表上。
指向内存指针对应表的指针。
名称空间使用内存总量(记为Bb),初始为0。
定义一个指针对应表,记录指针序号,对应内存长度及对应内存位置。初始为空。
每个内存块起始地址分出一部份固定空间(记为m),存放如下管理信息:
双向链表指针,用以组成链表结构。
内存块当前可用位置(记为C),初始为m。
本内存块空洞空间数值(记为Hn),初始为0。
三、名称空间处理安全模块的内存分配请求:
通过名称空间管理数据结构中地地址指针找到当前活动的名称空间内存块。
若内存分配需求长度为n,则作如下操作:
检查Bz-C-n是否小于0,如是,则将当前空闲内存块设为当前内存块,当前空闲内存块的下一个空闲内存块置为当前空闲内存块。Bf=Bf-1。
若Bf<q1,则分配新的i个内存块加入队列。Bn=Bn+i,Bf=Bf+i
在指针对应表中登记,置对应内存长度为n,对应内存位置为当前内存块地址IC
C=C+n。Bb=Bb+n
返回对应表中指针序号,作为名称空间使用内存地址(记为A)。
四、名称空间处理安全模块的内存释放请求:
若一个长度为n的名称空间被释放,则作如下操作:
按A在对应表中查到对应内存地址后对自减其对Bz求模,获取名称所属相关内存块的起始地址。
Hn+n,若Hn/(Bz-m)>p,则进行内存整理。检查对应表中所有此内存块中有效内容,将其内存移动到当前活动内存块中,并修改对应表中内存地址项。此内存块清空后加入队列。Bf=Bf+1。
Bb=Bb-n。若Bf>q2,则从队列中取出i个空闲内存块,清0后释放。Bn=Bn-i,Bf=Bf-i。
五、名称空间自检操作;
系统空闲时间可进行名称空间内存检测操作,该操作可以定时触发,或定次触发(当上次刷新后,名称空间的分配行为次数达到一定数量和/或名称空间的删除行为次数达到一定数量时,触发名称空间内存检测行为)。
名称空间内存检测操作按照名称空间当前分配内存的状态,当时,触发名称空间内存回收行为,也可以在空洞内存总量或与使用内存的比值大小增加到一定程度时,触发名称空间内存回收行为。
回收行为按如下方式进行:
遍历指针对应表,把其中所有有效项顺序重写到空闲块中,每使用一个空闲块则Bf=Bf-1。更新对应表中地址项,清空后的内存块置0后加入空闲块,每加入一个则Bf=Bf+1。
重新检查Bf项,若Bf>q2,则从队列中取出i个空闲内存块,置0后释放。Bn=Bn-i,Bf=Bf-i。