CN114356598A - Linux内核态与用户态的数据交互方法及装置 - Google Patents

Linux内核态与用户态的数据交互方法及装置 Download PDF

Info

Publication number
CN114356598A
CN114356598A CN202111643026.4A CN202111643026A CN114356598A CN 114356598 A CN114356598 A CN 114356598A CN 202111643026 A CN202111643026 A CN 202111643026A CN 114356598 A CN114356598 A CN 114356598A
Authority
CN
China
Prior art keywords
mode
data
target
physical address
program
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.)
Pending
Application number
CN202111643026.4A
Other languages
English (en)
Inventor
刘刚
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Shandong Inspur Scientific Research Institute Co Ltd
Original Assignee
Shandong Inspur Scientific Research Institute Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Shandong Inspur Scientific Research Institute Co Ltd filed Critical Shandong Inspur Scientific Research Institute Co Ltd
Priority to CN202111643026.4A priority Critical patent/CN114356598A/zh
Publication of CN114356598A publication Critical patent/CN114356598A/zh
Pending legal-status Critical Current

Links

Images

Landscapes

  • Memory System Of A Hierarchy Structure (AREA)

Abstract

本发明提供一种Linux内核态与用户态的数据交互方法及装置,其中,该方法包括:接收第一目标程序的读操作;读操作,用于读取第一虚拟地址的数据;响应于读操作,从第一虚拟地址对应的环形缓冲队列中的目标物理地址读取数据;其中,目标物理地址的数据,是基于第二目标程序对第二虚拟地址的写操作写入的;第二虚拟地址与目标物理地址对应;在第一目标程序来自内核态的情况下,第二目标程序来自用户态;在第一目标程序来自用户态的情况下,第二目标程序来自内核态。本发明提供的Linux内核态与用户态的数据交互方法及装置,以共享内存为数据载体,以环形队列完成交互控制,能实现零拷贝、高效易用的、真正的内核态与用户态间的数据交互。

Description

