一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于PISA管理器的跨进程内存映射方法和介质与流程

2021-11-22 14:05:00 来源:中国专利 TAG:

一种基于pisa管理器的跨进程内存映射方法和介质
技术领域
1.本发明涉及金融自助设备技术领域,特别是在pisa协议在金融自助设备技术领域跨进程内存映射方法和介质。


背景技术:

2.在pisa协议(智能机具标准架构协议protocol for intelligence terminal standards architecture(pisa),一种智能终端的标准体系架构)中,要求其管理器的内存管理分配需要应用层跟设备服务层映射到同一物理地址,设备服务通过内存管理器,把共享内存映射到同一个地址。在共享内存地址上分配和追加内存的方式,应用层和设备服务层通过共享内存的地址共享数据,并通过消息通讯的方式把内存管理器分配的地址指针发送给应用层,应用层直接访问这个指针地址就可以获取到设备服务层发送过来的结构结构体。但是这种内存分配的方式在进程使用了地址空间随机化(address space randomization)技术,就会出现进程映射到指定地址失败的情况,最终导致程序内存分配时不能映射到指定地址的情况,最后内存分配失效的情况。


技术实现要素:

3.本发明提供一种基于pisa管理器的跨进程内存映射方法和介质,在消息发送进程与消息接收进程之间不需要通过共享内存地址,即可实现跨进程内存空间的映射。
4.为实现上述技术目的,本发明采用如下技术方案:
5.一种pisa管理器的跨进程内存映射方法,包括:
6.步骤1,消息发送进程把本地的内存分配的链表序列化,得到内存链式列表并发送给pisa管理器;
7.步骤2,消息接收进程调用pisa管理器接收消息,pisa管理器对内存链表反序列化,生成一个内存地址并发送给消息接收进程;
8.步骤3,消息接收进程直接访问pisa管理器反序列化生成的内存地址,来处理消息发送进程所发送的结构体。
9.在更优的技术方案中,消息发送进程的本地内存分配方法为:消息发送进程通过pisa管理器进行首次内存分配和若干次追加内存分配;其中,每次分配的内存均包括链表头和给消息发送进程使用的内存块,利用所有分配内存的链表头构成消息发送进程的内存链表。
10.在更优的技术方案中,消息发送进程通过pisa管理器进行首次内存分配的方法为:消息发送进程通过pisa管理器调用内存分配接口分配一块内存,这块内存生成一个链表头和给消息发送进程使用的内存块,链表头中包括:指向这块内存地址的指针地址、本内存地址的首地址、本内存块的大小、指向下个链表的指针地址;其中所述指向这块内存的指针地址,对应pisa管理器内存分配的首地址。
11.在更优的技术方案中,消息发送进程每次通过pisa管理器追加内存分配的方法
为:消息发送进程调用pisa管理器的内存追加接口分配一块内存,这块内存生成一个链表头和消息发送进程追加的内存块,链表头中包括:指向内存地址的指针地址、指向这块内存地址的指针地址、本内存地址的首地址、本内存块的大小、指向下个链表的指针地址;其中,所述指向这块内存的指针地址,对应pisa管理器内存分配的首地址;通过追加地址找到链表的表头,并把最后追加的内存地址添加到链表的尾部。
12.在更优的技术方案中,步骤1具体为:pisa管理器接收消息发送进程的发送事件消息,根据消息发送进程分配的内存地址找到对应的内存链表,并对内存链表进行序列化形成多个内存块的数据块;pisa管理器根据事件接收者把事件类型和多个内存块发送给消息接收进程。
13.在更优的技术方案中,步骤3包括:
14.步骤3.1,消息接收进程按照内存块的个数,依次调用pisa管理器进行首次内存分配和追加内存分配,并对每次分配的内存进行还原处理;
15.步骤3.2,消息接收进程接收到消息回调或者直接获取到新的事件,获取消息事件类型以及指向反序列化的内存地址;
16.步骤3.3,消息接收进程直接访问内存地址中的数据,并调用释放pisa管理器的释放接口以释放内存地址。
17.在更优的技术方案中,步骤3.1的具体过程为:
18.步骤3.1.1,按照第一个内存块的数据块调用pisa管理器的内存还原接口,首先还原对应内存块的链表表头数据;其中,链表头中包括:指向这块内存地址的指针地址、本内存地址的首地址、本内存块的大小、指向下个链表的指针地址;且所述指向这块内存的指针地址,对应pisa管理器内存分配的首地址;然后拷贝内存块的数据部分拷贝到还原内存块的数据;记录原始内存块首地址跟新内存地址的首地址的对应关系,保存到列表中;如果内存块还有未还原的则进行步骤3.1.2,否则跳出步骤3.1并执行步骤3.2;
19.步骤3.1.2,调用pisa管理器的内存追加还原接口,首先按照要还原的内存块的大小,在接收进程中申请对应大小的内存空间;然后还原对应内存块的链表表头数据;其中链表头中指向内存地址的指针地址对应pisa管理器内存分配首地址、指向这块内存地址的指针地址、本内存地址的首地址、本内存块的大小、指向下个链表的指针地址;并通过追加地址找到链表的表头,把最后追加的内存地址添加到链表的尾部;将原始内存块中的数据拷贝到根据原始内存块首地址跟新内存地址的首地址对应关系中查找到这个原始内存块的首地址对应的新内存地址;根据原分配的首地址跟执行原始内存地址的指针地址的差值加上新的内存地址的的地址,并赋值这个地址的指向新的内存地址;把新的内存分配的首地址跟原始内存地址的对应关系追加到对应关系列表中;如果内存块还有未还原的进行步骤3.1.2,否则跳出步骤3.1并执行步骤3.2。
20.在更优的技术方案中,所述消息发送进程为设备服务进程,所述消息进程为应用处理进程。
21.一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现上述任一项所述的pisa管理器的跨进程内存映射方法。
22.有益效果
23.本发明基于pisa协议框架,提供了跨进程内存映射方法,具有的技术效果为:对于
在进程使用了地址空间随机化(address space randomization)的技术上,本发明不会因为内存不能映射到相同的地址而导致内存分配失败的问题,对于不同进程通过不同的物理机器调用pisa管理器也可以完成内存映射和访问。
附图说明
24.图1是本技术实施例中应用服务进程、消息服务进程、设备服务进程三者之间的关系图;
25.图2是本技术实施例中应用服务进程的首次内存分配的过程图;
26.图3是本技术实施例中应用服务进程的追加内存分配的过程图;
27.图4是本技术实施例对链表反序列化流程得到内存块一的步骤图;
28.图5是本技术实施例对链表反序列化流程得到内存块二的步骤图一;
29.图6是本技术实施例对链表反序列化流程得到内存块二的步骤图二;
30.图7是本技术实施例对链表反序列化流程得到内存块二的步骤图三。
具体实施方式
31.下面对本发明的实施例作详细说明,本实施例以本发明的技术方案为依据开展,给出了详细的实施方式和具体的操作过程,对本发明的技术方案作进一步解释说明。
32.本发明提供一种基于pisa管理器的跨进程内存映射方法和介质,适用于所有内存分配、消息收发都是通过pisa管理器实现,关键流程就是:消息发送者把本地的内存分配的链式列表序列化发送给pisa管理器,消息接收者调用pisa管理器接收消息,pisa管理器反序列化内存链式列表,生成一个内存地址提供给消息接收者。消息接收者直接访问pisa管理器反序列化生成的内存地址,来处理消息发送者发送的结构体。
33.本发明方法的关键流程之一,内存分配列表的序列化和反序列化的过程,其困难点是pisa消息响应的结构体是一系列不连续的内存块,已经分配的内存块里面的结构体里的指针会指向新的内存块,发图1所示,包含如下3个部分:
34.第1部分:应用处理进程,从pisa管理器接收消息的接口层。
35.第2部分:pisa管理器,包含消息处理服务、内存分配和追加,内存序列化和反序列化功能。
36.第3部分:设备服务进程,通过pisa管理器发送消息的接口层。
37.跨进程的内存映射具体过程描述如下:
38.步骤1:设备服务进程通过pisa管理器调用内存分配接口分配一块内存,这块内存会生成一个链表头和给设备服务进程使用的内存块,链表头中包括:指向内存地址的指针地址(该指针地址对应pisa管理器内存分配的首地址,分配内存该地址为null)、指向这块内存地址的指针地址、本内存地址的首地址、本内存块的大小、指向下个链表的指针地址(为null)。如图2所示。
39.步骤2:设备服务进程调用pisa管理器的内存追加接口分配一块内存,这块内存会生成一个链表头和设备服务进程追加的内存块,链表头中包括:指向内存地址的指针地址(对应pisa管理器内存分配的首地址,通过追加地址找到链表首地址)、指向这块内存地址的指针地址、本内存地址的首地址、本内存块的大小、指向下个链表的指针地址(为null)。
并通过追加地址找到链表的表头,把最后追加的内存地址添加到链表的尾部。如图3所示。
40.步骤3:追加内存,按照步骤2追加内存到链表的尾部。
41.步骤4:设备服务进程通过pisa管理器调用发送消息接口发送事件消息,pisa管理器把设备服务进程分配的内存地址找到整个内存链表,把整个内存链表进行反序列化,形成多个内存块的数据块。把事件接收者、事件类型和多个内存块发送给pisa管理器的消息接收服务。
42.步骤5:pisa管理器消息接收服务收到设备服务进程发送的消息,根据事件接收者的名称,转发给事件接收者,事件接收者加载的pisa管理器会把事件类型和多个内存块的数据块反序列化。按照内存块的个数,依次调用pisa管理器的内存分配(步骤6)和内存追加(步骤7)。如图4

