具体实施方式
针对现有技术中存在的问题,本发明中提出一种用户态的双控内存镜像实现方案。
图1为本发明用户态的双控内存镜像实现方法实施例的流程图。如图1所示,包括步骤11~15。
步骤11:进行M次内存申请,M为正整数;其中,针对每次内存申请,分别执行步骤12~13。
步骤12:确定为本次申请所分配的N个内存段,N为正整数;针对每个内存段,分别将其物理地址映射到一个本端虚拟物理(vphy)地址,并将映射关系记录到本端的vphy表中;各本端vphy地址组成一个连续的vphy地址段。
步骤13:将该vphy地址段映射到一个用户态虚拟地址,并将映射关系记录到用户态地址映射表中。
步骤14:获取对端的vphy表,将其中的各物理地址分别映射到一个本端vphy地址,并将映射关系记录到本端的vphy表中;其中,对于任意两个物理地址,如果其对应的对端vphy地址是连续的,则对应的本端vphy地址也是连续的。
步骤15:分别将本端未进行映射的、各连续的vphy地址段映射到一个用户态虚拟地址,并将映射关系记录到用户态地址映射表中。
其中,所述针对每个内存段,分别将其物理地址映射到一个本端vphy地址,并将映射关系记录到本端的vphy表中的具体实现方式可为:针对每个内存段,分别在本端的vphy表中创建一个本端vphy节点,用于记录该内存段的物理地址;该本端vphy节点所对应的vphy地址即为所映射到的本端vphy地址。
类似地,所述获取对端的vphy表,将其中的各物理地址分别映射到一个本端vphy地址,并将映射关系记录到本端的vphy表中的具体实现方式可为:针对其中的每个对端vphy节点,分别在本端的vphy表中创建一个本端vphy节点,用于记录对应的对端vphy节点中所记录的物理地址加上预定偏移量后的结果;该本端vphy节点所对应的vphy地址即为所映射到的本端vphy地址。
另外,在实际应用中,vphy表中还会进一步包括一个vphy0节点,用于记录所在vphy表的物理地址。
相应地,用户态地址映射表中还会进一步保存有:vphy0节点对应的vphy地址与映射到的用户态虚拟地址之间的映射关系。
以下结合示例,对本发明所述方案的具体实现作进一步的详细说明。
1)创建初始化vphy表
本发明所述方案中,在内核态,可利用一个内核内存管理模块,来管理vphy表。
当内核内存管理模块加载时,可创建初始化的vphy表,即本端的vphy表;图2为本发明本端的vphy表中所包括的内容第一示意图;如图2所示,其中包括一个vphy0节点,用于记录该vphy表的物理地址。
另外,通过内存文件映射(mmap)功能,可以将vphy0节点对应的vphy地址映射到一个用户态虚拟地址Addr0,并可将映射关系记录到用户态地址映射表中;图3为本发明用户态地址映射表中所包括的内容第一示意图。
mmap功能的具体实现为现有技术。
需要说明的是,以上之所以将vphy表称为本端的vphy表,是为了与后续出现的对端的vphy表进行区分,以避免发生混淆,由于和对端的用户态地址映射表不会发生混淆,因此将本端的用户态地址映射表直接称为用户态地址映射表。
2)进行内存申请
本发明所述方案中,可通过cache模块来进行内存申请以及用户态虚拟地址的访问等。
cache模块向内核内存管理模块进行内存申请,如申请2G内存,用于内存镜像;但通常来说,系统中是不会存在这样的大段连续内存的,为此,可分配相同或不同大小的一系列内存段,各内存段的大小之和为2G即可;比如,可分配2048个内存段,每个内存段的大小均为1M。
另外,在实际应用中,cache模块可以只向内核内存管理模块发送一次内存申请,一次即申请2G的内存,或者,也可以分多次进行申请,比如,分十次进行申请,每次申请200M的内存,具体实现方式不限,较佳地,可采用多次申请的方式。
相应地,针对每次内存申请,可分别进行如下处理:确定为本次申请所分配的N个内存段;针对每个内存段,分别在本端的vphy表中创建一个本端vphy节点,用于记录该内存段的物理地址,各本端vphy节点所对应的本端vphy地址(大小与对应的内存段的大小相同)组成一个连续的vphy地址段(大小与本次所申请的内存大小相同);将该vphy地址段映射到一个用户态虚拟地址,并将映射关系记录到用户态地址映射表中。
举例说明:
图4为本发明本端的vphy表中所包括的内容第二示意图;如图4所示,假设某一次内存申请,共申请2G内存,针对本次申请,共分配了2048个内存段,即N的取值为2048,每个内存段的大小均为1M;那么,针对每个内存段,分别在本端的vphy表中创建一个本端vphy节点,即vphy1~vphy2048,每个vphy节点用于记录对应的内存段的物理地址;各本端vphy节点所对应的本端vphy地址组成一个连续的vphy地址段,如位于本端vphy地址中1G~3G的位置;
图5为本发明用户态地址映射表中所包括的内容第二示意图;如图5所示,通过mmap功能,将vphy1~vphy2048所对应的vphy地址段映射到一个用户态虚拟地址Addr1(连续的2G),从而完成本端地址映射的工作。
可以看出,通过采用上述方式,能够实现将不连续的物理地址,映射到连续的vphy地址。
cache模块每进行一次内存申请,则会按照上述方式进行一次处理,相应地,每次都会映射出一个连续的vphy地址段,并将该vphy地址段映射到一个用户态虚拟地址。
3)获取对端的vphy表
当获取到对端的vphy表之后,可针对其中的每个对端vphy节点,分别在本端的vphy表中创建一个本端vphy节点,用于记录对应的对端vphy节点中所记录的物理地址加上预定偏移量后的结果;其中,对于任意两个物理地址,如果其对应的对端vphy地址是连续的,则对应的本端vphy地址也是连续的;之后,分别将本端未进行映射的、各连续的vphy地址段映射到一个用户态虚拟地址,并将映射关系记录到用户态地址映射表中。
在双控内存镜像中,物理地址是对称分布的,如果需要访问对端的镜像地址,只需要简单地加上一个偏移量即可,所述偏移量的具体取值为预先设定。
由于vphy表中的vphy0字节用于保存vphy表本身的物理地址,且映射到一个用户态虚拟地址Addr0,因此,cache模块可以直接访问对端的vphy表。
cache模块获取到对端的vphy表后,可以通过与内核内存管理模块之间的设置(set)接口,将对端的vphy表中的相关信息加入到本端的vphy表;之后,可通过mmap功能,映射得到所需的用户态虚拟地址。
举例说明:
图6为本发明本端的vphy表中所包括的内容第三示意图;如图6所示,针对每个对端vphy节点,分别在本端的vphy表中创建一个本端vphy节点,即vphy2049~vphy4097,对应对端vphy节点vphy1~vphy2048;vphy2049~vphy4097所对应的本端vphy地址组成一个连续的vphy地址段,如位于本端vphy地址中3G~5G的位置;
图7为本发明用户态地址映射表中所包括的内容第三示意图;如图7所示,通过mmap功能,将vphy2049~vphy4097所对应的vphy地址段映射到一个用户态虚拟地址Addr2(连续的2G),从而完成对端地址映射的工作。
至此,即完成了用户态的双控内存镜像的搭建,访问Addr1,就可以访问本端内存,访问Addr2,就可以访问对端内存。
具体来说,当访问任一用户态虚拟地址时,可根据用户态地址映射表确定出该用户态虚拟地址对应的本端vphy地址;并可根据本端的vphy表,确定出该本端vphy地址对应的物理地址;进而,可通过调用直接内存读取(DMA,DirectMemoryAccess)引擎,访问该物理地址,避免通过中央处理单元(CPU,CentralProcessingUnit)进行内存拷贝,具体实现为现有技术。
另外,现有双控内存镜像的实现方式中,内存占用量是固定的,在系统上电时保留,后续无法根据系统负荷等进行动态调整,从而无法实现内存的合理利用。
针对该问题,本发明所述方案中提出,可根据实际需求,动态调整所申请的内存;所述调整包括:申请增加新的内存、释放已申请的部分内存。
另外,当每次对所申请的内存进行调整时,还需要根据所作调整,对本端的vphy表以及用户态地址映射表进行适应性调整。
比如,如果确定当前的内存不够用,则可再申请200M的内存,相应地,需要在本端的vphy表中新创建200(假设分配了200个内存段,每个内存段的大小为1M)个本端vphy节点,且这200个本端vphy节点所对应的本端vphy地址组成的一个连续的vphy地址段(200M),将该vphy地址段映射到一个用户态虚拟地址,如Addr3,并将映射关系加入到用户态地址映射表中。
再比如,如果确定当前的内存过剩,则可释放掉200M的内存,相应地,从本端的vphy表以及用户态地址映射表中删除与这200M内存相对应的vphy节点以及映射关系等。
如前所述,cache模块可以只向内核内存管理模块发送一次内存申请,一次即申请2G的内存,或者,也可以分多次进行申请,比如,分十次进行申请,每次申请200M,较佳地,可采用多次申请的方式。这是因为:如果采用前一种申请方式,后续当释放掉部分内存后,还需要根据剩下的内存重新进行用户态虚拟地址的映射等,而采用后一种方式,则可以一次申请的内存大小为单位进行释放,如释放200M或400M,从而可避免上述问题,进而简化了处理流程。
再有,当确定对端的vphy表每次发生调整时,也需要根据所作调整,对本端的vphy表以及用户态地址映射表进行适应性调整,具体实现不再赘述。
总之,采用本发明所述方案,能够实现用户态的双控内存镜像,从而能够极大地提高用户态存储系统的稳定性;而且,可对所申请的内存进行动态调整,从而使得所申请的内存能够得到更为合理的利用;另外,本发明所述方案实现起来简单方便,便于普及和推广。
综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。