Linux内核态与用户态的数据交互方法及装置
技术领域
本发明涉及计算机技术领域,尤其涉及一种Linux内核态与用户态的数据交互方法及装置。
背景技术
Linux操作***是一款操作***,它将各子***包含在内核中,并为所有进程提供服务。为了保护子***的安全,Linux将进程空间划分为用户态和内核态两部分,并且相互隔离。
为了更好的协调内核态程序与用户态程序运行,需要一套高效易用的内核态与用户态的数据交互方法。为了应对内核态与用户态间的通信需求,Linux***主要提供如下几种方法:(1)基于内核启动参数和模块启动参数;(2)基于接口sysfs和procfs;(3)***调用;(4)基于Netlink机制;(5)共享内存。
其中,共享内存的方法是一种零拷贝的通信方法,该方法允许用户态程序直接访问内核态内存,可以直接通过内存地址访问数据,因而可以取得最好的传输效率。但由于共享内存本身仅仅是提供了一段双方程序都可以访问的内存空间,并不能真正完成内核态与用户态的数据交互工作。因此,如何实现内核态与用户态的数据交互是本领域亟待解决的技术课题。
发明内容
本发明提供一种Linux内核态与用户态的数据交互方法及装置,用以解决现有技术中的无法实现Linux内核态与用户态的数据交互的缺陷,实现Linux内核态与用户态的数据交互。
本发明提供一种Linux内核态与用户态的数据交互方法,包括:
接收第一目标程序的读操作;所述读操作,用于读取第一虚拟地址的数据;
响应于所述读操作,从所述第一虚拟地址对应的环形缓冲队列中的目标物理地址读取数据;
其中,所述目标物理地址的数据,是基于第二目标程序对第二虚拟地址的写操作写入的;所述第二虚拟地址与所述目标物理地址对应;在所述第一目标程序来自内核态的情况下,所述第二目标程序来自用户态;在所述第一目标程序来自用户态的情况下,所述第二目标程序来自内核态。
根据本发明提供的一种Linux内核态与用户态的数据交互方法,所述接收第一目标程序的读操作之前,还包括:
接收所述第二目标程序的写操作;所述写操作,用于向所述第二虚拟地址写入数据;
响应于所述写操作,将所述数据写入所述目标物理地址。
根据本发明提供的一种Linux内核态与用户态的数据交互方法,所述接收所述第二目标程序的写操作之前,还包括:
在目标态下基于共享内存的物理地址,创建所述环形缓冲队列。
根据本发明提供的一种Linux内核态与用户态的数据交互方法,所述在目标态下基于共享内存的物理地址,创建所述环形缓冲队列之前,还包括:
在目标态下基于内存分配函数,申请所述共享内存,获取所述共享内存的物理地址;
其中,所述共享内存的物理地址连续。
根据本发明提供的一种Linux内核态与用户态的数据交互方法,在目标态下基于共享内存的物理地址,创建所述环形缓冲队列,具体包括:
基于内存映射文件的方法,获取所述共享内存的物理地址对应的虚拟地址;
基于所述共享内存的物理地址对应的虚拟地址,创建所述环形缓冲队列。
本发明还提供一种Linux内核态与用户态的数据交互装置,包括:
第一接收模块,用于接收第一目标程序的读操作;所述读操作,用于读取第一虚拟地址的数据;
数据读取单元,用于响应于所述读操作,从所述第一虚拟地址对应的环形缓冲队列中的目标物理地址读取数据;
其中,所述目标物理地址的数据,是基于第二目标程序对第二虚拟地址的写操作写入的;所述第二虚拟地址与所述目标物理地址对应;在所述第一目标程序来自内核态的情况下,所述第二目标程序来自用户态;在所述第一目标程序来自用户态的情况下,所述第二目标程序来自内核态。
根据本发明提供的一种Linux内核态与用户态的数据交互装置,还包括:
第二接收模块,用于接收所述第二目标程序的写操作;所述写操作,用于向所述第二虚拟地址写入数据;
数据写入单元,用于响应于所述写操作,将所述数据写入所述目标物理地址。
本发明还提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现如上述任一种所述Linux内核态与用户态的数据交互方法的步骤。
本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如上述任一种所述Linux内核态与用户态的数据交互方法的步骤。
本发明还提供一种计算机程序产品,包括计算机程序,所述计算机程序被处理器执行时实现如上述任一种所述Linux内核态与用户态的数据交互方法的步骤。
本发明提供的Linux内核态与用户态的数据交互方法及装置,通过公用一块共享内存及环形缓冲队列,环形缓冲队列的头尾指针和结构体对于内核态和用户态均是同样的地址空间,以共享内存作为数据载体,以环形队列完成交互控制,能实现零拷贝的、高效易用的、真正的内核态与用户态间的数据交互,能在内核态和用户态之间一次性传输大量数据,能有效地提高内核态与用户态程序间的通信效率和每次交互的数据量。并且,为数据传输及应用程序提供一套通用、简单、易用的读写接口,能极大地丰富软件***架构的多样性以及适应低时延下复杂的应用场景的能力,具有很好的推广应用价值。
附图说明
为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明提供的Linux内核态与用户态的数据交互方法的流程示意图;
图2是本发明提供的Linux内核态与用户态的数据交互方法的原理示意图;
图3是本发明提供的Linux内核态与用户态的数据交互装置的结构示意图;
图4是本发明提供的电子设备的结构示意图。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
在本发明实施例的描述中,术语“第一”、“第二”、“第三”仅用于描述目的,而不能理解为指示或暗示相对重要性,且不涉及顺序。
在本发明实施例的描述中,需要说明的是,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本发明实施例中的具体含义。
为了便于对本发明各实施例的理解,下面先对传统的集中Linux内核态与用户态的通信方法进行说明。
(1)基于内核启动参数和模块启动参数。
内核程序可以直接编译到内核***中,也可以编译成一个单独的内核模块,内核启动参数和模块启动参数分别对应上述两种不同的情况。这两种方法都是在程序中声明一个参数,在启动时传递该参数。
基于内核启动参数和模块启动参数的方法只能传递一次数据,也并不能算作真正意义上的数据交互。基于内核启动参数和模块启动参数的方法传递数据最少,使用难度最低,适用于某些初始化的任务而不是数据交互。
(2)基于接口sysfs和procfs。
接口sysfs和procfs作为Linux提供的一套接口,可以方便的将内核态的某些数据通过文件的方式暴露给用户态。其中sysfs接口是将内核程序中相应的kobject对象暴露在sys文件***下,而procfs接口则需要在内核态新建一个proc设备文件,并重写其read和write方法。
这种方法使用了特殊的文件***,因而适合内核参数的展示,但展示的数据量较小,存在一定的文件权限问题,而且文件通常被设为只读,不利于数据交互。
(3)***调用。
Linux在内核态提供了两个函数可以直接操作用户态的内存,写处理函数copy_to_user和读处理函数copy_from_user。以copy_to_user为例,该方法有两个参数,一个是内核态指针,另一个是用户态指针。
该方法借用设备驱动,一般使用ioctl函数传递数据,但都是由用户态主动向内核态写入和读取数据。
(4)基于Netlink机制。
Netlink机制赋予了内核态使用套接字(socket)与用户态进行通信的能力。Socket作为用户态程序中常用的IPC方法之一,有着显著的优势。用户态程序对于使用socket通信有着大量的研究,使用范围也非常广泛。
该方法模拟socket的链接,有着最为统一的接口,但是速度较慢。
(5)共享内存。
共享内存方法的速度最快,但使用难度较大,且只是提供了一块内核态用户态程序都可以读写的内存,并不能真正完成内核态用户态的交互工作,且并未提供相应的传输控制和安全保证。
综上,对于某些需要快速安全的在内核态与用户态间交互数据的应用场景,以上几种方法或传输数据量太小,或传输速度较慢,或需要实现复杂(例如需要用户态轮询或者频繁进行用户态与内核态的切换)等,各有缺点,因而无法满足要求。
下面结合图1至图3描述本发明提供的Linux内核态与用户态的数据交互方法及装置。
图1是本申请提供的Linux内核态与用户态的数据交互方法的流程示意图。下面结合图1描述本申请实施例的Linux内核态与用户态的数据交互方法。如图1所示,该方法包括:步骤101和步骤102。
具体地,本发明实施例提供的Linux内核态与用户态的数据交互方法的执行主体为Linux内核态与用户态的数据交互装置。该数据交互方法可以应用于安装有基于Linux内核的操作***(例如Android***或Linux***等)的电子设备。上述电子设备可以为智能手机、平板电脑、笔记本电脑或服务器等。该Linux内核态与用户态的数据交互装置可以为上述安装有基于Linux内核的操作***的电子设备。
步骤101、接收第一目标程序的读操作;读操作,用于读取第一虚拟地址的数据。
其中,目标物理地址的数据,是基于第二目标程序对第二虚拟地址的写操作写入的;第二虚拟地址与目标物理地址对应;在第一目标程序来自内核态的情况下,第二目标程序来自用户态;在第一目标程序来自用户态的情况下,第二目标程序来自内核态。
具体地,步骤101之前,第二目标程序向与第二虚拟地址对应的目标物理地址中写入了数据,该数据可以为首次写入第二虚拟地址的数据,也可以为第二目标程序修改该第二虚拟地址中原有数据后的数据,本发明实施例不作具体限定。
目标物理地址是共享内存的物理地址范围内的一个或一段物理地址。共享内存可以是物理地址连续的一块物理内存。该共享内存分别与内核态和用户态进行地址映射,使得共享内存的每一个物理地址分别与内核态的一个虚拟地址和用户态的一个虚拟地址对应。
第一目标程序运行时,生成一读操作。该读操作用于从第一虚拟地址读取数据。第一目标程序向内核(指Linux内核态与用户态的数据交互装置的内核)发送该读操作,内核可以接收该读操作。
步骤102、响应于读操作,从第一虚拟地址对应的环形缓冲队列中的目标物理地址读取数据。
具体地,由于第一虚拟地址和第二虚拟地址对应的物理地址相同,均为目标物理地址,内核响应读操作,可以通过地址映射来访问共享内存的物理地址,Linux内核态与用户态的数据交互装置实际从该目标物理地址读取数据,相当于读取了第一虚拟地址的数据。
需要说明的是,步骤101之前基于共享内存创建了环形缓冲队列,共享内存的物理地址范围均在该环形缓冲队列中。环形缓冲队列的头尾指针和结构体对于内核态和用户态均是同样的地址空间。
如图2所示,通过在内核中申请一块物理内存做用户态和内核态的共享内存,第一目标程序可以通过映射的虚拟地址对该共享内存进行读写操作(图2中以来用户态程序读写为例);第二目标程序同时也可以通过内核中映射的物理内存的虚拟地址对该共享内存进行读写操作(相应地,图2中以来内核态程序读写为例);该共享内存设计为环形缓存,有头尾指针来维护当前读写的位置。图2中采用相同图形填充的两个圆角矩形框,表示地址实际是同一块物理地址。
在本发明实施例中,内核可以通过地址映射来访问共享内存的物理地址。除此之外,共享内存还可以存在其他的实现方式,本发明实施例不作具体限定。
示例性地,实现环形缓冲队列的基本功能的一段代码如下:
Figure BDA0003443977500000081
Figure BDA0003443977500000091
Figure BDA0003443977500000101
本发明实施例提供的Linux内核态与用户态的数据交互方法,在第一目标程序来自内核态且第二目标程序来自用户态的情况下,可以实现内核态的数据写入环形缓冲队列,用户态读取该数据;反之,在第一目标程序来自用户态且第二目标程序来自内核态的情况下,也可以实现态用户的数据写入环形缓冲队列,内核态读取该数据。
本发明实施例通过公用一块共享内存及环形缓冲队列,环形缓冲队列的头尾指针和结构体对于内核态和用户态均是同样的地址空间,以共享内存作为数据载体,以环形队列完成交互控制,能实现零拷贝的、高效易用的、真正的内核态与用户态间的数据交互,能在内核态和用户态之间一次性传输大量数据,能有效地提高内核态与用户态程序间的通信效率和每次交互的数据量。并且,为数据传输及应用程序提供一套通用、简单、易用的读写接口,能极大地丰富软件***架构的多样性以及适应低时延下复杂的应用场景的能力,具有很好的推广应用价值。
基于上述任一实施例的内容,接收第一目标程序的读操作之前,还包括:接收第二目标程序的写操作;写操作,用于向第二虚拟地址写入数据。
具体地,步骤101之前,第二目标程序运行时,生成一写操作。该写操作用于向第二虚拟地址写入数据。第二目标程序向内核(指Linux内核态与用户态的数据交互装置的内核)发送该写操作,内核可以接收该写操作。
响应于写操作,将数据写入目标物理地址。
具体地,内核响应读操作,可以通过地址映射来访问共享内存的物理地址,Linux内核态与用户态的数据交互装置实际向该目标物理地址写入数据,相当于向第二虚拟地址写入的数据。
本发明实施例通过公用一块共享内存及环形缓冲队列,环形缓冲队列的头尾指针和结构体对于内核态和用户态均是同样的地址空间,以共享内存作为数据载体,以环形队列完成交互控制,能实现零拷贝的、高效易用的、真正的内核态与用户态间的数据交互,能在内核态和用户态之间一次性传输大量数据,能有效地提高内核态与用户态程序间的通信效率和每次交互的数据量。并且,为数据传输及应用程序提供一套通用、简单、易用的读写接口,能极大地丰富软件***架构的多样性以及适应低时延下复杂的应用场景的能力,具有很好的推广应用价值。
基于上述任一实施例的内容,接收第二目标程序的写操作之前,还包括:在目标态下基于共享内存的物理地址,创建环形缓冲队列。
具体地,由于共享内存可以是物理地址连续的一块物理内存,在接收第二目标程序的写操作之前,可以在目标态下,基于已申请的共享内存的物理地址,创建环形缓冲队列。
环形缓冲队列,是一种环形队列。环形队列可以使用数组实现,也可以使用循环链表实现。
环形队列可以避免假溢出现象(由于入队和出队的操作,头尾指针只增加不减少,致使被删元素的空间永远无法重新利用,当队列继续存储元素时,出现尾指针已经到达了队列尾,而实际头指针前面并未满的情况),可以将队列空间充分重复利用。
环形队列采用首尾相连的FIFO的数据结构,采用数据的线性空间,数据组织简单,能快速知道队列是否满/空,可以广泛用于不同程序间的数据交换。
本发明实施例中,内存上并没有环形的结构,因此,环形缓冲队列实际上可以基于数组的线性空间来实现。创建环形缓冲队列之后,利用环形队列的特性,基于环形缓冲队列的读写方式,可以实现对内核态与用户态的数据交互进行传输控制和安全控制。
本发明实施例通过创建环形缓冲队列,从而能环形缓冲队列基于实现对内核态与用户态的数据交互进行传输控制和安全控制,能保证数据交互的安全性。
基于上述任一实施例的内容,在目标态下基于共享内存的物理地址,创建环形缓冲队列之前,还包括:在目标态下基于内存分配函数,申请共享内存,获取共享内存的物理地址;其中,共享内存的物理地址连续。
具体地,创建环形缓冲队列之前,可以在目标态下,基于内存分配函数申请共享内存。
目标态,指第二目标程序来自的态。在第二目标程序来自用户态的情况下,目标态为用户态;在第二目标程序来自内核态的情况下,目标态为内核态。
Linux内核中常见内存分配函数包括__get_free_pages、kmem_cache_alloc、kmalloc、vmalloc、dma_alloc_coherent、ioremap和alloc_bootmem等。
优选地,可以通过_get_free_pages()函数申请物理地址连续的一块物理内存,作为共享内存。
__get_free_pages()函数是页面分配器提供给调用者的最底层的内存分配函数,它申请的内存是连续的物理内存。
__get_free_page()函数申请的内存是一整页,一页的大小一般是128K。依次,__get_free_pages()函数适用于分配较大量的连续物理内存。
__get_free_page()函数分配的是连续的物理内存,处理的是连续的物理地址,但是返回的是虚拟地址(线性地址)。__get_free_pages()函数申请的内存位于物理内存的映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因此存在简单的线性关系。若要得到正确的物理地址,可以通过使用virt_to_phys()函数可进行转换,即通过virt_to_phys()函数将该块物理内存虚地址转换为物理地址,从而得到共享内存的物理地址。
通过__get_free_page()函数实现的基于页的分配策略的优点实际不在速度上,而在于更有效的使用内存;按页分配不会浪费内存空间,而kmalloc函数则会因分配力度的原因而浪费一定数量的内存;并且当分配的页面完全属于用户时,可以通过适当的调整页表将它们合并成一个线性区域,例如允许用户进程对这些单一互不相关的内存区域进行mmap。
示例性地,在目标态下申请物理地址连续的一块物理内存的代码如下:
Figure BDA0003443977500000131
Figure BDA0003443977500000141
本发明实施例在目标态下基于内存分配函数,申请共享内存,以共享内存作为数据载体,从而能基于共享内存实现内核态与用户态的数据交互过程的零拷贝,实现内核态与用户态之间数据更高效易用的交互。
基于上述任一实施例的内容,在目标态下基于共享内存的物理地址,创建环形缓冲队列,具体包括:基于内存映射文件的方法,获取共享内存的物理地址对应的虚拟地址。
具体地,可以在目标态下通过mmap函数等内存映射文件的方法,对共享内存的物理地址进行映射,得到共享内存的物理地址对应的虚拟地址。
Mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而***会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等***调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。
Mmap可以将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。mmap在用户空间映射调用***中作用很大。
基于共享内存的物理地址对应的虚拟地址,创建环形缓冲队列。
具体地,可以在目标态下使用数组或者循环链表等,根据共享内存的物理地址对应的虚拟地址,创建环形缓冲队列。
需要说明的是,对于非目标态,无需创建环形缓冲队列,只需获知目标态维护的环形缓冲队列的数据结构体地址和数据结构即可。即目标态下创建环形缓冲队列之后,将该环形缓冲队列的数据结构体地址和数据结构发送给非目标态。
可以理解的是,在目标态为用户态的情况下,非目标态为内核态;在目标态为内核态的情况下,非目标态为用户态。
本发明实施例通过内存映射文件的方法,获取共享内存的物理地址对应的虚拟地址,基于共享内存的物理地址对应的虚拟地址,创建环形缓冲队列,从而能环形缓冲队列基于实现对内核态与用户态的数据交互进行传输控制和安全控制,能保证数据交互的安全性。
下面对本发明提供的Linux内核态与用户态的数据交互装置进行描述,下文描述的Linux内核态与用户态的数据交互装置与上文描述的Linux内核态与用户态的数据交互方法可相互对应参照。
图3是本发明提供的Linux内核态与用户态的数据交互装置的结构示意图。基于上述任一实施例的内容,如图3所示,该装置包括第一接收模块301和数据读取单元302,其中:
第一接收模块301,用于接收第一目标程序的读操作;读操作,用于读取第一虚拟地址的数据;
数据读取单元302,用于响应于读操作,从第一虚拟地址对应的环形缓冲队列中的目标物理地址读取数据;
其中,目标物理地址的数据,是基于第二目标程序对第二虚拟地址的写操作写入的;第二虚拟地址与目标物理地址对应;在第一目标程序来自内核态的情况下,第二目标程序来自用户态;在第一目标程序来自用户态的情况下,第二目标程序来自内核态。
具体地,本发明实施例提供的Linux内核态与用户态的数据交互装置,可以为安装有基于Linux内核的操作***(例如Android***或Linux***等)的电子设备。上述电子设备可以为智能手机、平板电脑、笔记本电脑或服务器等。
第一接收模块301和数据读取单元302电连接。
第一接收模块301接收第一目标程序向内核发送的读操作。
数据读取单元302响应读操作,可以通过地址映射来访问共享内存的物理地址,实际从该目标物理地址读取数据,相当于读取了第一虚拟地址的数据。
可选地,该Linux内核态与用户态的数据交互装置,可以还包括:
第二接收模块,用于接收第二目标程序的写操作;写操作,用于向第二虚拟地址写入数据;
数据写入单元,用于响应于写操作,将数据写入目标物理地址。
可选地,该Linux内核态与用户态的数据交互装置,可以还包括:
队列创建模块,用于在目标态下基于共享内存的物理地址,创建环形缓冲队列。
可选地,该Linux内核态与用户态的数据交互装置,可以还包括
内存申请模块,用于在目标态下基于内存分配函数,申请共享内存,获取共享内存的物理地址;
其中,共享内存的物理地址连续。
可选地,队列创建模块可以包括:
地址映射单元,用于基于内存映射文件的方法,获取共享内存的物理地址对应的虚拟地址;
队列创建单元,用于基于共享内存的物理地址对应的虚拟地址,创建环形缓冲队列。
本发明实施例提供的Linux内核态与用户态的数据交互装置,用于执行本发明上述Linux内核态与用户态的数据交互方法,其实施方式与本发明提供的Linux内核态与用户态的数据交互方法的实施方式一致,且可以达到相同的有益效果,此处不再赘述。
该Linux内核态与用户态的数据交互装置用于前述各实施例的Linux内核态与用户态的数据交互方法。因此,在前述各实施例中的Linux内核态与用户态的数据交互方法中的描述和定义,可以用于本发明实施例中各执行模块的理解。
本发明实施例通过公用一块共享内存及环形缓冲队列,环形缓冲队列的头尾指针和结构体对于内核态和用户态均是同样的地址空间,以共享内存作为数据载体,以环形队列完成交互控制,能实现零拷贝的、高效易用的、真正的内核态与用户态间的数据交互,能在内核态和用户态之间一次性传输大量数据,能有效地提高内核态与用户态程序间的通信效率和每次交互的数据量。并且,为数据传输及应用程序提供一套通用、简单、易用的读写接口,能极大地丰富软件***架构的多样性以及适应低时延下复杂的应用场景的能力,具有很好的推广应用价值。
图4示例了一种电子设备的实体结构示意图,如图4所示,该电子设备可以包括:处理器(processor)410、通信接口(Communications Interface)420、存储器(memory)430和通信总线440,其中,处理器410,通信接口420,存储器430通过通信总线440完成相互间的通信。处理器410可以调用存储器430中的逻辑指令,以执行Linux内核态与用户态的数据交互方法,该方法包括:接收第一目标程序的读操作;读操作,用于读取第一虚拟地址的数据;响应于读操作,从第一虚拟地址对应的环形缓冲队列中的目标物理地址读取数据;其中,目标物理地址的数据,是基于第二目标程序对第二虚拟地址的写操作写入的;第二虚拟地址与目标物理地址对应;在第一目标程序来自内核态的情况下,第二目标程序来自用户态;在第一目标程序来自用户态的情况下,第二目标程序来自内核态。
此外,上述的存储器430中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
本申请实施例提供的电子设备中的处理器410可以调用存储器430中的逻辑指令,其实施方式与本申请提供的Linux内核态与用户态的数据交互方法的实施方式一致,且可以达到相同的有益效果,此处不再赘述。
另一方面,本发明还提供一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法所提供的Linux内核态与用户态的数据交互方法,该方法包括:接收第一目标程序的读操作;读操作,用于读取第一虚拟地址的数据;响应于读操作,从第一虚拟地址对应的环形缓冲队列中的目标物理地址读取数据;其中,目标物理地址的数据,是基于第二目标程序对第二虚拟地址的写操作写入的;第二虚拟地址与目标物理地址对应;在第一目标程序来自内核态的情况下,第二目标程序来自用户态;在第一目标程序来自用户态的情况下,第二目标程序来自内核态。
本申请实施例提供的计算机程序产品被执行时,实现上述Linux内核态与用户态的数据交互方法,其具体的实施方式与前述方法的实施例中记载的实施方式一致,且可以达到相同的有益效果,此处不再赘述。
又一方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各提供的Linux内核态与用户态的数据交互方法,该方法包括:接收第一目标程序的读操作;读操作,用于读取第一虚拟地址的数据;响应于读操作,从第一虚拟地址对应的环形缓冲队列中的目标物理地址读取数据;其中,目标物理地址的数据,是基于第二目标程序对第二虚拟地址的写操作写入的;第二虚拟地址与目标物理地址对应;在第一目标程序来自内核态的情况下,第二目标程序来自用户态;在第一目标程序来自用户态的情况下,第二目标程序来自内核态。
本申请实施例提供的非暂态计算机可读存储介质上存储的计算机程序被执行时,实现上述Linux内核态与用户态的数据交互方法,其具体的实施方式与前述方法的实施例中记载的实施方式一致,且可以达到相同的有益效果,此处不再赘述。
以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

