CN107368379B - 面向EVP的跨Guest OS进程间通信方法及系统 - Google Patents
面向EVP的跨Guest OS进程间通信方法及系统 Download PDFInfo
- Publication number
- CN107368379B CN107368379B CN201710578521.9A CN201710578521A CN107368379B CN 107368379 B CN107368379 B CN 107368379B CN 201710578521 A CN201710578521 A CN 201710578521A CN 107368379 B CN107368379 B CN 107368379B
- Authority
- CN
- China
- Prior art keywords
- evp
- ipc
- data
- guest
- address space
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/544—Buffers; Shared memory; Pipes
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/0223—User address space allocation, e.g. contiguous or non contiguous base addressing
- G06F12/023—Free address space management
- G06F12/0253—Garbage collection, i.e. reclamation of unreferenced memory
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
- G06F12/0866—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches for peripheral storage systems, e.g. disk cache
- G06F12/0871—Allocation or management of cache space
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/10—Address translation
- G06F12/1009—Address translation using page tables, e.g. page table structures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/54—Indexing scheme relating to G06F9/54
- G06F2209/543—Local
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
本发明涉及计算机虚拟化技术领域,公开了一种面向EVP的跨Guest OS进程间通信方法及系统,以采用基于共享虚拟地址空间的方式实现一种高效的跨态地址映射进程间通信机制。本发明方法包括:写进程在自身用户地址空间中分配数据发送缓冲区,向其中写入将要发送给读进程的数据;写进程通过系统调用在EVP的进程间通信缓冲区中分配缓冲区并将通信数据拷贝至所分配的缓冲区中;读进程通过系统调用在其自身用户地址空间中分配一段连续的虚拟地址空间,并计算分配给写进程的EVP缓冲区对应的物理地址空间,建立EVP缓冲区与读进程自身用户地址空间之间的映射关系,以通过访问自身用户地址空间来读取跨Guest OS写进程所发送的数据。
Description
技术领域
本发明涉及计算机虚拟化技术领域,尤其涉及一种面向EVP(Embeddedvirtualization platform,嵌入式虚拟化平台)的跨Guest OS(客户虚拟机操作系统)进程间通信方法及系统。
背景技术
虚拟化技术是一种可以将一台物理机模拟成多台虚拟机的技术。随着以移动智能终端为代表的嵌入式设备计算能力的大幅提升以及移动互联网的飞速发展,虚拟化技术慢慢地渗透到嵌入式领域,进而形成了嵌入式虚拟化技术。
嵌入式虚拟化技术通过直接在嵌入式硬件平台上部署虚拟机监控程序来为上层的操作系统及应用程序构建运行环境。虚拟机监控程序可以视为一种特殊的操作系统,它负责创建底层硬件平台的抽象,使得一个或多个虚拟机在无需感知具体硬件平台的情况下就可以正常运行。嵌入式虚拟化技术的优势是安全隔离性更强。
被业界广泛采用的嵌入式虚拟化解决方案是半虚拟化技术。半虚拟化解决方案大多数是基于微内核来构建的。微内核架构的操作系统采用一个尽量小的内核来完成操作系统最基本的核心功能,其与应用程序之间的接口与硬件平台的接口十分相近。这样既保证了操作系统的功能性,又避免了其代码过于冗长,易于保证其可信计算基础,十分适合用以构建虚拟化环境。而且基于微内核的半虚拟化解决方案具有性能损失小、资源调度灵活、资源共享高效以及安全性高等优点。
本发明所公开面向EVP的跨Guest OS进程间通信方法及系统就是基于微内核而设计的,英文中,微内核常译作:micro/kernel/micro kernel,是一种能够提供必要服务的操作系统内核;其中这些必要的服务包括任务、线程、IPC(Inter-Process Communication,交互进程通信)以及内存管理等等。所有服务(包括设备驱动)在用户模式下运行,而处理这些服务同处理其他的任何一个程序一样。因为每个服务只是在自己的地址空间运行。所以这些服务之间彼此之间都受到了保护。
传统的进程间通信机制叫做匿名管道,又被称为无名管道,其需要进行数据交互的两个进程,分别被称作写进程与读进程。写进程是进程间通信的发起者同时也是数据的生产者,读进程是数据的消费者,数据从写进程流向读进程。写进程用户地址空间中的缓冲区用于存储将要发送给读进程的数据,读进程用户地址空间中的缓冲区用于存储接收到的数据。另外利用匿名管道实现两个进程之间数据交互的设计中,一次数据传输的过程,通信双方需要多次陷入内核并进行两次数据的拷贝,一次是将数据从写进程的用户态发送缓冲区拷贝至内核管道文件中,一次是将数据从内核管道文件拷贝至读进程的用户态接收缓冲区中。本发明将改进这种低效的通信机制,采用基于共享虚拟地址空间的方式实现一种高效的跨态地址映射进程间通信机制。
发明内容
本发明目的在于公开一种面向EVP的跨Guest OS进程间通信方法及系统,以采用基于共享虚拟地址空间的方式实现一种高效的进程间通信机制。
为实现上述目的,本发明公开了一种面向EVP的跨Guest OS进程间通信方法,包括:
初始化:1、将EVP的地址空间划分为四大部分,分别为代码和数据地址空间、IO映射空间、进程间通信专用缓冲区空间和中断向量表空间;所述代码和数据地址空间存储EVP的实现代码、各种数据结构、以及映射用一级页表和相关二级页表;所述IO映射空间用于实现外设的访问;所述进程间通信专用缓冲区空间作为数据缓冲区为进程间数据传输提供服务;所述中断向量表空间存储设置好的中断向量表,用于异常、中断发生时,系统可以跳转到对应的中断处理函数处执行;2、EVP将运行权交给Guest OS,用EVP页表中特定的页表项覆盖掉Guest OS进程相应的页表条目,完成EVP与Guest OS之间的地址空间的共享;
针对“写进程”和“读进程”分属于不同Guest OS的情况,跨Guest OS进程间通信方法包括:
写进程在自身用户地址空间中分配数据发送缓冲区,向其中写入将要发送给读进程的数据;
写进程通过系统调用在EVP的进程间通信缓冲区中分配缓冲区,将通信数据从所述自身用户地址空间缓冲区中拷贝至刚分配的EVP缓冲区中;
读进程通过系统调用在其自身用户地址空间中分配一段连续的虚拟地址空间,并计算分配给写进程的EVP缓冲区对应的物理地址空间,建立所述EVP缓冲区与读进程自身用户地址空间之间的映射关系,以通过访问自身用户地址空间来读取跨Guest OS写进程所发送的数据。
与上述方法相对应的,本发明还公开一种执行上述面向EVP的跨Guest OS进程间通信方法的通信系统,包括:
所述EVP,用于:1、将地址空间划分为四大部分,分别为代码和数据地址空间、IO映射空间、进程间通信专用缓冲区空间和中断向量表空间;所述代码和数据地址空间存储EVP的实现代码、各种数据结构、以及映射用一级页表和相关二级页表;所述IO映射空间用于实现外设的访问;所述进程间通信专用缓冲区空间作为数据缓冲区为进程间数据传输提供服务;所述中断向量表空间存储设置好的中断向量表,用于异常、中断发生时,系统可以跳转到对应的中断处理函数处执行;2、EVP将运行权交给Guest OS,用EVP页表中特定的页表项覆盖掉Guest OS进程相应的页表条目,完成EVP与Guest OS之间的地址空间的共享;
针对“写进程”和“读进程”分属于不同Guest OS的情况,所述通信系统跨Guest OS进程间通信方法包括:
写进程在自身用户地址空间中分配数据发送缓冲区,向其中写入将要发送给读进程的数据;
写进程通过系统调用在EVP的进程间通信缓冲区中分配缓冲区,将通信数据从所述自身用户地址空间缓冲区中拷贝至刚分配的EVP缓冲区中;
读进程通过系统调用在其自身用户地址空间中分配一段连续的虚拟地址空间,并计算分配给写进程的EVP缓冲区对应的物理地址空间,建立所述EVP缓冲区与读进程自身用户地址空间之间的映射关系,以通过访问自身用户地址空间来读取跨Guest OS写进程所发送的数据。
本发明具有以下有益效果:
参与通信的两个进程分属于不同的Guest OS,虽然它们并不共享内核地址空间,但共享EVP地址空间,所以,本发明由EVP为实现两者之间的通信提供基础,其中,一次数据传输过程中只需一次从用户地址空间到EVP地址空间的数据拷贝,读进程可通过访问自身用户地址空间来读取写进程发送出来的数据而不需要再次拷贝数据。
进一步的,本发明除去IO映射区之外剩余的48M虚拟地址空间被线性地映射到物理地址空间的高位48M处,且该48M地址间的映射是永久的,一旦建立则存在于EVP的整个运行期间,避免了缺页异常的发生;藉此,EVP的进程间通信缓冲区采用了永久映射的方式,从而避免了临时分配虚拟空间与物理空间的开销,避免了虚拟地址与物理地址之间建立映射的开销,同时也避免了页面换入换出导致的开销。
下面将参照附图,对本发明作进一步详细的说明。
附图说明
构成本申请的一部分的附图用来提供对本发明的进一步理解,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是本发明实施例公开的进程间通信专用缓冲区空间的划分示意图;
图2为本发明实施例公开的进程间通信专用缓冲区空间对应的页表项示意图;
图3是本发明实施例公开的进程间通信专用缓冲区空间的组织方式示意图;
图4是本发明实施例公开的跨Guest OS进程间通信模式示意图;
图5是本发明实施例公开的写进程调用xevm_ipc_get的处理流程图;
图6是本发明实施例公开的读进程调用xevm_ipc_get的处理流程图
图7是本发明实施例公开的xevm_ipc_send系统调用的处理流程图;
图8是本发明实施例公开的xevm_ipc_receive系统调用的处理流程;
图9是本发明实施例公开的xevm_ipc_update系统调用的处理流程;
图10是本发明实施例公开的xevm_ipc_free系统调用的处理流程;
图11是本发明实施例公开的实验测试对比图。
具体实施方式
以下结合附图对本发明的实施例进行详细说明,但是本发明可以由权利要求限定和覆盖的多种不同方式实施。
实施例1
本实施例以Guest OS是Linux内核的操作系统为例,公开一种面向EVP的跨GuestOS进程间通信方法。
本实施例采用EVP与Guest OS共享虚拟地址空间的方式来完成两者之间的交互。要做到这一点,首先要对Guest OS内核虚拟地址空间的划分进行必要的修改,从而为EVP保留一定的地址空间,然后用EVP页表中特定的页表项覆盖掉Guest OS进程相应的页表条目。
为此,本实施例将进程虚拟地址空间的高位64M分配给EVP使用,这64M地址空间的划分如图1所示。其中,分配给EVP的64M地址空间被划分为四大部分,从低地址到高地址,分别为代码和数据空间、IO映射空间、进程间通信专用缓冲区空间和中断向量表空间,对应的大小分别为16M、16M、31M和1M。
代码和数据地址空间,主要存储EVP的实现代码和数据,数据主要包括各种数据结构、映射用一级页表和相关二级页表等。IO映射地址空间,主要用于实现外设的访问。进程间通信缓冲区地址空间,作为数据缓冲区为进程间数据传输提供服务。中断向量表地址空间,存储设置好的中断向量表,用于异常、中断发生时,系统可以跳转到对应的中断处理函数处执行。
由于ARM硬件平台上各种外设的物理地址是在硬件固定的,并且不会与NandFlash的物理地址范围冲突,所以,IO映射区的地址映射不需要在Nand Flash中分配物理页框。除去IO映射区之外剩余的48M虚拟地址空间被线性地映射到Nand Flash物理地址空间的高位48M处,这48M地址间的映射是永久的,一旦建立则存在于EVP的整个运行期间,避免了缺页异常的发生。
对于进程间通信缓冲区,由于设置1M的缓冲区单元将导致内存空间的极大浪费,所以,EVP采用4K作为缓冲区单元的大小。选取4K页面作为缓冲区分配的基本单元,这种情况下,EVP同一时刻最多支持的进程对将达到31M/4K=7936,是可以满足实际需求的。从EVP页表的角度,对于进程间通信缓冲区来说,建立永久映射之后的页表如图2所示,采用1Msections的一级页目录表和4K small pages的二级页表实现地址映射。
本实施例中,EVP为每个数据通道分配一个4K大小的页面用作缓冲区,每个页面用一个结构体virtual_page表示。
virtual_page结构体的组成包括:
其中,index指示该页面在描述整个缓冲区数组中的下标,virtual_address_start记录4K页面的虚拟起始地址,physics_address_start记录虚拟页面映射到页框的物理起始地址,struct xevm_1ist_head实现EVP中通用的双向循环链表,list用于将各个虚拟页面结构体组织成双向链表的形式,以便于管理。藉此,EVP整个大小为31M的进程间通信缓冲区以4K页面为基本单位被平分为7936份,每一份由一个virtual_page结构体表示,所以,整个缓冲区可以被组织成数组的形式,如图3所示,其中链表的表头为free_virtual_page_head。
如图4所示,本实施例面向EVP的跨Guest OS进程间通信方法包括:
S0、初始化:1、将EVP的地址空间划分为四大部分,分别为代码和数据地址空间、IO映射空间、进程间通信专用缓冲区空间和中断向量表空间;2、EVP将运行权交给Guest OS,用EVP页表中特定的页表项覆盖掉Guest OS进程相应的页表条目,完成EVP与Guest OS之间的地址空间的共享。
针对“写进程”和“读进程”分属于不同Guest OS的情况,跨Guest OS进程间通信方法包括:
S1、写进程在自身用户地址空间中分配数据发送缓冲区,向其中写入将要发送给读进程的数据。
S2、写进程通过系统调用在EVP的进程间通信缓冲区中分配缓冲区,将通信数据从所述自身用户地址空间缓冲区中拷贝至刚分配的EVP缓冲区中。
S3、读进程通过系统调用在其自身用户地址空间中分配一段连续的虚拟地址空间,并计算分配给写进程的EVP缓冲区对应的物理地址空间,建立所述EVP缓冲区与读进程自身用户地址空间之间的映射关系,以通过访问自身用户地址空间来读取跨Guest OS写进程所发送的数据。
由于上述的读进程的用户虚拟地址空间与EVP所属的物理地址空间之间建立了直接的地址映射关系,所以本实施例所公开的上述跨Guest OS模型可称为ASAM(AcrossState Address Mapping,跨态地址映射)通信模型。
为了实现不同Guest OS中两进程间的数据交互,需要为每个数据通道创建并维护一个xevm_ipc结构体(在之后的描述中,简单起见将其称之为IPC对象)。在整个进程间通信的数据交互过程中,该结构体负责管理通信相关的所有资源,控制和协调通信双方进程的数据读写操作。
xevm_ipc结构体是EVP实现跨Guest_OS进程间通信的核心数据结构,该结构体的组成包括:
针对上述IPC对象的参数说明如下:
index是一个无符号32位整数,EVP中所有的IPC对象以一维数组的形式被组织成资源池,index记录当前结构体在一维数组中的下标索引,该变量一经初始化便不再改变。变量key是一个有符号32位整数,作为IPC对象的唯一标识,相当于该结构体的名字,系统保证IPC对象key的唯一性,通信双方进程通过该变量来唯一标识其拥有的xevm_ipc资源。creater_guest_os和creater_process_id均是32位整数,creater_guest_os指明写进程所属的Guest OS,creater_process_id指明写进程在其所属Guest OS中的进程ID。由于本文所述的进程间通信涉及的双方进程隶属于不同的Guest OS,读写进程可能具有相同的进程ID,故实现中使用这二者的组合唯一地标识写进程。同理,使用reader_guest_os和reader_process_id的组合唯一地标识读进程。无符号32位整数buffer_size表示当前IPC对象管理的缓冲区大小,由上节对进程间通信缓冲区的讨论可知,对于所有的数据通道,该变量始终为4K。write_ptr和read_ptr均为无符号32位整数,分别为写指针和读指针,写指针指示缓冲区中下一个可写的字节位置,读指针指示缓冲区中下一个可读的字节位置,结合这两个变量,实现对缓冲区读写操作的控制。无符号32位整数total_bytes记录当前缓冲区中存储数据的总字节数,范围从0到4K,通过该变量判断缓冲区是处于空闲状态还是载满状态。reference_count是一个无符号32位整数,该变量指示目前正在使用该对象进行数据交互的进程数,初始值为0,通信通道成功建立之后为2,双方进程调用释放对象的系统调用时,如果该变量为0,系统则回收所有的通信资源。is_reading是一个无符号32位整数,该变量指示当前IPC对象指定的读进程是否正在进行读操作,该变量的作用将在下文真正用到的时候进行描述。
buffer是指向virtual_page结构体的指针,被当前IPC对象管理的双方进程使用该virtual_page描述的内存页面进行数据的读写。reader_user_space_address是一个无符号32位整数,存储读进程为完成跨态地址映射而在其用户空间中分配的页面的起始地址。list是EVP中实现的双向循环链表,通过该变量,IPC对象或被链接到空闲链表中,或被链接到已分配链表中。struct sem_t是EVP中实现的信号量,sem变量实现通信双方进程对缓冲区的互斥访问控制。
本实施例中,针对上述IPC对象,建立xevm_ipc_get函数供系统调用以完成相关资源的分配以及初始化。
所述xevm_ipc_get函数原型为:
int32_t xevm_ipc_get(int32_t key,uint32_t flag,uint32_t*p_user_address);
上述函数原型中,参数key是一个32位整数,EVP将其作为某个特定IPC通道的名字,需要通信的两个进程通过传递相同的key值来定位并访问同一IPC通道相关的数据结构,从而完成数据的传输。
参数flag是一个无符号32位整数,实现中定义了flag不同比特位的不同含义,参数flag的第一个比特位为1表示调用进程为写进程,第二个比特位为1表示调用进程为读进程。
参数p_user_address是一个指针变量,当调用进程为写进程时,该参数被忽略,当调用进程为读进程时,p_user_address指向的变量中存储读进程用户地址空间中被映射虚拟页面的起始地址;在跨态地址映射进程间通信模型中,读进程通过访问以该地址为起始地址的页面空间即可接收到写进程传输的数据。
函数的返回值为一个32位整数,可以用它唯一地标识一个位于EVP地址空间中的通信对象,之后的xevm_ipc_send和xevm_ipc_receive系统调用均使用该整数标识符来指定具体的通信对象。
本实施例中,写进程通过上述xevm_ipc_send系统调用进行数据的传输,该xevm_ipc_send的函数原型为:
int32_t xevm_ipc_send(int32_t key,const void*buffer,uint32_t length);
读进程通过所述xevm_ipc_receive系统调用进行数据的读取,该xevm_ipc_receive的函数原型为:
int32_t xevm_ipc_receive(int32_t key,uint32_t*read_ptr);
在上述的xevm_ipc_send和xevm_ipc_receive的函数原型中,参数key唯一标识IPC对象,由xevm_ipc_get的返回值指定;参数buffer是一个通用指针,指向写进程用户地址空间数据缓冲区中的某个单元,参数length指定将要发送数据的大小,buffer和length这两个参数一起决定了将要发送哪些数据;参数read_ptr是一个指针变量,指向读进程用户空间中的无符号32位整数,函数通过该指针将IPC对象的读指针返回给读进程。
针对上述函数原型的调用具体包括:
进程A作为数据的发送者,对xevm_ipc_get的调用为:int32_t identifier=xevm_ipc_get(specified_key,IPC_CREATE,NULL);对于写进程,系统调用xevm_ipc_get的处理流程如图5所示。
进程B作为数据的接收者,对xevm_ipc_get的调用为:int32_t identifier=xevm_ipc_get(specified_key,IPC_FIND,&user_address);对于读进程,系统调用xevm_ipc_get的处理流程如图6所示。
通信双方进程通过xevm_ipc_get系统调用完成相关资源的分配以及初始化(具体包括:完成关键数据结构的分配、初始化以及通信环境的建立)之后,写进程通过xevm_ipc_send系统调用进行数据的传输,写进程对xevm_ipc send的调用为:int32_t write_count=xevm_ipc_send(specified_key,buffer,length),处理流程如图7所示;对应地,读进程通过xevm_ipc_receive系统调用进行数据的读取,读进程对xevm_ipc_receive的调用为:int32_t read_count=xevm_ipc_receive(specified_key,&read_ptr),处理流程如图8所示。
在图8所描述的处理流程中,调用进程只有对信号量的申请操作,并没有释放它。这是因为,读进程并没有在其用户地址空间中设立独立的缓冲区,所以,xevm_ipc_receive系统调用只能将读指针和最大可读数据量返回给调用进程。同时,读进程对数据的处理发生在用户空间,内核并不知晓读进程何时处理完所读取到的数据,读进程在用户态处理数据时同样不允许写进程对通信缓冲区进行访问。为此,进一步的,本实施例为了解决该问题,实现中需要增加一个附带的系统调用。其函数原型如下:
int32_t xevm_ipc_update(int32_t key,uint32_t read_count);
其中,参数read_count传递读进程具体读取的字节数,xevm_ipc_update根据该参数调整IPC对象的读指针和total_bytes值,并释放相关的信号量;该系统调用由读进程处理完数据之后主动调用以更新IPC对象,处理流程如图9所示。
进一步的,本实施例通信双方进程完成数据交互之后,通过xevm_ipc_free系统调用回收所有的通信资源。其函数原型如下:
int32_t xevm_ipc_free(int32_t key);
其中,参数key唯一指定需要释放的IPC对象。通信双方进程对xevm_ipc_free的调用为:int32_t result=xevm_ipc_free(specified_key),图10描述了读写进程执行该系统调用时的处理流程。在处理过程中,对调用进程的权限进行了检查,只有调用进程为指定IPC对象的读进程或写进程,xevm_ipc_free才会进行近一步的处理。若为写进程,则设置IPC对象的creater_guest_os和creater_process_id为初始值,若为读进程,恢复reader_guest_os和reader_process_id为初始值的同时,xevm_ipc_free回收读进程用户地址空间中分配的虚拟页面资源。之后,对IPC对象的reference_count执行减一操作。只有在reference_count为0的情况下,系统才回收对应的IPC对象和进程间通信缓冲页等资源,这样保证了只有在有权限的读写双方进程均执行xevm_ipc_free后相关资源才被正确地回收。
综上,本实施例EVP上运行着两个客户机操作系统Guest OS 1和Guest OS 2,进程A和进程B分别运行于Guest OS 1和Guest OS 2中,例如:GuestOS 1中有个安全监测进程,作为写进程,GuestOS2中有个执行进程,作为读进程,两进程使用本实施例的ASAM通信模型实现进程间数据的交互。又例如,现有的应用软件可通过虚拟机设置分身,而借助本实施例的技术方案,可以实现微信的分身与QQ分身之间的图片、视频等内容数据的共享。
实施例2
与上述方法实施例相对应的,本实施例公开一种执行上述方法的通信系统,包括:
EVP,用于:1、将地址空间划分为四大部分,分别为代码和数据地址空间、IO映射空间、进程间通信专用缓冲区空间和中断向量表空间;所述代码和数据地址空间存储EVP的实现代码、各种数据结构、以及映射用一级页表和相关二级页表;所述IO映射空间用于实现外设的访问;所述进程间通信专用缓冲区空间作为数据缓冲区为进程间数据传输提供服务;所述中断向量表空间存储设置好的中断向量表,用于异常、中断发生时,系统可以跳转到对应的中断处理函数处执行;2、EVP将运行权交给Guest OS,用EVP页表中特定的页表项覆盖掉Guest OS进程相应的页表条目,完成EVP与Guest OS之间的地址空间的共享;然后,针对“写进程”和“读进程”分属于不同Guest OS的情况,本实施例通信系统跨Guest OS进程间通信方法具体参照上述方法实施例,不再赘述。
综上,本发明公开的面向EVP的跨Guest OS进程间通信方法及系统,参与通信的两个进程分属于不同的Guest OS,虽然它们并不共享内核地址空间,但共享EVP地址空间,所以,本发明由EVP为实现两者之间的通信提供基础,其中,一次数据传输过程中只需一次从用户地址空间到EVP地址空间的数据拷贝,读进程可通过访问自身用户地址空间来读取写进程发送出来的数据而不需要再次拷贝数据。
进一步的,本发明除去IO映射区之外剩余的48M虚拟地址空间被线性地映射到物理地址空间的高位48M处,且该48M地址间的映射是永久的,一旦建立则存在于EVP的整个运行期间,避免了缺页异常的发生;藉此,EVP的进程间通信缓冲区采用了永久映射的方式,从而避免了临时分配虚拟空间与物理空间的开销,避免了虚拟地址与物理地址之间建立映射的开销,同时也避免了页面换入换出导致的开销。
【实验测试】
为了完成测试,首先需要在PC Linux环境中完成应用程序的编写,主要包括:使用命名管道进行通信的写应用程序和读应用程序;使用本文所述通信方式进行通信的写应用程序和读应用程序。然后,使用交叉编译工具对上述的四个程序进行编译链接生成可运行于ARM上的可执行目标文件。最后,在开发板上部署EVP,并在其上运行两个Linux操作系统,在部署成功的Guest OS中通过网络文件系统获取可执行目标文件,运行并记录测试结果。其中,对命名管道进行测试时,要保证对应的两个应用程序运行于同一个Guest OS中,对本文所述的通信机制进行测试时,要保证对应的两个应用程序运行于不同的Guest OS中。
在具体的测试中,选取命名管道与本文所述进程间通信方式进行对比,通过记录完成数据传输所需的时间来计算传输速率。默认读进程对读取到的数据不进行任何逻辑处理,并且完整的数据传输从写进程发送第一个字节开始到读进程读取完最后一个字节结束。本测试中,依次使用总量为1K、2K、4K、8K、16K、32K、64K的数据对两种IPC方式进行测试,针对每种情况,记录完成数据传输的时间,并重复进行5次实验取结果的平均值,从而计算出两种IPC方式在数据量不同情况下的数据传输速率。图11描述了本项测试的结果。
如图11所示,传输量小于8192字节之前,两种IPC方式的传输速率均随传输数据量的增大而提升,但是,当传输数据量大于8192字节之后,传输速率逐渐趋于稳定,增加变得不明显。这是因为,命名管道和ASAM中,每条数据通道分配的缓冲区均为4096字节,当传输的数据量未达到4096字节时,缓冲区是充足的资源,写进程将要传输的数据会以最快的速度拷贝至缓冲区中而不需要等待空闲单元的出现,这种情况下传输速率的瓶颈不在缓冲区上面,所以,随着写进程数据传输量的增加传输速率也相应提升。但是,当写进程的传输数据量大于8192字节之后,缓冲区成为紧张的资源,其利用率将达到百分之百,这种情况下,写进程每写入4096个字节就必须等待读进程接受数据腾出缓冲区空间之后再继续进行写操作,从而导致传输速率增加的不明显。
对于某个固定的传输数据量来说,ASAM的传输速率优于命名管道,这是由几方面原因造成的。第一,命名管道的创建过程需要内核动态地分配相关数据结构和通信缓冲区等资源,而ASAM采用预分配资源池的形式提供所有通信资源,所以单单创建过程,ASAM就比命名管道快;第二,命名管道在使用通信缓冲区等资源时,可能会导致缺页中断,缺页中断处理程序将花费大量的时间在物理页框的分配、相关页表的创建、虚拟地址与物理地址映射的建立及页面换入换出等操作上,而ASAM对所有通信缓冲区提前建立好永久映射,根本不会引发缺页异常;第三,命名管道对于每个需要传输的字节都需要进行两次拷贝,而ASAM只需进行一次数据拷贝操作。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (8)
1.一种面向EVP的跨Guest OS进程间通信方法,其特征在于,包括:
初始化:1、将EVP的地址空间划分为四大部分,分别为代码和数据地址空间、IO映射空间、进程间通信专用缓冲区空间和中断向量表空间;所述代码和数据地址空间存储EVP的实现代码、各种数据结构、以及映射用一级页表和相关二级页表;所述IO映射空间用于实现外设的访问;所述进程间通信专用缓冲区空间作为数据缓冲区为进程间数据传输提供服务;所述中断向量表空间存储设置好的中断向量表,用于异常、中断发生时,系统可以跳转到对应的中断处理函数处执行;2、EVP将运行权交给Guest OS,用EVP页表中特定的页表项覆盖掉Guest OS进程相应的页表条目,完成EVP与Guest OS之间的地址空间的共享;
针对“写进程”和“读进程”分属于不同Guest OS的情况,跨Guest OS进程间通信方法包括:
写进程在自身用户地址空间中分配数据发送缓冲区,向其中写入将要发送给读进程的数据;
写进程通过系统调用在EVP的进程间通信缓冲区中分配缓冲区,将通信数据从所述自身用户地址空间缓冲区中拷贝至刚分配的EVP缓冲区中;
读进程通过系统调用在其自身用户地址空间中分配一段连续的虚拟地址空间,并计算分配给写进程的EVP缓冲区对应的物理地址空间,建立所述EVP缓冲区与读进程自身用户地址空间之间的映射关系,以通过访问自身用户地址空间来读取跨Guest OS写进程所发送的数据。
2.根据权利要求1所述的面向EVP的跨Guest OS进程间通信方法,其特征在于,在通过访问自身用户地址空间来读取跨Guest OS写进程所发送的数据的过程中,还包括:
为每个数据通道创建并维护一个IPC对象,以在整个跨Guest OS进程间通信的数据交互过程中,负责管理通信相关的所有资源,控制和协调通信双方进程的数据读写操作。
3.根据权利要求2所述的面向EVP的跨Guest OS进程间通信方法,其特征在于,所述IPC对象的数据结构如下:
其中,index是一个无符号32位整数,EVP中所有的IPC对象以一维数组的形式被组织成资源池,index记录当前结构体在一维数组中的下标索引,该变量一经初始化便不再改变;
变量key是一个有符号32位整数,作为IPC对象的唯一标识,相当于该结构体的名字,系统保证IPC对象key的唯一性,通信双方进程通过该变量来唯一标识其拥有的xevm_ipc资源;
creater_guest_os和creater_process_id均是32位整数,creater_guest_os指明写进程所属的Guest OS,creater_process_id指明写进程在所属Guest OS中的进程ID;
使用reader_guest_os指明读进程所属的Guest OS,reader_process_id指明读进程在所属Guest OS中的进程ID;
无符号32位整数buffer_size表示当前IPC对象管理的缓冲区大小;
write_ptr和read_ptr均为无符号32位整数,分别为写指针和读指针,写指针指示缓冲区中下一个可写的字节位置,读指针指示缓冲区中下一个可读的字节位置,结合这两个变量,实现对缓冲区读写操作的控制;
无符号32位整数total_bytes记录当前缓冲区中存储数据的总字节数,通过该变量判断缓冲区是处于空闲状态还是载满状态;
reference_count是一个无符号32位整数,该变量指示目前正在使用该对象进行数据交互的进程数,初始值为0,通信通道成功建立之后为2,双方进程调用释放对象的系统调用时,如果该变量为0,系统则回收所有的通信资源;
is_reading是一个无符号32位整数,该变量指示当前IPC对象指定的读进程是否正在进行读操作;
buffer是指向virtual_page结构体的指针,被当前IPC对象管理的双方进程使用该virtual_page描述的内存页面进行数据的读写;
reader_user_space_address是一个无符号32位整数,存储读进程为完成跨态地址映射而在其用户空间中分配的页面的起始地址;
list是EVP中实现的双向循环链表,通过该变量,IPC对象或被链接到空闲链表中,或被链接到已分配链表中;
struct sem_t是EVP中实现的信号量,sem变量实现通信双方进程对缓冲区的互斥访问控制。
4.根据权利要求3所述的面向EVP的跨Guest OS进程间通信方法,其特征在于,还包括针对所述IPC对象,建立xevm_ipc_get函数供系统调用以完成相关资源的分配以及初始化;
所述xevm_ipc_get函数原型为:
int32_t xevm_ipc_get(int32_t key,uint32_t flag,uint32_t*p_user_address);
参数key是一个32位整数,EVP将其作为某个特定IPC通道的名字,需要通信的两个进程通过传递相同的key值来定位并访问同一IPC通道相关的数据结构,从而完成数据的传输;
参数flag是一个无符号32位整数,实现中定义了flag不同比特位的不同含义,参数flag的第一个比特位为1表示调用进程为写进程,第二个比特位为1表示调用进程为读进程;
参数p_user_address是一个指针变量,当调用进程为写进程时,该参数被忽略,当调用进程为读进程时,p_user_address指向的变量中存储读进程用户地址空间中被映射虚拟页面的起始地址;在跨态地址映射进程间通信模型中,读进程通过访问以该地址为起始地址的页面空间即可接收到写进程传输的数据;
函数的返回值为一个32位整数,可以用它唯一地标识一个位于EVP地址空间中的通信对象,之后的xevm_ipc_send和xevm_ipc_receive系统调用均使用该整数标识符来指定具体的通信对象;
写进程通过所述xevm_ipc_send系统调用进行数据的传输,所述xevm_ipc_send的函数原型为:
int32_t xevm_ipc_send(int32_t key,const void*buffer,uint32_t length);
读进程通过所述xevm_ipc_receive系统调用进行数据的读取,所述xevm_ipc_receive的函数原型为:
int32_t xevm_ipc_receive(int32_t key,uint32_t*read_ptr);
在xevm_ipc_send和xevm_ipc_receive的函数原型中,参数key唯一标识IPC对象,由xevm_ipc_get的返回值指定;参数buffer是一个通用指针,指向写进程用户地址空间数据缓冲区中的某个单元,参数length指定将要发送数据的大小,buffer和length这两个参数一起决定了将要发送哪些数据;参数read_ptr是一个指针变量,指向读进程用户空间中的无符号32位整数,函数通过该指针将IPC对象的读指针返回给读进程。
5.根据权利要求4所述的面向EVP的跨Guest OS进程间通信方法,其特征在于,还包括:
建立附带的系统调用函数原型为:
int32_t xevm_ipc_update(int32_t key,uint32_t read_count);
参数read_count传递读进程具体读取的字节数,xevm_ipc_update根据该参数调整IPC对象的读指针和total_bytes值,并释放相关的信号量;该系统调用由读进程处理完数据之后主动调用以更新IPC对象;以及
通信双方进程完成数据交互之后,通过xevm_ipc_free系统调用回收所有的通信资源;其中xevm_ipc_free函数原型为:
int32_t xevm_ipc_free(int32_t key);
参数key唯一指定需要释放的IPC对象。
6.根据权利要求1至5任一所述的面向EVP的跨Guest OS进程间通信方法,其特征在于,分配给EVP的虚拟地址空间为64M,从低地址到高地址,分别为代码和数据空间、IO映射空间、进程间通信专用缓冲区空间和中断向量表空间,对应的大小分别为16M、16M、31M和1M;而且将EVP整个大小为31M的进程间通信缓冲区以4K页面为基本单位被平分为7936份,每一份由一个virtual_page结构体表示,整个缓冲区可以被组织成数组的形式;
其中,所述virtual_page结构体的组成包括:
其中,index指示该页面在描述整个缓冲区数组中的下标,virtual_address_start记录4K页面的虚拟起始地址,physics_address_start记录虚拟页面映射到页框的物理起始地址,struct xevm_list_head实现EVP中通用的双向循环链表,list用于将各个虚拟页面结构体组织成双向链表的形式,以便于管理。
7.根据权利要求6所述的面向EVP的跨Guest OS进程间通信方法,其特征在于,除去IO映射区之外剩余的48M虚拟地址空间被线性地映射到物理地址空间的高位48M处,且该48M地址间的映射是永久的,一旦建立则存在于EVP的整个运行期间,避免了缺页异常的发生。
8.一种用于执行如权利要求1至7任一所述面向EVP的跨Guest OS进程间通信方法的通信系统,其特征在于,包括:
所述EVP,用于:1、将地址空间划分为四大部分,分别为代码和数据地址空间、IO映射空间、进程间通信专用缓冲区空间和中断向量表空间;所述代码和数据地址空间存储EVP的实现代码、各种数据结构、以及映射用一级页表和相关二级页表;所述IO映射空间用于实现外设的访问;所述进程间通信专用缓冲区空间作为数据缓冲区为进程间数据传输提供服务;所述中断向量表空间存储设置好的中断向量表,用于异常、中断发生时,系统可以跳转到对应的中断处理函数处执行;2、EVP将运行权交给Guest OS,用EVP页表中特定的页表项覆盖掉Guest OS进程相应的页表条目,完成EVP与Guest OS之间的地址空间的共享;
针对“写进程”和“读进程”分属于不同Guest OS的情况,所述通信系统跨Guest OS进程间通信方法包括:
写进程在自身用户地址空间中分配数据发送缓冲区,向其中写入将要发送给读进程的数据;
写进程通过系统调用在EVP的进程间通信缓冲区中分配缓冲区,将通信数据从所述自身用户地址空间缓冲区中拷贝至刚分配的EVP缓冲区中;
读进程通过系统调用在其自身用户地址空间中分配一段连续的虚拟地址空间,并计算分配给写进程的EVP缓冲区对应的物理地址空间,建立所述EVP缓冲区与读进程自身用户地址空间之间的映射关系,以通过访问自身用户地址空间来读取跨Guest OS写进程所发送的数据。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710578521.9A CN107368379B (zh) | 2017-07-14 | 2017-07-14 | 面向EVP的跨Guest OS进程间通信方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201710578521.9A CN107368379B (zh) | 2017-07-14 | 2017-07-14 | 面向EVP的跨Guest OS进程间通信方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN107368379A CN107368379A (zh) | 2017-11-21 |
CN107368379B true CN107368379B (zh) | 2020-07-10 |
Family
ID=60307414
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201710578521.9A Active CN107368379B (zh) | 2017-07-14 | 2017-07-14 | 面向EVP的跨Guest OS进程间通信方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107368379B (zh) |
Families Citing this family (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110691002B (zh) * | 2018-07-05 | 2021-07-23 | 武汉斗鱼网络科技有限公司 | 一种中断检测方法及装置 |
CN109522111B (zh) * | 2018-11-29 | 2023-03-10 | 北京元心科技有限公司 | 异构生态系统的调用方法、装置、电子设备及存储介质 |
CN109756704A (zh) * | 2018-11-30 | 2019-05-14 | 安徽清新互联信息科技有限公司 | 一种嵌入式音视频监控系统的进程间通信方法及系统 |
CN109933441B (zh) * | 2019-02-28 | 2020-11-17 | 上海交通大学 | 微内核进程间通讯方法和系统 |
CN114945009B (zh) * | 2022-02-24 | 2023-04-25 | 摩尔线程智能科技(北京)有限责任公司 | PCIe总线连接的设备间进行通信的方法、设备及系统 |
CN116225745B (zh) * | 2023-05-04 | 2023-07-21 | 北京万维盈创科技发展有限公司 | 一种基于Linux的多进程间通信方法及系统 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101594309A (zh) * | 2009-06-30 | 2009-12-02 | 华为技术有限公司 | 集群系统中内存资源的管理方法、设备及网络系统 |
CN101808141A (zh) * | 2010-04-19 | 2010-08-18 | 浙江大学 | 一种基于虚拟化平台的宿主客户机协同换页的方法 |
CN102567217A (zh) * | 2012-01-04 | 2012-07-11 | 北京航空航天大学 | 一种面向mips平台的内存虚拟化方法 |
CN103077120A (zh) * | 2012-12-31 | 2013-05-01 | 东软集团股份有限公司 | 程序共享内存的地址转换方法和装置 |
CN105677879A (zh) * | 2016-01-12 | 2016-06-15 | 诸葛晴凤 | 内存关系数据库的数据组织及访问方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8275971B2 (en) * | 2008-08-27 | 2012-09-25 | International Business Machines Corporation | Method and apparatus for managing software controlled cache of translating the physical memory access of a virtual machine between different levels of translation entities |
-
2017
- 2017-07-14 CN CN201710578521.9A patent/CN107368379B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101594309A (zh) * | 2009-06-30 | 2009-12-02 | 华为技术有限公司 | 集群系统中内存资源的管理方法、设备及网络系统 |
CN101808141A (zh) * | 2010-04-19 | 2010-08-18 | 浙江大学 | 一种基于虚拟化平台的宿主客户机协同换页的方法 |
CN102567217A (zh) * | 2012-01-04 | 2012-07-11 | 北京航空航天大学 | 一种面向mips平台的内存虚拟化方法 |
CN103077120A (zh) * | 2012-12-31 | 2013-05-01 | 东软集团股份有限公司 | 程序共享内存的地址转换方法和装置 |
CN105677879A (zh) * | 2016-01-12 | 2016-06-15 | 诸葛晴凤 | 内存关系数据库的数据组织及访问方法 |
Also Published As
Publication number | Publication date |
---|---|
CN107368379A (zh) | 2017-11-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107368379B (zh) | 面向EVP的跨Guest OS进程间通信方法及系统 | |
Chen et al. | Enabling FPGAs in the cloud | |
CN109933441B (zh) | 微内核进程间通讯方法和系统 | |
US9619270B2 (en) | Remote-direct-memory-access-based virtual machine live migration | |
US10176007B2 (en) | Guest code emulation by virtual machine function | |
US5303378A (en) | Reentrant protected mode kernel using virtual 8086 mode interrupt service routines | |
Nilsen et al. | Issues in the design and implementation of efficient interfaces between hard and soft real-time Java components | |
US10452580B2 (en) | Method and system for providing remote direct memory access to virtual machines | |
WO2018119952A1 (zh) | 一种设备虚拟化方法、装置、系统及电子设备、计算机程序产品 | |
US9176713B2 (en) | Method, apparatus and program storage device that provides a user mode device interface | |
CN112035272A (zh) | 进程间通信的方法、装置以及计算机设备 | |
CN114064302B (zh) | 一种进程间通信的方法及装置 | |
CN114327777B (zh) | 确定全局页目录的方法、装置、电子设备及存储介质 | |
EP4170492A1 (en) | System and interrupt processing method | |
CN102521015A (zh) | 嵌入式平台下的设备虚拟化方法 | |
CN109408226A (zh) | 数据处理方法、装置及终端设备 | |
CN114816665B (zh) | 混合编排系统及超融合架构下虚拟机容器资源混合编排方法 | |
Miliadis et al. | VenOS: A Virtualization Framework for Multiple Tenant Accommodation on Reconfigurable Platforms | |
Krishnaveni et al. | Comparing and evaluating the performance of inter process communication models in Linux environment | |
Schaelicke | Architectural support for user-level input/output | |
US11689621B2 (en) | Computing device and storage card | |
US20200293350A1 (en) | Apparatus for forwarding a mediated request to processing circuitry in response to a configuration request | |
Gupta et al. | Operating system | |
CN117762560A (zh) | 一种lpi中断虚拟化方法、装置、操作系统及存储介质 | |
CN114281749A (zh) | 实现序列化及反序列化树数据的装置、方法和存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |