Linux操作系统的内存管理方法及装置与流程

专利2022-06-30  73


本发明涉及嵌入式系统技术领域,尤指一种linux操作系统的内存管理方法及装置。



背景技术:

linux操作系统分为用户态和内核态两个部分。普通应用程序,如web浏览器、视频播放器、文本编辑器等,工作在用户态;而linux核心、网络协议栈、设备驱动等组件运行于内核态。

用户态的程序独享操作系统为其创建的虚拟内存空间,即使出现内存越界、改写的情况,一般也只会导致程序自己出错,不会破坏到其他应用程序及内核区域。问题相对可控,也易于定位。

但是内核态的所有模块共享同一个逻辑地址空间,如果一个模块出现内存访问越界或改写,可能导致整个内核崩溃,难以收集信息;同时由于内存越界或改写问题通常属于“释放后使用”(use-after-free)类的错误。动态内存在使用上有malloc(申请)和free(释放)的动作要求,如果程序在free处理后,在其他的程序位置继续访问了相应内存,就叫use-after-free,往往是由于复杂程序的逻辑没有考虑清楚导致的。而出现这种问题不一定会马上报错,因为有可能释放的那片内存的读写不会导致系统崩溃,很难察觉。但是程序逻辑已经出现问题,正是由于该类问题的隐蔽性,如果不能够抓住第一现场,往往很难有效的正面分析。

内存异常时,可通过oops信息分析来确定系统崩溃的原因,但该种方式只能分析出导致系统崩溃的直接原因,而内存出现改写之类的隐蔽性异常时,并不会直接导致系统崩溃,只能通过层层调转最终导致崩溃,因此,该种方式并不能分析到改写这类的内存隐蔽性异常,分析准确度较差。

综上,目前业界缺乏通用的高效定位内存异常类问题的方法,通常内存改写类问题的分析需要耗费大量的时间和人力,大幅增加了产品开发的成本,并且容易导致项目失控。



技术实现要素:

本发明实施例提供一种linux系统的内存管理方法及装置,用以解决现有技术中存在内存改写类异常定位困难的问题。

本发明实施例提供一种linux系统的内存管理方法,所述方法应用于内核态内存的管理,包括:

监控是否发生内存页的释放,所述内存页为内存的基本单位;

当监控到新释放的内存页时,将所述新释放的内存页插入预设的监控队列;

修改所述新释放的内存页对应的页表表项以表征所述新释放的内存页处于监控状态;

当接收到内存访问请求对应的内存页处于监控状态时,则触发异常通告。

优选地,所述方法,还包括:

当所述监控队列达到预设最大长度或接收到空闲队列内存不足的请求信息时,按照先入先出原则,将所述监控队列中最早入队的第一内存页插回至空闲队列中;

修改所述第一内存页对应的页表表项以表征所述第一内存页处于可访问状态。

优选地,所述将新释放的内存页插入预设的监控队列之前,所述方法,还包括:

将预设魔术字插入所述新释放的内存页;

相应地,在将所述监控队列中最早入队的第一内存页插回至空闲队列中之前,所述方法,还包括:

检测所述监控队列中最早入队的第一内存页中的魔术字与预设魔术字是否相同;

若不同,则触发异常通告。

优选地,所述方法,还包括:

将用户输入的需锁定内存页信息对应的第二内存页插入所述监控队列的第一区域;

设置所述第一区域的监控开启时间和监控关闭时间;

按照所述监控开启时间和所述监控关闭时间修改所述第二内存页对应的第二页表表项以使所述第二内存页在所述监控开启时间处于监控状态,在所述监控关闭时间处于可访问状态。

优选地,所述方法,还包括:

当所述第二内存页处于监控状态,接收到内存访问请求对应的内存页为第二内存页时,触发异常通告;

当所述第二内存页处于可访问状态时,接收到内存访问请求对应的内存页为第二内存页时,直接访问所述第二内存页。

其中,所述当接收到内存访问请求对应的内存页处于监控状态时,则触发异常通告,包括:

获取所述内存访问请求对应内存页的页表表项;

确定所述页表表项是否表征所述内存页处于监控状态;

若所述内存页处于监控状态,则触发异常通告。

本发明实施例还提供一种linux系统的内存管理装置,所述装置应用于内核态内存的管理,包括:监控单元、插入单元、修改单元以及管理单元;其中,

所述监控单元,用于监控是否发生内存页的释放,所述内存页为内存的基本单位;

