内存访问处理方法及装置与流程

文档序号:12597137阅读:303来源:国知局
内存访问处理方法及装置与流程

本发明涉及计算机技术领域,尤其涉及内存访问处理方法及装置。



背景技术:

众所周知,在64位计算机系统中,CPU支持的内存理论上最大可以达到2^64大小,然而作为实际页表缓存的TLB(Translation Lookaside Buffer,传输后备缓冲)映射条目却相对较少。因此内核在访问整个内存区的物理地址时,由于不同模块的对内存需求大小不同,造成地址访问会随机地分布在整个内存空间。这样在实际运行中,将不可避免的会发生大量的TLB miss异常,因此需要不断从页表中加载新的TLB表项完成虚实地址转换,从而导致内存访问的性能就会降低,且CPU的占用率较高。

上述内容仅用于辅助理解本发明的技术方案,并不代表承认上述内容是现有技术。



技术实现要素:

本发明的主要目的在于提供一种内存访问处理方法及装置,旨在提高系统的内存访问性能,减少CPU的占用率。

为实现上述目的,本发明提供的一种内存访问处理方法包括以下步骤:

按照预置规则将内存区划分为低端区和高端区;

在传输后备缓冲TLB表项中建立与所述低端区对应的固定TLB映射条目和与所述高端区对应的动态TLB映射条目;所述动态TLB映射条目用于根据预设的页表进行映射关系替换;

接收到预设接口函数的访问内存请求时,根据所述固定TLB映射条目访问所述低端区的内存地址,根据所述动态TLB映射条目访问所述高端区的内存地址。

优选地,所述接收到预设接口函数的访问内存请求时,根据所述固定TLB映射条目访问所述低端区的内存地址,根据所述动态TLB映射条目访问所述 高端区的内存地址,包括

接收到预设接口函数的访问内存请求时,根据所述访问内存请求的预设访问地址区间判断本次访问的内存区是否是低端区;

若是,则根据固定TLB映射条目访问所述低端区的内存地址;

是否,则根据所述动态TLB映射条目访问所述高端区的内存地址。

优选地,所述根据动态TLB映射条目访问所述高端区的内存地址之后还包括:

当访问的内存地址不在所述TLB表项中时,重新加载所述预设的页表以替换所述动态TLB映射条目;

根据替换后的动态TLB映射条目重新访问所述高端区的内存地址。

优选地,所述按照预置规则将内存区划分为低端区和高端区包括:

在系统内存初始化时,将从所述内存区中预先设置的NORMAL区中划分一部分出来设定为所述高端区;将所述内存区中预先设置的DMA区和NORMAL区未划分出来的部分设定为所述低端区。

优选地,所述内存访问处理方法还包括:

预置所述预设接口函数与访问地址区间的对应关系,以使所述预设接口函数中内存访问频度小于第一预设值的第一接口函数与属于高端区的访问地址区间对应,且所述预设接口函数中非第一接口函数的第二接口函数与属于低端区的访问地址区间对应。

优选地,所述内存访问处理方法还包括:

预置所述预设接口函数与访问地址区间的对应关系,以使所述预设接口函数中第一接口函数与属于高端区的访问地址区间对应,且所述预设接口函数中非第一接口函数的第二接口函数与属于低端区的访问地址区间对应;所述第一接口函数的内存访问频度小于第一预设值且访问内存请求对应的内存量大于第二预设值。

此外,为实现上述目的,本发明还提供一种内存访问处理装置,所述内存访问处理装置包括:

区域划分模块,用于按照预置规则将内存区划分为低端区和高端区;

条目建立模块,用于在传输后备缓冲TLB表项中建立与所述低端区对应 的固定TLB映射条目和与所述高端区对应的动态TLB映射条目;所述动态TLB映射条目用于根据预设的页表进行映射关系替换;

处理模块,用于接收到预设接口函数的访问内存请求时,根据所述固定TLB映射条目访问所述低端区的内存地址,根据所述动态TLB映射条目访问所述高端区的内存地址。

优选地,所述内存访问处理装置还包括:

