一种注销内存地址的方法及装置与流程

文档序号:16390229发布日期:2018-12-22 11:19阅读:216来源:国知局
一种注销内存地址的方法及装置与流程

本申请涉及计算机领域,特别是涉及一种注销内存地址的方法及装置。

背景技术

目前,计算机可以利用pci-e(英文:peripheralcomponentinterconnectexpress)设备与其它设备进行数据交互。具体地,安装有linux操作系统的计算机中的用户空间(英文:userspace)安装的应用程序在运行时,可以与其它设备进行数据交互。

随着科学技术的发展,新型的pci-e设备可以支持直接访问用户空间的内存。具体地,用户空间安装的应用程序例如目标应用程序在运行时,会预先分配内存,以存储目标应用程序运行过程中产生的数据。然后将该预先分配的内存地址注册到pci-e设备中,当目标应用程序与其它设备进行数据交互,例如,其它设备向目标应用程序发送数据时,pci-e设备可以直接把其它设备发送的数据写入到预先注册的内存地址对应的内存中。

由于linux操作系统有内存回收机制,当目标应用程序退出(即停止运行)后,linux操作系统会自动把目标应用程序申请的内存回收回来,以便于在其他应用程序需要时分配给其他应用程序。因此,这就要求目标应用程序在退出时将在pcie设备中注册的内存地址注销掉。如若不然,当其它设备发送的数据传输进来时,pcie设备会继续向原来注册的内存地址对应的内存中写数据,如果这块内存被linux操作系统分配给了其他应用程序,那么这个数据的写入可能会破坏了其他应用程序,引发异常。

若要在目标应用程序在退出时将在pcie设备中注册的内存地址注销掉,可以在目标应用程序的应用程序代码中所有可能使得应用程序退出的地方都添加内存地址注销代码。当这个目标应用程序的应用程序代码的代码量非常庞大时,那么就导致需要添加内存地址注销代码的位置非常多,维护起来非常困难,并且后续版本升级修改时容易忽略和遗漏在其它位置增加内存地址注销代码的工作。

因此,需要提供一种方案,可以解决上述问题。



技术实现要素:

本申请所要解决的技术问题是如何高效注销内存地址,提供一种注销内存地址的方法及装置。

第一方面,本申请实施例提供一种注销内存地址的方法,包括:

确定目标应用程序是否停止运行;

若所述目标应用程序已停止运行,则注销所述目标应用程序在目标设备中注册的内存地址。

可选的,所述目标应用程序停止运行包括:正常停止运行或者异常停止运行;

所述确定目标应用程序是否停止运行,包括:

利用被登记函数atexit所登记的目标函数确定所述目标应用程序是否正常停止运行;和/或,

利用异常停止信号确定所述目标应用程序是否异常停止运行。

可选的,所述异常停止信号,通过如下方式生成:

响应于应用程序退出命令的执行;和/或,

监测到其它使得目标应用程序停止运行的终止信号;和/或,

监测到目标应用程序在执行过程中出现错误,并导致目标应用程序停止执行。

可选的,所述注销所述目标应用程序在目标设备中注册的内存地址,包括:

获取预先定义的内存地址变量的值;

若所述内存地址变量的值不是所述内存地址变量的初始值,则注销所述目标应用程序在目标设备中注册的内存地址。

可选的,在所述注销所述目标应用程序在目标设备中注册的内存地址之后,还包括:

将所述内存地址变量的值修改为所述初始值。

可选的,所述方法还包括:

当所述目标应用程序向所述目标设备注册内存地址时,将所述内存地址变量的值修改为所述内存地址的值。

可选的,所述目标应用程序包括:linux操作系统的用户空间中的应用程序;

所述目标设备包括:支持总线接口pciexpress的设备。

第二方面,本申请实施例提供一种注销内存地址的装置,包括:

确定单元,用于确定目标应用程序是否停止运行;

注销单元,用于若所述目标应用程序已停止运行,则注销所述目标应用程序在目标设备中注册的内存地址。

可选的,所述目标应用程序停止运行包括:正常停止运行或者异常停止运行;