所述插入单元,用于当监控到新释放的内存页时,将所述新释放的内存页插入预设的监控队列;

所述修改单元,用于修改所述新释放的内存页对应的页表表项以表征所述新释放的内存页处于监控状态;

所述管理单元,用于当接收到内存访问请求对应的内存页处于监控状态时,则触发异常通告。

优选地,所述插入单元,还用于当所述监控队列达到预设最大长度或接收到空闲队列内存不足的请求信息时,按照先入先出原则,将所述监控队列中最早入队的第一内存页插回至空闲队列中;

相应地,所述修改单元,还用于修改所述第一内存页对应的页表表项以表征所述第一内存页处于可访问状态。

优选地,将新释放的内存页插入预设的监控队列之前,所述管理单元,还用于将预设魔术字插入所述新释放的内存页;在将所述监控队列中最早入队的第一内存页插回至空闲队列中之前,还用于检测所述监控队列中最早入队的第一内存页中的魔术字与预设魔术字是否相同;若不同,则触发异常通告。

优选地,所述装置,还包括:设置单元;

相应地,所述插入单元,还用于将用户输入的需锁定内存页信息对应的第二内存页插入所述监控队列的第一区域;

所述设置单元,用于设置所述第一区域的监控开启时间和监控关闭时间;

所述修改单元,还用于按照所述监控开启时间和所述监控关闭时间修改所述第二内存页对应的第二页表表项以使所述第二内存页在所述监控开启时间处于监控状态,在所述监控关闭时间处于可访问状态。

优选地,所述管理单元,还用于:

当所述第二内存页处于监控状态,接收到内存访问请求对应的内存页为第二内存页时,触发异常通告;

当所述第二内存页处于可访问状态时,接收到内存访问请求对应的内存页为第二内存页时,直接访问所述第二内存页。

其中,所述管理单元,具体用于获取所述内存访问请求对应内存页的页表表项;确定所述页表表项是否表征所述内存页处于监控状态;若所述内存页处于监控状态,则触发异常通告。

本发明有益效果如下:

本发明实施例提供的linux系统的内存管理方法及装置,通过监控是否发生内存页的释放,所述内存页为内存的基本单位;当监控到新释放的内存页时,将所述新释放的内存页插入预设的监控队列;修改所述新释放的内存页对应的页表表项以表征所述新释放的内存页处于监控状态;当接收到内存访问请求对应的内存页处于监控状态时,则触发异常通告。本发明实施例通过对刚释放的内存页进行监控,能够有效发现释放后使用(use-after-free)类的错误,通过独立的监控队列,对于linux系统原生的内存队列修订量最小,降低了实现的复杂度,能更好地兼容,快速有效定位问题,降低了问题定位的人力和时间消耗,提高了分析效率及故障响应速度,保障了项目实现进度。

附图说明

图1为本发明实施例中linux系统的内存管理方法的流程图;

图2为本发明实施例中linux系统的内存管理装置的结构示意图。

具体实施方式

针对现有技术中存在的内存改写类定位异常的问题,本发明实施例提供的linux系统的内存管理方法,通过对刚释放的内存页进行监控,当访问监控队列中的内存页时能够异常通告,快速定位内存改写类异常问题。本发明方法应用于内核态内存的管理,具体的流程如图1所示,执行步骤如下:

步骤101,监控是否发生内存页的释放,所述内存页为内存的基本单位;

这里,所述内存页为内存的基本单位,内存页的最小大小为4kb,页表表项与最小内存页是一一对应关系,因此,本发明实施例为了保证每个内存页具有对应的页表表项,在系统初始化时,强制将内存页的粒度控制为4kb。

步骤102,当监控到新释放的内存页时,将所述新释放的内存页插入预设的监控队列;

步骤103,修改所述新释放的内存页对应的页表表项以表征所述新释放的内存页处于监控状态;

可以通过修改页表表项中访问控制位来控制所述内存页的状态,例如,当访问控制位为1时,表征该内存页处于监控状态,为0,表征该内存页处于可访问状态。

步骤104,当接收到内存访问请求对应的内存页处于监控状态时,则触发异常通告。

具体地,这里可以通过页表表项的保留位来标识该异常通告是由于监控队列内存被访问引起的,该异常通告具体可以包括内存访问请求的发起者的定位信息以更快速定位至问题点。