加载模块,用于当访问的内存地址不在所述TLB表项中时,重新加载所述预设的页表以替换所述动态TLB映射条目;

所述处理模块,还用于根据替换后的动态TLB映射条目重新访问所述高端区的内存地址。

优选地,所述内存访问处理装置还包括:

第一预置模块,用于预置所述预设接口函数与访问地址区间的对应关系,以使所述预设接口函数中内存访问频度小于第一预设值的第一接口函数与属于高端区的访问地址区间对应,且所述预设接口函数中非第一接口函数的第二接口函数与属于低端区的访问地址区间对应。

优选地,所述内存访问处理装置还包括:

第二预置模块,用于预置所述预设接口函数与访问地址区间的对应关系,以使所述预设接口函数中第一接口函数与属于高端区的访问地址区间对应,且所述预设接口函数中非第一接口函数的第二接口函数与属于低端区的访问地址区间对应;所述第一接口函数的内存访问频度小于第一预设值且访问内存请求对应的内存量大于第二预设值。

本发明实施例通过将内存区划分为低端区和高端区,并且将TLB表项中设置固定TLB映射条目和动态TLB条目,在进行页表动态加载时仅替换TLB动态条目。因此在访问低端区时,可以直接根据固定TLB条目进行访问,从而减少TLB miss异常的发生概率,无需从不断页表中加载新的TLB表项,进而提高了系统的内存访问性能,减少了CPU的占用率。

附图说明

图1为本发明内存访问处理方法第一实施例的流程示意图;

图2为本发明内存访问处理方法一实施例中访问内存的细化流程示意图;

图3为本发明内存访问处理方法第二实施例的流程示意图;

图4为本发明内存访问处理方法第三实施例的流程示意图;

图5为本发明内存访问处理方法第四实施例的流程示意图;

图6为本发明内存访问处理装置第一实施例的功能模块示意图;

图7为图6中处理模块的细化功能结构示意图;

图8为本发明内存访问处理装置第二实施例的功能模块示意图;

图9为本发明内存访问处理装置第三实施例的功能模块示意图;

图10为本发明内存访问处理装置第四实施例的功能模块示意图。

本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。

具体实施方式

应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

本发明提供一种内存访问处理方法,参照图1,在本发明内存访问处理方法第一实施例中,该内存访问处理方法包括以下步骤:

步骤S10,按照预置规则将内存区划分为低端区和高端区;

本发明实施例提供的内存访问处理方法主要应用于计算机系统中,用于对内存地址访问进行控制。具体地,上述内存划分的方式可以根据实际需要进行设置,在LINUX系统中,通常根据地址分为低端区(LOW区)和高端区(HIGH区)。例如,在系统内存初始化时,将从所述内存区中预先设置的NORMAL区中划分一部分出来设定为高端区;将所述内存区中预先设置的DMA区和NORMAL区未划分出来的部分设定为低端区。本实施例中上述预先设置的DMA区和NORMAL区为现有技术中内存区的划分结构,在现有技术中,通常将内存区划分为DMA区和NORMAL区。由于通过在原有NORMAL区中划分一部分出来的一访问区间作为高端区,因此可以兼顾32位DMA设备寻址需求。应当说明的是,高端区的起始地址可以根据系统中的实际内存和TLB映射条目确定。

步骤S20,在传输后备缓冲TLB表项中建立与所述低端区对应的固定TLB映射条目和与所述高端区对应的动态TLB映射条目;所述动态TLB映射条目用于根据预设的页表进行映射关系替换;

具体地,在本实施例中,TLB表项中存在多个TLB映射条目,用于在预设接口函数进行内存访问时,根据TLB映射条目访问内存区。该TLB映射条目包括固定TLB映射条目和动态TLB映射条目,其中固定TLB映射条目用于对高频度访问的低端内存区部分做线性固定映射不做替换;动态TLB映射条目用于低频度内存访问的动态替换加载,完成整个内存空间的映射。应当说明的是,上述预设的页表为内核页表swapper_pg_dir。动态TLB映射条目需要不断从页表中加载新的TLB表项(即TLB映射条目),以完成虚实地址转换。在本实施例中为了综合考虑CPU实际的动态位宽,相关地址的空间可以采用以下方式进行划分:

综合考虑CPU实际的动态位宽,相关地址空间安排如下:

低端区内存起始地址(物理地址):LOW_START=0x200000000

高端区内存起始地址(物理地址):HIGHMEM_START=0x300000000

内核线性起始地址(虚拟地址):MAP_BASE=0xc000000000000000

内核临时映射起始地址(虚拟地址):FIXADDR_START=0xc00000fffd7bc000,

内核永久映射映射起始地址(虚拟地址):PKMAP_BASE=0xc000008000000000。

步骤S30,接收到预设接口函数的访问内存请求时,根据所述固定TLB映射条目访问所述低端区的内存地址,根据所述动态TLB映射条目访问所述高端区的内存地址。

具体地,参照图2,本实施例中,上述步骤S30包括

步骤S31,接收到预设接口函数访问内存请求时,根据所述访问内存请求的预设访问地址区间判断本次访问的内存区是否低端区;若是,则执行步骤S40,若否,则执行步骤S50;

步骤S32,根据固定TLB映射条目访问所述低端区的内存地址;

步骤S33,根据所述动态TLB映射条目访问所述高端区的内存地址。

本实施例中,可以修改内核中对涉及内存访问的相关函数。把高频度访 问接口固定在物理内存的低端区(NORMAL和DMA区)。内核中类似于kmalloc、kfree,get_free_page等相关一类的接口,内核使用频繁而且申请内存大小相对较少,直接限定在低端区操作。而对于内存访问频度较低但是内存需要大的接口需要通过高端区。例如文件映射和读写相关kmap kunmap kmap_atomic kunmap_atomic函数接口以及对系统保留内存访问接口。具体地,在接收到预设接口函数访问内存请求时,可以根据所述访问内存请求的预设访问地址区间判断本次访问的内存区是否为低端区。例如当上述预设访问地址区间属于低端区时,则可以直接根据固定TLB映射条目的映射关系访问低端区;当上述预设访问地址区间属于高端区时,则可以根据动态TLB映射条目的映射关系访问高端区。

本发明实施例通过将内存区划分为低端区和高端区,并且将TLB表项中设置固定TLB映射条目和动态TLB条目,在进行页表动态加载时仅替换TLB动态条目。因此在访问低端区时,可以直接根据固定TLB条目进行访问,从而减少TLB miss异常的发生概率,无需从不断页表中加载新的TLB表项,进而提高了系统的内存访问性能,减少了CPU的占用率。

进一步地,参照图3,基于本发明内存访问处理方法第一实施例,在本发明内存访问处理方法第二实施例中,步骤S33之后还包括:

步骤S40,当访问的内存地址不在所述TLB表项中时,重新加载所述预设的页表以替换所述动态TLB映射条目;

步骤S50,根据替换后的动态TLB映射条目重新访问所述高端区的内存地址。

具体地,在本实施例中,在接收到上述访问内存请求后,根据该内存访问请求访问高端区的内存地址时,若发现不存在该地址,将产生TLB miss异常,此时将根据该TLB miss异常重新加载所述预设的页表以替换所述动态TLB映射条目,以对动态TLB映射条目进行更新,保证可以根据上述访问内存请求访问到对应的内存地址。

可以理解的是,上述低端区和高端区对应的访问内存请求类型可以根据实际需要进行设置。优选地,可以将内存访问频度比较低的访问内存请求对 应的接口函数的访问地址区间限定在高端区内,将内存访问频度比较高的访问内存请求对应的接口函数的访问地址区间限定在低端区内。

具体地,如图4所示,在本发明内存访问处理方法第三实施例中,上述内存访问处理方法还包括:

步骤S60,预置所述预设接口函数与访问地址区间的对应关系,以使所述预设接口函数中内存访问频度小于第一预设值的第一接口函数与属于高端区的访问地址区间对应,且所述预设接口函数中非第一接口函数的第二接口函数与属于低端区的访问地址区间对应。