所述确定单元,具体用于:

利用被登记函数atexit所登记的目标函数确定所述目标应用程序是否正常停止运行;和/或,

利用异常停止信号确定所述目标应用程序是否异常停止运行。

可选的,所述异常停止信号,通过如下方式生成:

响应于应用程序退出命令的执行;和/或,

监测到其它用于使得目标应用程序停止运行的终止信号;和/或,

监测到目标应用程序在执行过程中出现错误,并导致目标应用程序停止执行。

可选的,所述注销单元,具体用于:

获取预先定义的内存地址变量的值;

若所述内存地址变量的值不是所述内存地址变量的初始值,则注销所述目标应用程序在目标设备中注册的内存地址。

可选的,所述装置还包括:

第一修改单元,用于将所述内存地址变量的值修改为所述初始值。

可选的,所述装置还包括:

第二修改单元,用于当所述目标应用程序向所述目标设备注册内存地址时,将所述内存地址变量的值修改为所述内存地址的值。

可选的,所述目标应用程序包括:linux操作系统的用户空间中的应用程序;

所述目标设备包括:支持总线接口pciexpress的设备。

与现有技术相比,本申请实施例具有以下优点:

本申请实施例提供的注销内存地址的方法及装置,包括:确定目标应用程序是否停止运行;若所述目标应用程序已经停止运行,则注销所述目标应用程序在目标设备中注册的内存地址。由此可见,利用本申请实施例提供的技术方案,是通过确定目标应用程序是否停止运行,一旦目标应用程序停止运行,则注销所述目标应用程序在目标设备中注册的内存地址,无需在目标应用程序的应用程序代码中所有可能使得应用程序退出的地方都添加内存地址注销代码,避免了目标应用程序的应用程序代码的代码量非常庞大时,需要添加内存地址注销代码的位置非常多,维护起来非常困难,以及后续版本升级修改时容易忽略和遗漏在其它位置增加内存地址注销代码的工作的问题。

另外,由于目标应用程序停止运行包括正常停止运行和异常停止运行。因此,无论对于目标应用程序的应用程序代码执行完毕使得目标应用程序正常停止运行,还是由于其它原因导致目标应用程序异常停止运行,本申请实施例提供的方案,均可以注销目标应用程序在目标设备中注册的内存地址。这也避免了现有技术中可能出现的目标应用程序异常停止运行时不能正常注销目标应用程序在目标设备中注册的内存地址的问题。

附图说明

为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请中记载的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本申请实施例提供的一种注销内存地址的方法的流程示意图;

图2为本申请实施例提供的又一种注销内存地址的方法的流程示意图;

图3为本申请实施例提供的一种注销内存地址的装置的结构示意图。

具体实施方式

为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

本申请的发明人经过研究发现,由于linux操作系统有内存回收机制,当目标应用程序退出(即停止运行)后,linux操作系统会自动把目标应用程序申请的内存回收回来,以便于在其他应用程序需要时分配给其他应用程序。因此,这就要求目标应用程序在退出时将在pcie设备中注册的内存地址注销掉。如若不然,当其它设备发送的数据传输进来时,pcie设备会继续向原来注册的内存地址对应的内存中写数据,如果这块内存被linux操作系统分配给了其他应用程序,那么这个数据的写入可能会破坏了其他应用程序,引发异常。

若要在目标应用程序在退出时将在pcie设备中注册的内存地址注销掉,可以在目标应用程序的应用程序代码中所有可能使得应用程序退出的地方都添加内存地址注销代码。当这个目标应用程序的应用程序代码的代码量非常庞大时,那么就导致需要添加内存地址注销代码的位置非常多,维护起来非常困难,并且后续版本升级修改时容易忽略和遗漏在其它位置增加内存地址注销代码的工作。