本发明实施例提供的linux系统的内存管理方法,通过监控是否发生内存页的释放,所述内存页为内存的基本单位;当监控到新释放的内存页时,将所述新释放的内存页插入预设的监控队列;修改所述新释放的内存页对应的页表表项以表征所述新释放的内存页处于监控状态;当接收到内存访问请求对应的内存页处于监控状态时,则触发异常通告。本发明实施例通过对刚释放的内存页进行监控,能够有效发现释放后使用(use-after-free)类的错误,通过独立的监控队列,对于linux系统原生的内存队列修订量最小,降低了实现的复杂度,能更好地兼容,快速有效定位问题,降低了问题定位的人力和时间消耗,提高了分析效率及故障响应速度,保障了项目实现进度。

优选地,步骤102中将新释放的内存页插入预设的监控队列之前,还可以包括:

将预设魔术字插入所述新释放的内存页以监控所述新释放的内存页内容是否存在改写。这里,所述魔术字为预先设置的字段值,将所述监控队列中的内存页全部填满所述魔术字。

所述方法,还包括:

当所述监控队列达到预设最大长度或接收到空闲队列内存不足的请求信息时,按照先入先出原则,将所述监控队列中最早入队的第一内存页插回至空闲队列中;

修改所述第一内存页对应的页表表项以表征所述第一内存页处于可访问状态。

相应地,在将所述监控队列中最早入队的第一内存页插回至空闲队列中之前,所述方法,还包括:

检测所述监控队列中最早入队的第一内存页中的魔术字与预设魔术字是否相同;

若不同,则触发异常通告,这里,若所述第一内存页的魔术字发生改写,则说明监控队列出现访问之外的异常,比如直接内存存取单元(directmemoryaccess,dma)对监控队列中的内存的访问但却未被内存管理单元(memorymanagementunit,mmu)发现,又比如双倍速率同步存储器(doubledatarate,ddr)自身不稳定,导致魔术字发生变化等;此时,也需要进行故障通告以定位故障点。

优选地,所述方法,还包括:

将用户输入的需锁定内存页信息对应的第二内存页插入所述监控队列的第一区域;

设置所述第一区域的监控开启时间和监控关闭时间;

按照所述监控开启时间和所述监控关闭时间修改所述第二内存页对应的第二页表表项以使所述第二内存页在所述监控开启时间处于监控状态,在所述监控关闭时间处于可访问状态。例如,设置所述第一区域的监控开启时间为每日的7:00至19:00,监控关闭时间为19:00至次日7:00,则在每日的7:00修改所述第二内存页对应的第二页表表项以使所述第二内存页在所述监控开启时间处于监控状态,在每日的19:00修改所述第二内存页对应的第二页表表项以使所述第二内存页在所述监控关闭时间处于可访问状态。

优选地,所述方法,还包括:

当所述第二内存页处于监控状态,接收到内存访问请求对应的内存页为第二内存页时,触发异常通告;

当所述第二内存页处于可访问状态时,接收到内存访问请求对应的内存页为第二内存页时,直接访问所述第二内存页。

优选地,所述当接收到内存访问请求对应的内存页处于监控状态时,则触发异常通告,包括:

获取所述内存访问请求对应内存页的页表表项;

确定所述页表表项是否表征所述内存页处于监控状态;

若所述内存页处于监控状态,则触发异常通告。

基于同一发明构思,本发明实施例提供一种linux系统的内存管理装置,该装置可以应用于内核态内存的管理,结构如图2所示,包括:监控单元21、插入单元22、修改单元23以及管理单元24;其中,

所述监控单元21,用于监控是否发生内存页的释放,所述内存页为内存的基本单位;

所述插入单元22,用于当监控到新释放的内存页时,将所述新释放的内存页插入预设的监控队列;

所述修改单元23,用于修改所述新释放的内存页对应的页表表项以表征所述新释放的内存页处于监控状态;

所述管理单元24,用于当接收到内存访问请求对应的内存页处于监控状态时,则触发异常通告。

进一步地,所述插入单元22,还用于当所述监控队列达到预设最大长度或接收到空闲队列内存不足的请求信息时,按照先入先出原则,将所述监控队列中最早入队的第一内存页插回至空闲队列中;

相应地,所述修改单元23,还用于修改所述第一内存页对应的页表表项以表征所述第一内存页处于可访问状态。

其中,将新释放的内存页插入预设的监控队列之前,所述管理单元24,还用于将预设魔术字插入所述新释放的内存页;在将所述监控队列中最早入队的第一内存页插回至空闲队列中之前,还用于检测所述所述监控队列中最早入队的第一内存页中的魔术字与预设魔术字是否相同;若不同,则触发异常通告。

进一步地,所述装置,还包括:设置单元;

相应地,所述插入单元22,还用于将用户输入的需锁定内存页信息对应的第二内存页插入所述监控队列的第一区域;

所述设置单元,用于设置所述第一区域的监控开启时间和监控关闭时间;

所述修改单元23,还用于按照所述监控开启时间和所述监控关闭时间修改所述第二内存页对应的第二页表表项以使所述第二内存页在所述监控开启时间处于监控状态,在所述监控关闭时间处于可访问状态。

进一步地,所述管理单元24,还用于:

当所述第二内存页处于监控状态,接收到内存访问请求对应的内存页为第二内存页时,触发异常通告;

当所述第二内存页处于可访问状态时,接收到内存访问请求对应的内存页为第二内存页时,直接访问所述第二内存页。

其中,所述管理单元24,具体用于获取所述内存访问请求对应内存页的页表表项;确定所述页表表项是否表征所述内存页处于监控状态;若所述内存页处于监控状态,则触发异常通告。

应当理解,本发明实施例提供的linux系统的内存管理装置实现原理及过程与上述图1及所示的实施例类似,在此不再赘述。

本发明实施例提供的linux系统的内存管理方法及装置,通过监控是否发生内存页的释放,所述内存页为内存的基本单位;当监控到新释放的内存页时,将所述新释放的内存页插入预设的监控队列;修改所述新释放的内存页对应的页表表项以表征所述新释放的内存页处于监控状态;当接收到内存访问请求对应的内存页处于监控状态时,则触发异常通告。本发明实施例通过对刚释放的内存页进行监控,能够有效发现释放后使用(use-after-free)类的错误,通过独立的监控队列,对于linux系统原生的内存队列修订量最小,降低了实现的复杂度,能更好地兼容,快速有效定位问题,降低了问题定位的人力和时间消耗,提高了分析效率及故障响应速度,保障了项目实现进度。

本领域普通技术人员可以理解:附图只是一个实施例的示意图,附图中的模块或流程并不一定是实施本发明所必须的。

通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本发明可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例或者实施例的某些部分所述的方法。

本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置或系统实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的装置及系统实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。

另外,在上述实施例及附图中的描述的一些流程中,包含了按照特定顺序出现的多个操作,但是应该清楚了解,这些操作可以不按照其在本文中出现的顺序来执行或并行执行,操作的序号如201、202、203等,仅仅是用于区分开各个不同的操作,序号本身不代表任何的执行顺序。另外,这些流程可以包括更多或更少的操作,并且这些操作可以按顺序执行或并行执行。需要说明的是,本文中的“第一”、“第二”等描述,是用于区分不同的消息、设备、模块等,不代表先后顺序,也不限定“第一”和“第二”是不同的类型。

以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。

本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本发明的可选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括可选实施例以及落入本发明范围的所有变更和修改。

显然,本领域的技术人员可以对本发明实施例进行各种改动和变型而不脱离本发明实施例的精神和范围。这样,倘若本发明实施例的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。


技术特征:

1.一种linux系统的内存管理方法,其特征在于,所述方法应用于内核态内存的管理,包括:

监控是否发生内存页的释放,所述内存页为内存的基本单位;

当监控到新释放的内存页时,将所述新释放的内存页插入预设的监控队列;

修改所述新释放的内存页对应的页表表项以表征所述新释放的内存页处于监控状态;

当接收到内存访问请求对应的内存页处于监控状态时,则触发异常通告。

2.根据权利要求1所述的方法,其特征在于,所述方法,还包括:

当所述监控队列达到预设最大长度或接收到空闲队列内存不足的请求信息时,按照先入先出原则,将所述监控队列中最早入队的第一内存页插回至空闲队列中;

修改所述第一内存页对应的页表表项以表征所述第一内存页处于可访问状态。

3.根据权利要求2所述的方法,其特征在于,所述将新释放的内存页插入预设的监控队列之前,所述方法,还包括:

将预设魔术字插入所述新释放的内存页;

相应地,在将所述监控队列中最早入队的第一内存页插回至空闲队列中之前,所述方法,还包括:

检测所述所述监控队列中最早入队的第一内存页中的魔术字与预设魔术字是否相同;

若不同,则触发异常通告。

4.根据权利要求1所述的方法,其特征在于,所述方法,还包括:

将用户输入的需锁定内存页信息对应的第二内存页插入所述监控队列的第一区域;

设置所述第一区域的监控开启时间和监控关闭时间;

按照所述监控开启时间和所述监控关闭时间修改所述第二内存页对应的第二页表表项以使所述第二内存页在所述监控开启时间处于监控状态,在所述监控关闭时间处于可访问状态。

5.根据权利要求4所述的方法,其特征在于,所述方法,还包括:

当所述第二内存页处于监控状态,接收到内存访问请求对应的内存页为第二内存页时,触发异常通告;

当所述第二内存页处于可访问状态时,接收到内存访问请求对应的内存页为第二内存页时,直接访问所述第二内存页。

6.根据权利要求1至5任一所述的方法,其特征在于,所述当接收到内存访问请求对应的内存页处于监控状态时,则触发异常通告,包括:

获取所述内存访问请求对应内存页的页表表项;

确定所述页表表项是否表征所述内存页处于监控状态;

若所述内存页处于监控状态,则触发异常通告。

7.一种linux系统的内存管理装置,其特征在于,所述装置应用于内核态内存的管理,包括:监控单元、插入单元、修改单元以及管理单元;其中,

所述监控单元,用于监控是否发生内存页的释放,所述内存页为内存的基本单位;

所述插入单元,用于当监控到新释放的内存页时,将所述新释放的内存页插入预设的监控队列;

所述修改单元,用于修改所述新释放的内存页对应的页表表项以表征所述新释放的内存页处于监控状态;

所述管理单元,用于当接收到内存访问请求对应的内存页处于监控状态时,则触发异常通告。

8.根据权利要求7所述的装置,其特征在于,所述插入单元,还用于当所述监控队列达到预设最大长度或接收到空闲队列内存不足的请求信息时,按照先入先出原则,将最早入队的第一内存页插回至空闲队列中;

相应地,所述修改单元,还用于修改所述第一内存页对应的页表表项以表征所述第一内存页处于可访问状态。

9.根据权利要求8所述的装置,其特征在于,将新释放的内存页插入预设的监控队列之前,所述管理单元,还用于将预设魔术字插入所述新释放的内存页;在将最早入队的第一内存页插回至空闲队列中之前,还用于检测所述最早入队的第一内存页中的魔术字与预设魔术字是否相同;若不同,则触发异常通告。

10.根据权利要求7所述的装置,其特征在于,所述装置,还包括:设置单元;

相应地,所述插入单元,还用于将用户输入的需锁定内存页信息对应的第二内存页插入所述监控队列的第一区域;

所述设置单元,用于设置所述第一区域的监控开启时间和监控关闭时间;

所述修改单元,还用于按照所述监控开启时间和所述监控关闭时间修改所述第二内存页对应的第二页表表项以使所述第二内存页在所述监控开启时间处于监控状态,在所述监控关闭时间处于可访问状态。

11.根据权利要求10所述的装置,其特征在于,所述管理单元,还用于:

当所述第二内存页处于监控状态,接收到内存访问请求对应的内存页为第二内存页时,触发异常通告;

当所述第二内存页处于可访问状态时,接收到内存访问请求对应的内存页为第二内存页时,直接访问所述第二内存页。

12.根据权利要求7至11任一所述的装置,其特征在于,所述管理单元,具体用于获取所述内存访问请求对应内存页的页表表项;确定所述页表表项是否表征所述内存页处于监控状态;若所述内存页处于监控状态,则触发异常通告。

技术总结
本发明公开了一种Linux系统的内存管理方法及装置,该方法包括:监控是否发生内存页的释放,所述内存页为内存的基本单位;当监控到新释放的内存页时,将所述新释放的内存页插入预设的监控队列;修改所述新释放的内存页对应的页表表项以表征所述新释放的内存页处于监控状态;当接收到内存访问请求对应的内存页处于监控状态时,则触发异常通告。本发明实施例能够解决现有技术中存在内存改写类异常定位困难的问题。

技术研发人员:王靖天
受保护的技术使用者:锐捷网络股份有限公司
技术研发日:2019.12.30
技术公布日:2020.06.05

转载请注明原文地址: https://bbs.8miu.com/read-59387.html

最新回复(0)