发明内容
本发明需要解决的技术问题是提供一种智能卡内存管理方法,能够有效地管理智能卡上的内存,提高内存的使用效率,满足大容量智能卡和复杂应用的需要。
本发明的上述技术问题这样解决,提供一种智能卡内存管理方法,动态使用内存并区分通用程序、独占程序和非独占程序,包括:
(一)用的内存管理方法:
对于通用程序,退出时可申请释放其申请的内存;
(二)特殊的内存管理方法:
对于独占程序,其申请的内存不释放、分配给该独占程序一直使用;
对于非独占程序,其申请的内存仅在有其他非独占程序申请内存时进行释放。
按照本发明提供的管理方法,该管理方法还包括通用程序申请内存并在该通用程序退出前可申请释放该申请的内存。
按照本发明提供的管理方法,该管理方法还包括独占程序申请内存时记录其独占程序标志和应用程序ID及进程信息并在其本身或其他独占程序再次申请时对应应用程序ID及进程信息与所述记录一致的情况下直接使用该申请的内存。
按照本发明提供的管理方法,该管理方法还包括非独占程序申请内存时记录其非独占程序标志和应用程序ID及进程信息并在其他非独占程序再次申请时对应应用程序ID与所述记录不一致且进程信息一致的情况下释放该申请的内存。
按照本发明提供的管理方法,该管理方法还包括非独占程序申请内存时记录其非独占程序标志和应用程序ID及进程信息。
按照本发明提供的管理方法,所述记录包括分配具体内存的起始地址数据项、大小数据项、附加信息数据项和进程信息数据项;所述附加信息数据项包括独占/非独占程序标志子项和应用程序ID子项,记录申请内存的独占/非独占程序的应用程序ID及其独占/非独占程序标志;所述进程信息数据项记录申请内存的独占/非独占程序进程信息。
按照本发明提供的管理方法,所述申请内存包括以下步骤:
7.1)根据申请的内存的大小从现有记录标示的已分配内存之外寻找合适的连续空闲空间;
7.2)分配该连续空闲空间并增加记录,记录其起始地址和大小,同时根据申请内存的是独占/非独占程序记录附加信息和进程信息;所述附加信息包括独占/非独占程序标志和应用程序ID。
按照本发明提供的管理方法,所述寻找是从大小大于所述申请的内存的连续空闲空间集合中查找其中最小的连续空闲空间。
按照本发明提供的管理方法,所述空闲空间包括被释放的已分配空间和从未被分配的空间。
按照本发明提供的管理方法,所述释放包括删除对应记录。
按照本发明提供的管理方法,所述内存,即:智能卡可用内存,包括内存控制块区域和应用程序堆区域,所述记录存储在所述内存控制块区域中,所述申请的内存位于所述应用程序堆区域。
本发明提供的一种智能卡内存管理方法,针对通用程序、独占程序和非独占程序采取不同的管理策略,该智能卡应用的内存管理模块,能够提高大容量智能卡内存的使用效率,同时解决智能卡各种实际应用中的内存回收的问题。
具体实施方式
首先,说明本发明基础:
①在智能卡应用的过程中,智能卡与移动终端是通过命令进行交互的,传统的内存使用方法是在入口的时候动态申请内存,在出口的时候释放入口时申请的内存。而智能卡应用中内存使用的特点是入口和出口不是唯一的,智能卡是通过一个入口进入一个应用中的,但退出该应用可以有多个出口,所以如果卡的应用程序在入口处申请了一块内存,但由于出口是不确定的,而且一些出口可能是几个入口的共同的出口,那么就无法在出口处将内存释放,这样就有可能造成内存的泄漏,需要采用特殊内存管理方法。②同时,卡的特殊应用是由一些功能函数和STK指令组成,功能函数是实现应用的具体操作的函数,在功能函数内部程序是顺序执行的,所以在功能函数内部可以进行通用的内存申请和释放,可以采用通用内存管理方法。
其次,说明本发明内存管理方法:
一、将智能卡上的可用内存分为两个区域,一个是内存控制块区域,一个是应用程序堆区域,内存控制块区域记录了应用程序堆的使用情况。内存控制块区域中保存了若干个内存控制块,每一个内存控制块用来保存一个已分配内存块的信息,应用程序堆区域是真正分配给应用程序的内存块的集合。本发明包括两个方法,一个方法是通用的内存管理方法,由于在智能卡应用的某些功能实现中,程序是顺序执行的,不存在内存申请后无法释放的问题,使用通用内存管理的方法,首先申请内存,使用后释放内存,另一个方法是特殊内存管理方法,当程序申请内存后无法确定何时释放内存时,采用特殊内存管理方法。通用的内存管理方法中内存的生存周期是由用户来决定的,特殊的内存管理方法中内存的生存周期是由系统和用户共同决定的。
二、定义内存控制块记录的结构,如图1所示,包括:
1、已分配内存块的起始地址(简称:内存块起始地址)
2、已分配内存块的大小(简称:内存块大小)
3、应用程序的附加信息(简称:附加信息):共16位,特殊内存管理方法的信息位,最高位标识是独占类型还是非独占类型的,低15位标识特殊应用程序的ID号。
4、应用程序的进程信息(简称:进程信息):特殊内存管理方法的信息位,对于独占/非独占程序申请时记录其进程信息;
三、内存管理匹配策略:
内存管理采用最佳匹配策略。最佳匹配策略是指查找应用程序堆区域中容量大于或等于应用程序要申请的内存大小的最小空闲内存块。
四、通用内存管理方法中内存申请和释放的原理:
(一)内存的申请
如图2所示,包括以下步骤:
201)判断内存控制块区域和应用程序堆区域的起始地址是否有效。如果无效,内存申请失败;
202)判断申请的内存的大小是否为0,是否大于应用程序堆区域的总大小,如果是,内存申请失败;
203)判断内存控制块区域是否没有存放内存控制块记录的空间,如果是,内存申请失败。
204)判断要申请的内存大小是否小于最小分配单位,如果小于,令要申请的内存大小等于最小分配单位,如果大于,令其值为最小分配单位的最小倍数的值。
205)遍历内存控制块区,通过所有记录中的内存块起始地址和内存块大小在应用程序堆区域寻找空闲内存块(包括以前用过但释放的内存和从未分配的内存)。
206)遍历所有空闲内存块从中找到大于所述申请的内存的连续空闲空间集合中最小的分配给应用程序(如果没有大于所述申请的内存的连续空闲空间则内存申请失败),如果在应用程序堆区域中找到的该内存块大于最小分配单位和申请的内存大小之和,将这个找到的空闲内存分为两部分,一部分分配给应用程序,剩余部分仍作为空闲内存块,如果是等于,那么就将这个找到的空闲内存块分配给应用程序。将分配给应用程序的内存块的起始地址、内存块的大小分别赋值给一个内存控制块记录的内存块起始地址、内存块大小数据项。
207)将上述内存控制块记录添加到内存控制块区域中。
(二)内存的释放
如图3所示,包括以下步骤:
301)判断内存控制块区域和应用程序堆区域的首地址是否有效,如果无效,内存释放失败。
302)根据要求释放的内存块的起始地址,遍历内存控制块区域,查找内存控制块中内存块起始地址等于要求释放的内存块的起始地址的内存块;
303)如果找到了,就将该内存控制块记录删掉,将后面的内存控制块记录都前移一个单位,应用程序堆区域的对应内存块成为空闲内存块,完成内存释放。
304)如果没有找到,内存释放失败。
五、特殊的内存管理方法:
特殊应用申请的内存可以分为独占类型和非独占类型的,在申请和释放内存的操作上是不同的,申请独占类型内存的应用程序如果申请了内存就不会再释放这块内存了,申请非独占类型内存的应用程序如果申请了内存,不会主动释放,但是如果有别的特殊应用程序申请非独占类型的内存时,就会释放原来的非独占类型的内存。特殊的内存管理方法是通过这样的方式来解决特殊应用只申请不释放内存的问题的。
如图4所示,特殊内存管理方法包括以下步骤:
401)判断内存控制块区域和应用程序堆区域的首地址是否有效,如果无效,内存申请失败;
402)判断申请的内存的大小是否为0,是否大于应用程序堆区域的总大小,如果是,内存申请失败;
403)判断要申请的内存大小是否小于最小分配单位,如果小于,令要申请的内存大小等于最小分配单位,如果大于,令其值为最小分配单位的最小倍数的值。
404)查找当前程序进程中是否有其它应用ID号的非独占类型的内存,如果有,将其释放,也即将这些内存控制块记录删掉,将后面的内存控制块记录前移。
405)判断内存控制块区域是否没有存放内存控制块记录的空间,如果是,内存申请失败。
406)判断申请内存的特殊应用程序是否是独占类型的,如果是独占类型的,根据该应用的ID号及进程信息查找是否该应用程序曾申请过对应的独占内存,如果该应用程序申请过,那么将找到的内存块分配给该特殊应用程序,内存申请结束。
407)如果申请内存的特殊应用程序是独占类型的,并且该应用程序没有申请过上述对应的独占内存,或者申请内存的特殊应用程序是非独占类型的,则遍历内存控制块区域,通过所有记录中的内存块的起始地址和内存块大小在应用程序堆区域寻找空闲内存块(包括以前用过但释放的内存和从未分配的内存)。
408)遍历所有空闲内存块从中找到大于所述申请的内存的连续空闲空间集合中最小的分配给应用程序(如果没有大于所述申请的内存的连续空闲空间则内存申请失败),如果在应用程序堆区域中找到的该内存块大于最小分配单位和申请的内存大小之和,将这个找到的空闲内存分为两部分,一部分分配给应用程序,剩余部分仍作为空闲内存块,如果是等于,那么就将这个找到的空闲内存块分配给应用程序。将分配给应用程序的内存块的起始地址、内存块的大小赋值给一个内存控制块记录的内存块起始地址和内存块大小数据项,并将该特殊应用程序的附加信息和进程信息赋值给内存控制块记录的附加信息数据项和进程信息数据项。
409)将上述内存控制块记录添加到内存控制块区域中。
最后,结合具体应用对本发明方法进一步详细说明:
以移动终端的短信群发为例,用户进行操作流程如下:
1、用户进入短信群发时,通过SIM卡主动式命令进入短信群发的应用入口。
2、用户进入新编短信->输入内容->选择号码,在用户选择某一个号码后,程序会通过特殊内存申请方式申请一个内存块来保存已选择号码的信息(该号码的来源信息及所属文件的记录号),按照图4的流程分配一个内存块给特殊应用程序,本应用申请的是非独占类型的内存。首先释放当前程序进程中的所有其它ID号的非独占类型内存,然后判断是否要申请独占类型的内存,如果是独占类型的内存,则遍历内存控制块区域,查找是否存在已申请的特殊内存块(附加信息和进程信息一致),如果存在则将该内存块分配给该特殊应用程序,否则将从空闲的应用程序堆区域为应用新分配一块内存;如果是非独占类型的,将从空闲的应用程序堆区域为应用新分配一块内存。如果分配了内存,则将分配的内存块的起始地址、内存块的大小和特殊应用程序的附加信息和进程信息赋值给内存控制块记录。
3、用户选择一个号码,确定后,卡将该组员的信息存放在上面申请的内存中,继续选择号码,直到用户选择完需要发送的号码,这样卡已经将所有组员的信息存储到内存中了。
4、用户选择发送短信,卡将给内存中存储的所有号码发送短信,操作完成。
5、用户退出该应用,进入其他应用,如果再执行申请特殊应用内存的操作,如果短信群发应用是非独占类型,卡的内存管理会将短信群发应用申请的内存释放。
这样,对于非独占类型的特殊应用,就可以实现应用程序不必每次申请操作都需要释放内存,应用程序只需申请一次,当系统退出当前应用后,进入下一个应用时,系统会自动释放前一个应用申请的内存。如果中间有退出短信群发应用的操作,内存也不会出现只申请不释放的情况。