Claims (10)

1.一种Linux内核态与用户态的数据交互方法,其特征在于,包括:
接收第一目标程序的读操作;所述读操作,用于读取第一虚拟地址的数据;
响应于所述读操作,从所述第一虚拟地址对应的环形缓冲队列中的目标物理地址读取数据;
其中,所述目标物理地址的数据,是基于第二目标程序对第二虚拟地址的写操作写入的;所述第二虚拟地址与所述目标物理地址对应;在所述第一目标程序来自内核态的情况下,所述第二目标程序来自用户态;在所述第一目标程序来自用户态的情况下,所述第二目标程序来自内核态。
2.根据权利要求1所述的Linux内核态与用户态的数据交互方法,其特征在于,所述接收第一目标程序的读操作之前,还包括:
接收所述第二目标程序的写操作;所述写操作,用于向所述第二虚拟地址写入数据;
响应于所述写操作,将所述数据写入所述目标物理地址。
3.根据权利要求2所述的Linux内核态与用户态的数据交互方法,其特征在于,所述接收所述第二目标程序的写操作之前,还包括:
在目标态下基于共享内存的物理地址,创建所述环形缓冲队列。
4.根据权利要求3所述的Linux内核态与用户态的数据交互方法,其特征在于,所述在目标态下基于共享内存的物理地址,创建所述环形缓冲队列之前,还包括:
在目标态下基于内存分配函数,申请所述共享内存,获取所述共享内存的物理地址;
其中,所述共享内存的物理地址连续。
5.根据权利要求3所述的Linux内核态与用户态的数据交互方法,其特征在于,在目标态下基于共享内存的物理地址,创建所述环形缓冲队列,具体包括:
基于内存映射文件的方法,获取所述共享内存的物理地址对应的虚拟地址;
基于所述共享内存的物理地址对应的虚拟地址,创建所述环形缓冲队列。
6.一种Linux内核态与用户态的数据交互装置,其特征在于,包括:
第一接收模块,用于接收第一目标程序的读操作;所述读操作,用于读取第一虚拟地址的数据;
数据读取单元,用于响应于所述读操作,从所述第一虚拟地址对应的环形缓冲队列中的目标物理地址读取数据;
其中,所述目标物理地址的数据,是基于第二目标程序对第二虚拟地址的写操作写入的;所述第二虚拟地址与所述目标物理地址对应;在所述第一目标程序来自内核态的情况下,所述第二目标程序来自用户态;在所述第一目标程序来自用户态的情况下,所述第二目标程序来自内核态。
7.根据权利要求6所述的Linux内核态与用户态的数据交互装置,其特征在于,还包括:
第二接收模块,用于接收所述第二目标程序的写操作;所述写操作,用于向所述第二虚拟地址写入数据;
数据写入单元,用于响应于所述写操作,将所述数据写入所述目标物理地址。
8.一种电子设备,包括存储器、处理器及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现如权利要求1至5任一项所述Linux内核态与用户态的数据交互方法的步骤。
9.一种非暂态计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至5任一项所述Linux内核态与用户态的数据交互方法的步骤。
10.一种计算机程序产品,包括计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至5任一项所述Linux内核态与用户态的数据交互方法的步骤。
CN202111643026.4A 2021-12-29 2021-12-29 Linux内核态与用户态的数据交互方法及装置 Pending CN114356598A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111643026.4A CN114356598A (zh) 2021-12-29 2021-12-29 Linux内核态与用户态的数据交互方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111643026.4A CN114356598A (zh) 2021-12-29 2021-12-29 Linux内核态与用户态的数据交互方法及装置