鉴于此,本申请实施例提供了一种注销内存地址的方法及装置,包括:确定目标应用程序是否停止运行;若所述目标应用程序已经停止运行,则注销所述目标应用程序在目标设备中注册的内存地址。由此可见,利用本申请实施例提供的技术方案,是通过确定目标应用程序是否停止运行,一旦目标应用程序停止运行,则注销所述目标应用程序在目标设备中注册的内存地址,无需在目标应用程序的应用程序代码中所有可能使得应用程序退出的地方都添加内存地址注销代码,避免了目标应用程序的应用程序代码的代码量非常庞大时,需要添加内存地址注销代码的位置非常多,维护起来非常困难,以及后续版本升级修改时容易忽略和遗漏在其它位置增加内存地址注销代码的工作的问题。

下面结合附图,详细说明本申请的各种非限制性实施方式。

示例性方法

参见图1,该图为本申请实施例提供的一种注销内存地址的方法的流程示意图。

本申请实施例提供的注销内存地址的方法,例如可以通过以下步骤s101-s102实现。

s101:确定目标应用程序是否停止运行。

需要说明的是,本申请实施例中不具体限定所述目标应用程序,作为一种示例,所述目标应用程序可以为linux操作系统的用户空间中的应用程序。

可以理解的是,目标应用程序停止运行,可以包含两种情况,一种是应用程序中的应用程序代码执行完毕,即目标应用程序正常停止运行。另一种情况是,目标应用程序中的应用程序代码并未执行完毕,即目标应用程序异常停止运行。例如,由于用户干预导致目标应用程序异常停止运行;又如,由于目标应用程序自身的应用程序代码存在缺陷,导致目标应用程序异常停止运行。

由于被登记函数(即atexit函数)所登记的函数可以在程序执行完毕之后执行,因此,在本申请实施例的一种可能的实现方式中,可以利用被atexit函数所登记的目标函数确定目标应用程序是否正常停止运行。例如,可以预先在系统中登记所述目标函数,这样一来,当目标函数被执行时,则表明目标应用程序已经正常停止运行。

在本申请实施例的一种可能的实现方式中,可以利用异常停止信号确定目标应用程序是否异常停止运行。

需要说明的是,本申请实施例中提及的异常停止信号可以用于判断目标应用程序是否异常停止运行。举例而言,若异常停止信号的取值为1,则表示目标应用程序已经异常停止运行,若异常停止信号的取值为0,则表示目标应用程序并未异常停止运行。

需要说明的是,本申请实施例中提及的异常停止信号,例如可以包括sigint、sigquit、sigabrt、sigkill、sigsegv、sigterm等信号中的任意一种或者多种。

如前文所述,目标应用程序异常停止运行可能是由用户干预导致的,例如,用户调用了可以使得目标应用程序停止运行的shell命令,从而使得目标应用程序异常停止运行。因此,在本申请实施例的一种可能的实现方式中,上文提及的异常停止信号,至少可以通过以下三种方式生成。

第一种方法:响应于应用程序退出命令的执行。

需要说明的是,本申请实施例不具体限定所述应用程序退出命令,作为一种示例,所述目标程序退出命令可以为上文提及的可以使得目标应用程序异常停止运行的命令,例如kill命令、pkill命令、killall命令等命令。可以理解的是,该应用程序退出命令被执行之后,所述目标应用程序即可以异常停止运行。在本申请实施例中,一旦应用程序退出命令被执行,则可以生成异常停止信号,以表示目标应用程序异常停止运行。

第二种方法:监测到其它使得目标应用程序停止运行的终止信号。

需要说明的是,本申请实施例中提及的终止信号,例如可以为其他管理程序或操作系统本身向目标程序发送了杀死或终止信号,使得目标应用程序异常停止运行。在本申请实施例中,一旦监测到其它使得目标应用程序停止运行的终止信号,则可以生成异常停止信号,以表示目标应用程序异常停止运行。

第三种方法:监测到目标应用程序在执行过程中出现错误,并导致目标应用程序停止执行。

可以理解的是,由于目标应用程序的自身的应用程序代码可能存在缺陷,因此,目标应用程序在执行过程中可能会出现错误,对于这种情况,在本申请实施例中,监测到目标应用程序在执行过程中出现错误,并导致目标应用程序停止执行时,可以生成异常停止信号,以表示目标应用程序异常停止运行。

s102:若所述目标应用程序已停止运行,则注销所述目标应用程序在目标设备中注册的内存地址。

需要说明的是,本申请实施例不具体限定所述目标设备,作为一种示例,所述目标设备可以为支持总线接口pciexpress的设备(简称pci-e设备)。例如,所述目标设备为支持总线接口pciexpress的主机总线适配器(hostbusadapter,hba);又如,所述目标设备为支持总线接口pciexpress的非透明桥(non-transparentbridge,ntb)。

可以理解的是,若目标应用程序已经停止运行,则可以注销所述目标应用程序在目标设备中注册的内存地址,以免当其它设备发送的数据传输进来时,目标设备会继续向原来注册的内存地址对应的内存中写数据,如果这块内存被分配给了其他应用程序,那么这个数据的写入可能会破坏了其他应用程序,引发异常。

步骤s102在具体实现时,可以通过如下步骤s201-s202实现。

s201:获取预先定义的内存地址变量的值。

s202:若所述内存地址变量的值不是所述内存地址变量的初始值,则注销所述目标应用程序在目标设备中注册的内存地址。

关于步骤s201-s202,需要说明的是,本申请实施例中提及的内存地址变量,可以用于确定所述目标应用程序是否向目标设备注册内存地址。

具体地,定义该内存地址变量时,该内存地址变量具有一个初始值,本申请实施例不具体限定所述初始值,作为一种示例,所述初始值可以为0。当所述目标应用程序向所述目标设备注册内存地址时,可以将所述内存地址变量的值修改为所述内存地址的值。也就是说,若所述内存地址变量的值不是所述内存地址变量的初始值0,则说明目标应用程序向所述目标设备注册了内存地址,并且,目标应用程序注册的内存地址的值即为所述内存地址变量的值。

因此,若所述内存地址变量的值不是所述内存地址变量的初始值,则注销所述目标应用程序在目标设备中注册的内存地址,即注销在目标设备中注册的值为内存地址变量的值的内存地址。例如,内存地址变量的初始值为0,内存地址变量的当前值为3,则注销在目标设备中注册的值为3的内存地址。

本申请实施例不具体限定注销所述目标应用程序在目标设备中注册的内存地址的具体实现方式,作为一种示例,可以删除所述目标设备中用于保存内存地址注册信息的文件中,所述目标应用程序在目标设备中注册的内存地址的信息。

如前文所述,本申请实施例中提及的内存地址变量,可以用于确定所述目标应用程序是否向目标设备注册内存地址。因此,若注销了所述目标应用程序在目标设备中注册的内存地址。则表明注销之后目标应用程序并未向目标设备注册内存地址。因此,在本申请实施例的一种可能的实现方式中,在执行步骤s202之后,还可以将所述内存地址变量的值修改为所述初始值。以便于其它应用程序向所述目标应用程序注册该内存地址。

如前文所述,被atexit函数所登记的目标函数可以在程序执行完毕之后执行,在本申请实施例的一种可能的实现方式中,可以利用被atexit函数所登记的目标函数确定目标应用程序是否正常停止运行。例如,当目标函数被执行时,则表明目标应用程序已经正常停止运行。

在本申请中,由于可以自定义设置被atexit函数所登记的目标函数的执行逻辑,因此,在本申请实施例的一种可能的实现方式中,可以将步骤s201-s202所对应的内容封装成一个函数,将这个函数作为被atexit函数所登记的目标函数,这样一来,当目标应用程序正常停止运行时,即可立即执行注销目标应用程序在目标设备中注册的内存地址的步骤,提升了注销内存地址的效率。

由此可见,利用本申请实施例提供的注销内存地址的方法,可以通过确定目标应用程序是否停止运行,一旦目标应用程序停止运行,则注销所述目标应用程序在目标设备中注册的内存地址,无需在目标应用程序的应用程序代码中所有可能使得应用程序退出的地方都添加内存地址注销代码,避免了目标应用程序的应用程序代码的代码量非常庞大时,需要添加内存地址注销代码的位置非常多,维护起来非常困难,以及后续版本升级修改时容易忽略和遗漏在其它位置增加内存地址注销代码的工作的问题。

