栈溢出检测方法、装置、嵌入式系统和存储介质与流程

文档序号:29514046发布日期:2022-04-06 20:35阅读:83来源:国知局
栈溢出检测方法、装置、嵌入式系统和存储介质与流程

1.本发明涉及计算机技术领域,尤其涉及一种栈溢出检测方法、装置、嵌入式系统和存储介质。


背景技术:

2.目前,很多电子设备中都会使用到嵌入式系统,嵌入式系统中一般会包括诸如处理器、存储器、通用设备接口等硬件,以及操作系统等软件。
3.在嵌入式系统中,当需要运行某个任务时,会预先创建与该任务对应的堆栈,在任务运行过程中,该堆栈可以用于存储任务运行时在一些函数中分配的局部变量、参数值等,还可以用于压栈被调用函数。但是,如果使用不当,比如分配的局部变量过大,或者函数调用嵌套太深,都可能会导致栈溢出问题。
4.目前,一种检测栈溢出的方法是:在创建某任务a对应的堆栈时,在栈底的某个或某几个字节内初始化一个魔数(也称为魔法值),如果任务a运行过程中发生了栈溢出现象,该魔数会被篡改。基于此,目前,在任务a执行完毕而切换至另一个任务b时,会触发对任务a是否发生了栈溢出问题的检测,当检测出上述魔数被篡改时,确定发生了栈溢出问题。
5.由于上述检测方式是一种滞后性的检测,不能实时捕获栈溢出信息,即不能实时捕获栈溢出现场上下文,因而不利于问题定位。


技术实现要素:

6.本发明实施例提供一种栈溢出检测方法、装置、嵌入式系统和存储介质,能够实时地检测出栈溢出问题。
7.第一方面,本发明实施例提供一种栈溢出检测方法,该方法包括:
8.创建与第一任务对应的堆栈;
9.通过存储保护单元中的第一保护域对所述堆栈的目标地址进行保护,并设置所述第一保护域的访问权限为不可访问,其中,所述目标地址包括栈底方向的地址,所述第一保护域是所述存储保护单元中包含的多个保护域中的一个;
10.在所述第一任务的运行过程中,响应于栈指针对所述目标地址的访问,基于所述访问权限触发异常信号,所述异常信号指示所述堆栈出现栈溢出问题;
11.根据所述异常信号对应的异常处理程序,获取栈溢出信息。
12.第二方面,本发明实施例提供一种栈溢出检测装置,该装置包括:
13.创建模块,用于创建与第一任务对应的堆栈;
14.保护模块,用于通过存储保护单元中的第一保护域对所述堆栈的目标地址进行保护,并设置所述第一保护域的访问权限为不可访问,其中,所述目标地址包括栈底方向的地址,所述第一保护域是所述存储保护单元中包含的多个保护域中的一个;
15.栈溢出检测模块,用于在所述第一任务的运行过程中,响应于栈指针对所述目标地址的访问,基于所述访问权限触发异常信号,所述异常信号指示所述堆栈出现栈溢出问
题;以及,根据所述异常信号对应的异常处理程序,获取栈溢出信息。
16.第三方面,本发明实施例提供一种嵌入式系统,包括处理器、存储器、存储保护单元,其中,所述存储器上存储有可执行代码,当所述可执行代码被所述处理器执行时,使所述处理器至少可以实现第一方面中的栈溢出检测方法。
17.第四方面,本发明实施例提供了一种非暂时性机器可读存储介质,所述非暂时性机器可读存储介质上存储有可执行代码,当所述可执行代码被嵌入式系统的处理器执行时,使所述处理器至少可以实现第一方面中的栈溢出检测方法。
18.第五方面,本发明实施例提供一种嵌入式系统,包括:操作系统,存储保护单元,处理器;
19.所述操作系统,响应于第一任务的启动,创建与所述第一任务对应的堆栈;
20.所述存储保护单元,用于通过第一保护域对所述堆栈的目标地址进行保护,并设置所述第一保护域的访问权限为不可访问,其中,所述目标地址包括栈底方向的地址,所述第一保护域是所述存储保护单元中包含的多个保护域中的一个;
21.所述处理器,用于在所述第一任务的运行过程中,响应于栈指针对所述目标地址的访问,基于所述访问权限触发异常信号,所述异常信号指示所述堆栈出现栈溢出问题;以及,根据所述异常信号对应的异常处理程序,获取栈溢出信息。
22.在本发明实施例中,以即将运行第一任务为例,在运行第一任务之前,会创建与第一任务对应的堆栈,假设该堆栈为向下生长的堆栈。为了能够实时地检测出第一任务运行过程中,该堆栈是否发生栈溢出问题,会预先通过存储保护单元(memory protection unit,简称mpu)中的第一保护域(region)对该堆栈的目标地址(如栈底的预设地址)进行保护,并设置第一保护域的访问权限为不可访问。在第一任务的运行过程中,当栈指访问到上述目标地址时,由于mpu的保护,该目标地址是不可以被访问的,所以会立即触发异常(说明出现了栈溢出问题),从而可以在相应的异常处理程序中实时地获取栈溢出信息。
附图说明
23.为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
24.图1为本发明一实施例提供的栈溢出检测方法的流程图;
25.图2为本发明一实施例提供的向下生长的堆栈示意图;
26.图3为本发明一实施例提供的向上生长的堆栈示意图;
27.图4为本发明一实施例提供的保护栈底地址场景的示意图;
28.图5为本发明一实施例提供的栈溢出场景的示意图;
29.图6为本发明另一实施例提供的栈溢出检测方法的流程图;
30.图7为本发明一实施例提供的栈溢出检测装置的结构示意图;
31.图8为本发明一实施例提供的嵌入式系统的结构示意图;
32.图9为本发明一实施例提供的嵌入式系统的结构示意图。
具体实施方式
33.为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
34.在本发明实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本发明。在本发明实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义,“多种”一般包含至少两种。
35.取决于语境,如在此所使用的词语“如果”、“若”可以被解释成为“在
……
时”或“当
……
时”或“响应于确定”或“响应于检测”。类似地,取决于语境,短语“如果确定”或“如果检测(陈述的条件或事件)”可以被解释成为“当确定时”或“响应于确定”或“当检测(陈述的条件或事件)时”或“响应于检测(陈述的条件或事件)”。
36.传统的栈溢出检测方案具有检测滞后性,无法获取栈溢出现场。
37.传统的栈溢出检测方案之所以无法获取栈溢出现场是因为:以任务a和任务b为例,当需要由任务a切换到任务b时,才执行针对任务a是否存在栈溢出问题的检测,此时,栈溢出现场已经丢失。因为如果任务a运行过程中已经发生了栈溢出问题而此时任务a还未执行完毕,那么任务a的后续执行过程将会破坏栈溢出现场。这样,在任务a执行完毕时才执行的栈溢出检测过程中,将无法获得栈溢出现场。
38.基于此,本发明实施例提供的栈溢出检测方法的目的在于:实时地检测出栈溢出问题,从而获取栈溢出现场,以便准确地定位出导致栈溢出的原因,加以优化。
39.实际应用中,在很多电子设备中都可以部署有嵌入式系统。本发明实施例提供的栈溢出检测方法可以由嵌入式系统来执行,具体地,可以由嵌入式系统中的处理器来执行,比如cortex-m系列的处理器。实际应用中,有些嵌入式系统中会包含操作系统,操作系统与处理器耦合,此时,可以由操作系统与处理器配合来执行该栈溢出检测方法。
40.下面结合以下一些实施例对该栈溢出检测方法的执行过程进行说明。
41.图1为本发明一实施例提供的栈溢出检测方法的流程图,如图1所示,可以包括如下步骤:
42.101、创建与第一任务对应的堆栈。
43.102、通过存储保护单元中的第一保护域对堆栈的目标地址进行保护,并设置第一保护域的访问权限为不可访问,其中,目标地址包括栈底方向的地址,第一保护域是存储保护单元中包含的多个保护域中的一个。
44.103、在第一任务的运行过程中,响应于栈指针对目标地址的访问,基于所述访问权限触发异常信号,异常信号指示堆栈出现栈溢出问题。
45.104、根据异常信号对应的异常处理程序,获取栈溢出信息。
46.在嵌入式系统中,每当需要运行一个任务时,都会预先创建出该任务对应的堆栈。不同任务的堆栈是相互独立的。
47.一般来说,堆栈可以分为两种:向下生长的堆栈和向上生长的堆栈。为便于理解,下面结合图2和图3来示例性说明这两种堆栈。
48.图2为本发明一实施例提供的向下生长的堆栈示意图,如图2中所示,如果堆栈是
向下生长的,也就是从高地址向低地址生长(即压栈时栈指针从高地址向低地址移动),栈底为栈指针可以到达的最小合法地址,栈顶为栈指针可以到达的最大合法地址。其中,栈指针(stackpointer,简称sp)。
49.图3为本发明一实施例提供的向上生长的堆栈示意图,如图3中所示,如果堆栈是向上生长的,也就是从低地址向高地址生长(即压栈时栈指针从低地址向高地址移动),栈底为栈指针可以到达的最大合法地址,栈顶为栈指针可以到达的最小合法地址。
50.本文中,不管是向下生长的堆栈还是向上生长的堆栈,栈溢出都是指当前任务的栈指针超出相应堆栈的栈底的现象。
51.在本发明实施例中,为了能够实时地检测出栈溢出问题,获得栈溢出信息(即栈溢出现场上下文),需要借助mpu的保护功能。概括来说,该保护功能主要体现为:一方面,将mpu的某个保护域指向任务对应的堆栈的栈底地址,另一方面,对该保护域进行访问权限的设置,设置为不可访问这种权限。这两个方面的配置意味着被上述保护域保护的栈底地址是不允许被访问的。
52.下面具体来说明使用上述保护功能的过程。
53.以上述第一任务为例,在创建第一任务时,可以同时创建与第一任务对应的堆栈。为便于描述,下文将第一任务对应的堆栈称为第一堆栈。在需要运行该第一任务之前,先对第一任务所对应的堆栈的目标地址进行保护,该目标地址是栈底方向的地址。本文中,栈底方向的地址是指栈底的一个或几个字节(如4个字节)所对应的地址。以图4为例来说,假设第一堆栈是如图4中所示的向下生长的堆栈,上述目标地址是栈底地址,即栈底所对应的一个字节的地址,其中,图4中的每个矩形框表示一个字节。使用mpu的一个保护域——第一保护域(图4中表示为region1)对该目标地址进行保护,并设置第一保护域的访问权限为:不可访问。
54.另外,可选地,在创建第一堆栈的过程中,还可以在所述目标地址内写入魔数。这样,如果发生栈溢出现象,并且发生栈溢出时第一任务对堆栈执行的是写操作,那么该魔数将被修改,从而,可以得知是由于写操作导致的栈溢出。
55.在嵌入式系统中,mpu可以实施对存储器(主要是内存和外设寄存器)的保护,是一种硬件保护方式。mpu使用“域(regions)”来对内存进行管理,其中,域也可以称为保护域(protection regions)。一般来说,mpu提供有8个保护域,编号为0~7。上述第一保护域可以是这8个中的任一个。
56.下面假设第一保护域为region1,概括来说,通过mpu的region1来对第一堆栈的目标地址进行保护,可以包括如下步骤:
57.先禁止mpu,之后,将第一堆栈的目标地址写入region1,并设置region的访问权限为不可访问,之后,使能mpu。
58.举例来说,假设region1的地址为:0x11111111,第一堆栈的目标地址为0x12345678,则将0x12345678写入0x11111111这个地址内。其中,region1的地址以及大小等相关信息的含义和设定,可以参考现有相关技术实现,本文中不赘述。
59.另外,参考现有相关技术可知,对mpu的禁止和使能,可以通过配置相关寄存器的特定比特位来实现,比如通过对协处理器cp15的寄存器c1中的bit[0]置1,可以使能mpu。相反地,清零该比特位,可以禁止mpu,即不使用mpu。在系统上电时,默认状态是该位清零,所
有保护域无效。
[0060]
另外,目前在嵌入式操作系统中,提供了两种操作模式:处理者(handler)模式以及线程(thread)模式,还支持两种特权级别:特权级和非特权级(也称为用户级)。其中,两种操作模式主要是为了区别正在执行的代码的类型。一般地,处理者模式对应于异常处理程序的代码,线程模式对应于普通应用程序的代码。两种特权级别是对存储器访问提供的一种保护机制:在特权级下,程序可以访问所有范围的存储器(当然还需要考虑mpu对其保护的区域的限定),而在非特权级下,可以访问的范围是更加受限的。
[0061]
线程模式,可以是特权级,也可以是非特权级;处理者模式总是特权级的。在复位后,处理器处于特权级的线程模式下。
[0062]
在本发明实施例中在对mpu的设置过程中,处理器处于特权级的操作模式。也就是说,要确定嵌入式系统的处理器处于特权级的操作模式下,此时才设置通过mpu中的region1对第一堆栈的目标地址进行保护,以及设置region1的访问权限为不可访问。其中,这里所说的特权级的操作模式可以是特权级的处理者模式,或者特权级的线程模式。
[0063]
如前文所述,嵌入式系统复位后,处理器默认处于特权级的线程模式下,当需要进行mpu的上述设置过程时,可以直接在该模式下完成上述设置过程,也可以切换至特权级的处理者模式下完成上述设置过程。不同模式之间的切换可以参考现有相关技术来实现。
[0064]
综上,在通过mpu的region1对第一堆栈的目标地址进行保护,并设置region1的访问权限为不可访问之后,可以运行第一任务。在第一任务的运行过程中,栈指针会不断更新访问地址,当某时刻栈指针指向上述目标地址时,由于该目标地址被region1保护,且region1的访问权限为不可访问,这就意味着目标地址是不允许被访问的,从而,基于该访问权限的设置,当栈指针指向目标地址时,会立刻触发异常信号,该异常信号可以是指示处理存储管理故障(memmanagementfault)的中断信号,基于该异常信号,可以调用操作系统提供的与该异常信号对应的异常处理程序。由于该异常信号是因为栈指针访问第一堆栈的目标地址而触发的,而该目标地址对应于第一堆栈的栈底地址,如前文所述,当栈指针超出栈底地址时,就会发生栈溢出问题,因此,该异常信号的触发意味着此时发生了栈溢出问题。
[0065]
基于上述异常信号的触发,会跳转至对应的异常处理程序,基于该异常处理程序可以获取栈溢出信息,即栈溢出现场上下文,可以包括:发生栈溢出问题时相关寄存器的状态信息、第一堆栈中存储的数据信息,等等。概括来说,异常处理程序的一种主要作用就是获取栈溢出发生时对第一堆栈的各种操作信息,以便于后续基于获得的这些信息进行栈溢出原因的准确定位。
[0066]
当上述异常信号触发后,第一任务将被中断执行。
[0067]
另外,当触发上述异常信号时,如果此时处理器未处于特权级的处理者模式下,那么此时需要确定处理器处于特权级的处理者模式下,以在该特权级的处理者模式下根据异常处理程序获取栈溢出信息。
[0068]
综上,通过在某任务运行前,使用mpu的保护域对栈底地址(是指接近栈底的一个或几个字节)进行保护,并设置该保护域是不可访问的,基于该设置结果,在该任务的运行过程中,可以实时地检测出栈溢出问题,准确地定位到栈溢出现场。
[0069]
为能够更加直观地理解上述图1所示实施例提供的栈溢出检测方法,下面结合图5
示意的栈溢出检测场景来示例性说明。
[0070]
在图5中,假设上文中的第一任务为任务x,当需要启动任务x时,操作系统创建与任务x对应的堆栈,假设该堆栈即为图5中示意的堆栈。初始情况下,栈指针sp指向栈顶。图5中示意的栈底方向的目标地址被mpu保护,使其不可被访问。在任务x运行过程中,会不断产生需要写入堆栈内的数据,比如图5中示意的data1、data2

data100。随着数据的写入,栈指针sp指向的地址随之改变。假设当需要继续往堆栈中写入数据时,栈指针指向了被保护的目标地址,那么此时,由于目标地址被mpu保护,且访问属性设置为不可访问,所以此时会触发异常,指示发生了栈溢出问题,并调用操作系统提供的相应异常处理程序来获取栈溢出现场。
[0071]
实际应用中,任务x可以是嵌入式系统中包含的某种用户应用程序。
[0072]
图6为本发明另一实施例提供的栈溢出检测方法的流程图,如图6所示,可以包括如下步骤:
[0073]
601、创建与第一任务对应的堆栈。
[0074]
602、通过存储保护单元中的第一保护域对堆栈的目标地址进行保护,并设置第一保护域的访问权限为不可访问。
[0075]
603、在第一任务的运行过程中,响应于栈指针对目标地址的访问,基于第一保护域的访问权限触发异常信号,根据异常信号对应的异常处理程序,获取栈溢出信息。
[0076]
604、创建与第二任务对应的堆栈。
[0077]
605、响应于第一任务向第二任务的切换,通过存储保护单元中的第二保护域对第二任务对应的堆栈的目标地址进行保护,并设置第二保护域的访问权限为不可访问。
[0078]
606、在第二任务的运行过程中,响应于栈指针对目标地址的访问,基于第二保护域的访问权限触发异常信号,根据异常信号对应的异常处理程序,获取栈溢出信息。
[0079]
值得说明的是,本实施例中上述步骤的执行时序仅为一种举例,并非严格限定。
[0080]
本实施例中主要想要说明的是,当第一任务执行完毕需要切换到执行第二任务的情形下,如何对第二任务进行实时地栈溢出检测。
[0081]
实际上,对第二任务对应的栈溢出问题的检测方式与前文中介绍的对第一任务对应的栈溢出检测方式是相同的。
[0082]
具体来说,为方便描述,将第一任务对应的堆栈称为第一堆栈,将第二任务对应的堆栈称为第二堆栈,并假设第一堆栈的目标地址为其栈底地址,第二堆栈的目标地址亦为第二堆栈的栈底地址。假设第一任务在运行的过程中,第一堆栈对应的栈指针在某时刻访问第一堆栈的栈底地址,此时会触发异常信号,以便在响应该异常信号的异常处理程序中实时地获取第一堆栈的栈溢出信息。当第一任务运行结束后,假设接下来需要运行第二任务,在运行第二任务前,为了能够实时地检测出第二任务对应的栈溢出问题,同样地,也需要通过mpu的保护域对第二堆栈的栈底地址进行保护,并设置该保护域不可访问。
[0083]
将保护第一堆栈的栈底地址的保护域称为第一保护域,将保护第二堆栈的栈底地址的保护域称为第二保护域,第二保护域与第一保护域可以相同或不同。
[0084]
假设第一保护域与第二保护域相同,都是region1,实际上,在使用region1对第二堆栈的栈底地址进行保护之前,先禁止mpu,之后,将第二堆栈的栈底地址写入region1,设置region1的访问权限为不可访问,之后使能mpu,从而,实现region1切换至保护第二堆栈
的栈底地址。
[0085]
同样地,在第二任务的运行过程中,当第二堆栈对应的栈指针访问第二堆栈的栈底地址时,会马上触发异常信号,根据异常信号会跳转至对应的异常处理程序,以基于该异常处理程序获取第二堆栈对应的栈溢出信息。
[0086]
以下将详细描述本发明的一个或多个实施例的栈溢出检测装置。本领域技术人员可以理解,这些栈溢出检测装置均可使用市售的硬件组件通过本方案所教导的步骤进行配置来构成。
[0087]
图7为本发明一实施例提供的栈溢出检测装置的结构示意图,该栈溢出检测装置可以位于嵌入式系统中。如图7所示,该栈溢出检测装置包括:创建模块11、保护模块12、栈溢出检测模块13。
[0088]
创建模块11,用于创建与第一任务对应的堆栈。
[0089]
保护模块12,用于通过存储保护单元中的第一保护域对所述堆栈的目标地址进行保护,并设置所述第一保护域的访问权限为不可访问,其中,所述目标地址包括栈底方向的地址,所述第一保护域是所述存储保护单元中包含的多个保护域中的一个。
[0090]
栈溢出检测模块13,用于在所述第一任务的运行过程中,响应于栈指针对所述目标地址的访问,基于所述访问权限触发异常信号,所述异常信号指示所述堆栈出现栈溢出问题;以及,根据所述异常信号对应的异常处理程序,获取栈溢出信息。
[0091]
可选地,保护模块12具体可以用于:禁止所述存储保护单元;将所述目标地址写入所述存储保护单元中的第一保护域,并设置所述第一保护域的访问权限为不可访问;使能所述存储保护单元。
[0092]
可选地,创建模块11还可以用于:在创建所述堆栈的过程中,在所述目标地址内写入魔数。
[0093]
可选地,保护模块12具体可以用于:确定所述嵌入式系统的处理器处于特权级的操作模式,通过存储保护单元中的第一保护域对所述堆栈的目标地址进行保护。
[0094]
其中,可选地,所述特权级的操作模式包括:特权级的处理者模式,或者,特权级的线程模式。
[0095]
可选地,栈溢出检测模块13具体可以用于:确定所述嵌入式系统的处理器处于特权级的处理者模式,以根据所述异常信号对应的异常处理程序,获取栈溢出信息。
[0096]
可选地,保护模块12还可以用于:响应于所述第一任务向第二任务的切换,通过所述存储保护单元中的第二保护域对所述第二任务对应的堆栈的目标地址进行保护,并设置所述第二保护域的访问权限为不可访问,其中,所述第二保护域与所述第一保护域相同或不同。
[0097]
图7所示栈溢出检测装置可以执行前述图1至图5所示实施例中提供的方法,本实施例未详细描述的部分,可参考前述实施例的相关说明,在此不再赘述。
[0098]
在一个可能的设计中,上述图7所示的栈溢出检测装置的结构可实现为嵌入式系统。如图8所示,该嵌入式系统可以包括:处理器21、存储器22、存储保护单元23。其中,存储器22上存储有可执行代码,当所述可执行代码被处理器21执行时,至少使处理器21可以实现如前述图1至图5所示实施例中提供的栈溢出检测方法。
[0099]
该嵌入式系统的结构中还可以包括操作系统等软件,以及诸如i/o接口、通信接口
等接口,以及各种寄存器。
[0100]
另外,本发明实施例提供了一种非暂时性机器可读存储介质,所述非暂时性机器可读存储介质上存储有可执行代码,当所述可执行代码被嵌入式系统的处理器执行时,使所述处理器执行前述图1至图5所示实施例中提供的栈溢出检测方法。
[0101]
以上从硬件组成的角度对嵌入式系统的组成进行了介绍。实际应用中,嵌入式系统中不仅可以包括硬件,还可以包括软件。基于此,如图9所示,嵌入式系统中可以包括:操作系统31,存储保护单元32,处理器33。
[0102]
操作系统31,响应于第一任务的启动,创建与所述第一任务对应的堆栈。
[0103]
存储保护单元32,用于通过第一保护域对所述堆栈的目标地址进行保护,并设置所述第一保护域的访问权限为不可访问,其中,所述目标地址包括栈底方向的地址,所述第一保护域是所述存储保护单元中包含的多个保护域中的一个。
[0104]
处理器33,用于在所述第一任务的运行过程中,响应于栈指针对所述目标地址的访问,基于所述访问权限触发异常信号,所述异常信号指示所述堆栈出现栈溢出问题;以及,根据所述异常信号对应的异常处理程序,获取栈溢出信息。
[0105]
可选地,存储保护单元32还用于:响应于所述第一任务向第二任务的切换,通过所述存储保护单元中的第二保护域对所述第二任务对应的堆栈的目标地址进行保护,并设置所述第二保护域的访问权限为不可访问,其中,所述第二保护域与所述第一保护域相同或不同。
[0106]
上述操作系统31、存储保护单元32、处理器33在栈溢出检测过程中的具体执行步骤,可以参考前述其他实施例中的相关说明,在此不赘述。
[0107]
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的各个模块可以是或者也可以不是物理上分开的。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
[0108]
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助加必需的通用硬件平台的方式来实现,当然也可以通过硬件和软件结合的方式来实现。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以计算机产品的形式体现出来,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。
[0109]
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1