Publications (1)

Publication Number Publication Date
CN114356598A true CN114356598A (zh) 2022-04-15

Family

ID=81104212

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111643026.4A Pending CN114356598A (zh) 2021-12-29 2021-12-29 Linux内核态与用户态的数据交互方法及装置

Country Status (1)

Country Link
CN (1) CN114356598A (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115033407A (zh) * 2022-08-09 2022-09-09 微栈科技(浙江)有限公司 一种适用于云计算的采集识别流量的***和方法
CN115269392A (zh) * 2022-07-20 2022-11-01 北京斯年智驾科技有限公司 一种用于融合感知的可视化调试方法、设备、介质
WO2024103912A1 (zh) * 2022-11-17 2024-05-23 苏州元脑智能科技有限公司 一种请求处理方法、装置、设备及非易失性可读存储介质
CN118101459A (zh) * 2024-04-19 2024-05-28 四川天邑康和通信股份有限公司 基于fttr的数据管控方法和装置、网关设备及介质

Cited By (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115269392A (zh) * 2022-07-20 2022-11-01 北京斯年智驾科技有限公司 一种用于融合感知的可视化调试方法、设备、介质
CN115269392B (zh) * 2022-07-20 2023-11-14 北京斯年智驾科技有限公司 一种用于融合感知的可视化调试方法、设备、介质
CN115033407A (zh) * 2022-08-09 2022-09-09 微栈科技(浙江)有限公司 一种适用于云计算的采集识别流量的***和方法
CN115033407B (zh) * 2022-08-09 2022-11-04 微栈科技(浙江)有限公司 一种适用于云计算的采集识别流量的***和方法
WO2024103912A1 (zh) * 2022-11-17 2024-05-23 苏州元脑智能科技有限公司 一种请求处理方法、装置、设备及非易失性可读存储介质
CN118101459A (zh) * 2024-04-19 2024-05-28 四川天邑康和通信股份有限公司 基于fttr的数据管控方法和装置、网关设备及介质
CN118101459B (zh) * 2024-04-19 2024-07-12 四川天邑康和通信股份有限公司 基于fttr的数据管控方法和装置、网关设备及介质

Similar Documents

Publication Publication Date Title
CN114356598A (zh) Linux内核态与用户态的数据交互方法及装置
US20180349194A1 (en) Accelerated data operations
EP1805629B1 (en) System and method for virtualization of processor resources
JP6090452B2 (ja) コンピューティングデバイス、方法、プログラム、および機械可読ストレージ媒体
US20230196502A1 (en) Dynamic kernel memory space allocation
US20100070544A1 (en) Virtual block-level storage over a file system
US11836091B2 (en) Secure memory access in a virtualized computing environment
US8886891B2 (en) Systems and methods for managing memory core surface
CN109977037B (zh) 一种dma数据传输方法及***
CN112463307A (zh) 一种数据传输方法、装置、设备及可读存储介质
EP2005307B1 (en) Graphics-processing system and method of broadcasting write requests to multiple graphics devices
Diakhaté et al. Efficient shared memory message passing for inter-VM communications
US20180107619A1 (en) Method for shared distributed memory management in multi-core solid state drive
CN114297129A (zh) 一种基于zynq7010的面向报文双核通信实现方法
US20200201691A1 (en) Enhanced message control banks
CN117349870A (zh) 基于异构计算的透明加解密计算***、方法、设备和介质
CN115454358B (zh) 数据的存储控制方法及其装置、图像处理***
CN113268356B (zh) 基于LINUX***的多GPU板卡bounding的***、方法及介质
US20210081328A1 (en) Unified kernel virtual address space for heterogeneous computing
WO2022083158A1 (zh) 数据处理的方法、实例以及***
CN112801856B (zh) 数据处理方法和装置
EP4276638A1 (en) System and method for accessing remote resource
CN114443209A (zh) 存储虚拟化装置及其操作方法和具有其的***的操作方法
CN112486632A (zh) 一种面向k8s的用户态虚拟设备驱动框架
CN112214444A (zh) 一种核间通信方法、arm、dsp及终端

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