进一步地,在内存充足的情况下还可以考虑访问内存请求对应的内存量,将缓存容量较小对应的接口函数的访问地址区间限定在低端区内。在本发明内存访问处理方法第四实施例中,与本发明内存访问处理方法第三实施例的区别在于上述步骤S60可以替换为步骤S70。具体地,如图5所示,在本发明内存访问处理方法第四实施例中,上述内存访问处理方法还包括:

步骤S70,预置所述预设接口函数与访问地址区间的对应关系,以使所述预设接口函数中第一接口函数与属于高端区的访问地址区间对应,且所述预设接口函数中非第一接口函数的第二接口函数与属于低端区的访问地址区间对应;所述第一接口函数的内存访问频度小于第一预设值且访问内存请求对应的内存量大于第二预设值。

在本实施例中,这样在处理最频繁访问内存空间接口函数时,由于不需要通过页表,访问速度很快。而一些使用频度比较低的函数访问内存区域时,会通过TLB miss异常,最终加载动态把页表内容加载到TLB中,完成虚实地址转换。由于这种低频度访问接口是根据内核运行情况统计后做的修改,实际使用密度低,对整体性能影响很小。

本发明还提供一种内存访问处理装置,参照图6,在本发明内存访问处理装置第一实施例中,该内存访问处理装置包括:

区域划分模块10,用于按照预置规则将内存区划分为低端区和高端区;

本发明实施例提供的内存访问处理装置主要应用于计算机系统中,用于对内存地址访问进行控制。具体地,上述内存划分的方式可以根据实际需要进行设置,在LINUX系统中,通常根据地址分为低端区(LOW区)和高端 区(HIGH区)。例如,在系统内存初始化时,将从所述内存区中预先设置的NORMAL区中划分一部分出来设定为高端区;将所述内存区中预先设置的DMA区和NORMAL区未划分出来的部分设定为低端区。本实施例中上述预先设置的DMA区和NORMAL区为现有技术中内存区的划分结构,在现有技术中,通常将内存区划分为DMA区和NORMAL区。由于通过在原有NORMAL区中划分一部分出来的一访问区间作为高端区,因此可以兼顾32位DMA设备寻址需求。应当说明的是,高端区的起始地址可以根据系统中的实际内存和TLB映射条目确定。

条目建立模块20,用于在传输后备缓冲TLB表项中建立与所述低端区对应的固定TLB映射条目和与所述高端区对应的动态TLB映射条目;所述动态TLB映射条目用于根据预设的页表进行映射关系替换;

具体地,在本实施例中,TLB表项中存在多个TLB映射条目,用于在预设接口函数进行内存访问时,根据TLB映射条目访问内存区。该TLB映射条目包括固定TLB映射条目和动态TLB映射条目,其中固定TLB映射条目用于对高频度访问的低端内存区部分做线性固定映射不做替换;动态TLB映射条目用于低频度内存访问的动态替换加载,完成整个内存空间的映射。应当说明的是,上述预设的页表为内核页表swapper_pg_dir。动态TLB映射条目需要不断从页表中加载新的TLB表项(即TLB映射条目),以完成虚实地址转换。在本实施例中为了综合考虑CPU实际的动态位宽,相关地址的空间可以采用以下方式进行划分:

综合考虑CPU实际的动态位宽,相关地址空间安排如下:

低端区内存起始地址(物理地址):LOW_START=0x200000000

高端区内存起始地址(物理地址):HIGHMEM_START=0x300000000

内核线性起始地址(虚拟地址):MAP_BASE=0xc000000000000000

内核临时映射起始地址(虚拟地址):FIXADDR_START=0xc00000fffd7bc000,

内核永久映射映射起始地址(虚拟地址):PKMAP_BASE=0xc000008000000000。

处理模块30,用于接收到预设接口函数的访问内存请求时,根据所述固定TLB映射条目访问所述低端区的内存地址,根据所述动态TLB映射条目访 问所述高端区的内存地址。

具体地,参照图7,上述处理模块30包括:

判断单元31,用于接收到预设接口函数的访问内存请求时,根据所述访问内存请求的预设访问地址区间判断本次访问的内存区是否是低端区;

处理单元32,用于当本次访问的内存区为低端区时,根据固定TLB映射条目访问所述低端区的内存地址;当本次访问的内存区为高端区时,根据所述动态TLB映射条目访问所述高端区的内存地址。

本实施例中,可以修改内核中对涉及内存访问的相关函数。把高频度访问接口固定在物理内存的低端区(NORMAL和DMA区)。内核中类似于kmalloc、kfree,get_free_page等相关一类的接口,内核使用频繁而且申请内存大小相对较少,直接限定在低端区操作。而对于内存访问频度较低但是内存需要大的接口需要通过高端区。例如文件映射和读写相关kmap kunmap kmap_atomic kunmap_atomic函数接口以及对系统保留内存访问接口。具体地,在接收到预设接口函数访问内存请求时,可以根据所述访问内存请求的预设访问地址区间判断本次访问的内存区是否为低端区。例如当上述预设访问地址区间属于低端区时,则可以直接根据固定TLB映射条目的映射关系访问低端区;当上述预设访问地址区间属于高端区时,则可以根据动态TLB映射条目的映射关系访问高端区。

本发明实施例通过将内存区划分为低端区和高端区,并且将TLB表项中设置固定TLB映射条目和动态TLB条目,在进行页表动态加载时仅替换TLB动态条目。因此在访问低端区时,可以直接根据固定TLB条目进行访问,从而减少TLB miss异常的发生概率,无需从不断页表中加载新的TLB表项,进而提高了系统的内存访问性能,减少CPU的占用率。

进一步地,参照图8,基于本发明内存访问处理装置第一实施例,在本发明内存访问处理装置第二实施例中,所述内存访问处理装置还包括:

加载模块40,用于当访问的内存地址不在所述TLB表项中时,重新加载所述预设的页表以替换所述动态TLB映射条目;

所述处理模块30,还用于根据替换后的动态TLB映射条目重新访问所述高端区的内存地址。

具体地,在本实施例中,在接收到上述访问内存请求后,根据该内存访问请求访问高端区的内存地址时,若发现不存在该地址,将产生TLB miss异常,此时将根据该TLB miss异常重新加载所述预设的页表以替换所述动态TLB映射条目,以对动态TLB映射条目进行更新,保证可以根据上述访问内存请求访问到对应的内存地址。

可以理解的是,上述低端区和高端区对应的访问内存请求类型可以根据实际需要进行设置。优选地,可以将内存访问频度比较低的访问内存请求对应的接口函数的访问地址区间限定在高端区内,将内存访问频度比较高的访问内存请求对应的接口函数的访问地址区间限定在低端区内。

具体地,如图9所示,在本发明内存访问处理装置第三实施例中,上述内存访问处理装置还包括:

第一预置模块50,用于预置所述预设接口函数与访问地址区间的对应关系,以使所述预设接口函数中内存访问频度小于第一预设值的第一接口函数与属于高端区的访问地址区间对应,且所述预设接口函数中非第一接口函数的第二接口函数与属于低端区的访问地址区间对应。

进一步地,在内存充足的情况下还可以考虑访问内存请求对应的内存量,将缓存容量较小对应的接口函数的访问地址区间限定在低端区内。参照图10,在本发明内存访问处理装置第四实施例中,上述内存访问处理装置还包括:

第二预置模块60,用于预置所述预设接口函数与访问地址区间的对应关系,以使所述预设接口函数中内存访问频度小于第一预设值且访问内存请求对应的内存量大于第二预设值的第一接口函数与属于高端区的访问地址区间对应,且所述预设接口函数中非第一接口函数的第二接口函数与属于低端区的访问地址区间对应。

在本实施例中,这样在处理最频繁访问内存空间接口函数时,由于不需要通过页表,访问速度很快。而一些使用频度比较低的函数访问内存区域时,会通过TLB miss异常,最终加载动态把页表内容加载到TLB中,完成虚实地址转换。由于这种低频度访问接口是根据内核运行情况统计后做的修改,实际使用密度低,对整体性能影响很小。

以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1