另外,由于目标应用程序停止运行包括正常停止运行和异常停止运行。因此,无论对于目标应用程序的应用程序代码执行完毕使得目标应用程序正常停止运行,还是由于其它原因导致目标应用程序异常停止运行,本申请实施例提供的方案,均可以注销目标应用程序在目标设备中注册的内存地址。这也避免了现有技术中可能出现的目标应用程序异常停止运行时不能正常注销目标应用程序在目标设备中注册的内存地址的问题。

示例性设备

参见图3,该图为本申请实施例提供的一种注销内存地址的装置的结构示意图。

本申请实施例提供的注销内存地址的装置300,例如可以具体包括:确定单元310和注销单元320。

确定单元310,用于确定目标应用程序是否停止运行;

注销单元320,用于若所述目标应用程序已停止运行,则注销所述目标应用程序在目标设备中注册的内存地址。

可选的,所述目标应用程序停止运行包括:正常停止运行或者异常停止运行;

所述确定单元310,具体用于:

利用被登记函数atexit所登记的目标函数确定所述目标应用程序是否正常停止运行;和/或,

利用异常停止信号确定所述目标应用程序是否异常停止运行。

可选的,所述异常停止信号,通过如下方式生成:

响应于应用程序退出命令的执行;和/或,

监测到其它使得目标应用程序停止运行的终止信号;和/或,

监测到目标应用程序在执行过程中出现错误,并导致目标应用程序停止执行。

可选的,所述注销单元320,具体用于:

获取预先定义的内存地址变量的值;

若所述内存地址变量的值不是所述内存地址变量的初始值,则注销所述目标应用程序在目标设备中注册的内存地址。

可选的,所述装置300还包括:

第一修改单元,用于将所述内存地址变量的值修改为所述初始值。

可选的,所述装置300还包括:

第二修改单元,用于当所述目标应用程序向所述目标设备注册内存地址时,将所述内存地址变量的值修改为所述内存地址的值。

可选的,所述目标应用程序包括:linux操作系统的用户空间中的应用程序;

所述目标设备包括:支持总线接口pciexpress的设备。

由于所述装置300是与以上方法实施例提供的方法对应的装置,因此,关于所述装置300的各个单元的具体描述,可以参考以上方法实施例中相关内容的描述部分,此处不再赘述。

由此可见,利用本申请实施例提供的注销内存地址的装置,可以通过确定目标应用程序是否停止运行,一旦目标应用程序停止运行,则注销所述目标应用程序在目标设备中注册的内存地址,无需在目标应用程序的应用程序代码中所有可能使得应用程序退出的地方都添加内存地址注销代码,避免了目标应用程序的应用程序代码的代码量非常庞大时,需要添加内存地址注销代码的位置非常多,维护起来非常困难,以及后续版本升级修改时容易忽略和遗漏在其它位置增加内存地址注销代码的工作的问题。

另外,由于目标应用程序停止运行包括正常停止运行和异常停止运行。因此,无论对于目标应用程序的应用程序代码执行完毕使得目标应用程序正常停止运行,还是由于其它原因导致目标应用程序异常停止运行,本申请实施例提供的方案,均可以注销目标应用程序在目标设备中注册的内存地址。这也避免了现有技术中可能出现的目标应用程序异常停止运行时不能正常注销目标应用程序在目标设备中注册的内存地址的问题。

本领域技术人员在考虑说明书及实践这里公开的发明后,将容易想到本申请的其它实施方案。本申请旨在涵盖本申请的任何变型、用途或者适应性变化,这些变型、用途或者适应性变化遵循本申请的一般性原理并包括本公开未公开的本技术领域中的公知常识或惯用技术手段。说明书和实施例仅被视为示例性的,本申请的真正范围和精神由下面的权利要求指出。

应当理解的是,本申请并不局限于上面已经描述并在附图中示出的精确结构,并且可以在不脱离其范围进行各种修改和改变。本申请的范围仅由所附的权利要求来限制

以上所述仅为本申请的较佳实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。

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