7所示。
43.步骤6:按照第一个内存块的数据块调用pisa管理器的内存还原接口。首先还原对应内存块的链表表头数据。链表头中包括:指向内存地址的指针地址(对应pisa管理器内存分配的首地址,地址为null)、指向这块内存地址的指针地址(为null)、本内存地址的首地址、本内存块的大小、指向下个链表的指针地址(为null)。然后拷贝内存块的数据部分拷贝到还原内存块的数据。记录原始内存块首地址跟新内存地址的首地址的对应关系,保存到列表中。如果内存块还有未还原的进行步骤7,否则进行步骤8。
44.步骤7:调用pisa管理器的内存追加还原接口,首先按照要还原的内存块的大小,在接收进程中申请对应大小的内存空间。然后还原对应内存块的链表表头数据。链表头中指向内存地址的指针地址(对应pisa管理器内存分配首地址,通过追加地址找到链表首地址)、指向这块内存地址的指针地址、本内存地址的首地址、本内存块的大小、指向下个链表的指针地址(为null)。并通过追加地址找到链表的表头,把最后追加的内存地址添加到链表的尾部。拷贝原始内存块中的数据拷贝到根据原始内存块首地址跟新内存地址的首地址对应关系中查找到这个原始内存块的首地址对应的新内存地址。然后根据原分配的首地址跟执行原始内存地址的指针地址的差值加上新的内存地址的的地址。赋值这个地址的指向新的内存地址。这样新的内存指向关系就恢复正常了。把新的内存分配的首地址跟原始内存地址的对应关系追加到对应关系列表中。如果内存块还有未还原的进行步骤7,否则进行步骤8。
45.步骤8:消息接收进程接收到消息回调或者直接获取到新的事件,获取到消息事件类型,以及指向反序列化内存地址。
46.步骤9:消息接收进程直接访问内存地址中的数据,并调用释放pisa管理器的释放接口释放内存地址。
47.这样就通过内存映射的关系把进程a分配和追加的内存地址,映射到进程b中。b直接访问b进程的内存地址,跟a进程赋值的数据内容是一样的,唯一差别是内存地址中指向地址的指针的值是有差别的,进程a和进程b指向内存地址也不相同。
48.以上实施例为本技术的优选实施例,本领域的普通技术人员还可以在此基础上进行各种变换或改进,在不脱离本技术总的构思的前提下,这些变换或改进都应当属于本技术要求保护的范围之内。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献