Linux中提供用户空间信息摘要、加密和压缩统一接口的系统及方法

文档序号:6365653阅读:156来源:国知局
专利名称:Linux中提供用户空间信息摘要、加密和压缩统一接口的系统及方法
技术领域
本发明涉及计算机系统技术领域,特别涉及计算机操作系统的网络通信安全技术领域,具体是指ー种Linux操作系统中提供用户空间信息摘要、加密和压缩统ー接ロ的系统及方法。
背景技术
目前,由于用户对互联网通信需求的急速増加,互联网通信能力的不断扩容,导致用户数据在网络传输上的安全性受到各个方面的威胁,这对基于信息摘要的信息认证和数据加密提出了新的要求;此外,随着硬件的发展,各类设备处理数据吞吐量的提升,使用户对于高质量媒体文件的需求也在不断増加,这也对数据压缩提出了新的要求。当前,在Linux操作系统中,当涉及信息摘要、加密和压缩处理的情况下,通常采取两种方法一、在用户空间实现该应用,可以独立实现相关的算法,这相当繁琐,也没有必要,可行的方法是使用已有的用户空间的函数库,比如实现安全套接层协议SSL的OpenSSL。这种方法带来以下问题任何一个应用程序如果需要使用该算法,通常要独立包含这些函数库,所以代码无法重用;如果ー个应用程序需要多种算法,那么就要包含多种独立的函数库,并需要了解这些库的接ロ,导致程序编码复杂化。ニ、重用内核空间的算法实现。Linux内核提供了完整的信息摘要、加密和压缩算法的实现系统crypto系统。内核中的数据包校验,IPSEC的认证和加密算法库XFRM等均是基于该系统实现的,如果能够在内核中提供这些统一的接ロ给用户空间使用,将会大大简化用户空间密码系统的实现,井能够重用内核的相关代码。通常的方法可以将数据传递给内核,然后内核处理完毕后再传递给用户空间的应用程序,但是这涉及到数据的两次拷贝,将大大影响算法的计算效率。Michal Ludvig开发的CryptoDev实现了加密接ロ,它基于Linux设备模型中的ioctl系统调用,是这类实现方法的典型。从Linux内核版本2. 6. 38开始,Herbert Xu引入了 PF_ALG虚拟网络协议族以向用户空间提供统ー的内核信息摘要和加密接ロ,该方法在用户空间申请内存,并封装在多个iovec结构中传递给内核,内核根据iovec中记录的用户空间内存地址查询内核页表来定位该地址对应的页号,并根据iovec中记录的该内存长度确定占用的页面数,然后在内核中直接处理用户空间的数据。用户空间申请的内存其起始地址可以从内存页面的任何地方开始,并指定任意的数据长度,这导致集散序列scatterlist中对应的页面可以使用的数据长度不能满足加密 算法的对齐要求。对于信息摘要算法来说,由于多数该类算法不要求数组分组,也即数据对齐,这就不会带来问题。但对于当前大多数加密算法而言,均属于分组加密算法,所以数据都需要分组,这要求当前的数据必须满足对齐到该算法要求的分组长度,此时该方法根据用户传递的数据长度在内核空间不断申请页面空间来缓存数据,直至用户空间传递完所有数据并开始读取结果时,才对这些缓存的数据进行加密处理,这不仅没有实现数据的零拷贝,反而极度消耗内存。另外该技术在向用户传递处理结果时,无论是信息摘要还是数据加密都需要将结果复制到用户空间。所以,该技术实现的处理效率依然不高。此外该接ロ不支持数据压缩,且对于分组压缩算法也有数据对齐这ー要求,导致数据处理效率下降
发明内容

本发明的目的是克服了上述现有技术中的缺点,提供一种能够使用户空间程序像使用普通套接字一样简单,且避免了数据的两次拷贝,能够实现零拷贝的高效计算,同吋,依托内核空间强大和统ー的crypto系统,能够为用户空间提供相对应的丰富功能,实现了代码重用,摆脱了对用户空间函数库的依赖的Linux操作系统中提供用户空间信息摘要、加密及压缩统ー接ロ的系统及方法。所述的Linux操作系统中运行有用户空间和内核空间,所述的用户空间运行有应用程序,并与所述的内核空间之间具有通信信息交互。为了实现上述的目的,本发明所述的提供用户空间信息摘要、加密及压缩统ー接ロ的系统中,所述的用户空间为内存缓存区,所述的内存缓存区包括数据缓存区和结果缓存区,所述的内核空间包括离散内核页面单元和集散序列単元,所述的离散内核页面单元分别连接所述的内存缓存区和集散序列単元,所述的集散序列单元运行有网络协议族,所述的网络协议族向所述的应用程序提供用户空间信息摘要、加密及压缩统ー接ロ。该基于Linux操作系统提供用户空间信息摘要、加密及压缩统ー接ロ的系统中,所述的通信信息包括数据类信息和控制类信息,所述的数据类信息存储于所述的数据缓存区,所述的控制类信息存储于所述的结果缓存区。该基于Linux操作系统提供用户空间信息摘要、加密及压缩统ー接ロ的系统中,所述的网络协议族具有内存映射功能,所述的网络协议族通过内存映射将所述的数据缓存区和结果缓存区均映射至所述的应用程序。该基于Linux操作系统提供用户空间信息摘要、加密及压缩统ー接ロ的系统中,所述的网络协议族包括网络协议族套接字结构以及该网络协议族套接字结构的套接字操作集,所述的网络协议族套接字结构包括集散序列指针、结果缓冲区指针,以及与用户空间信息摘要、加密及压缩相关的结构体转换指针,所述的套接字操作集包括映射函数指针、释放函数指针、设置套接字函数指针、获取套接字函数指针以及集散序列互斥访问锁。本发明还提供一种基于所述的提供用户空间信息摘要、加密及压缩统ー接ロ的系统实现Linux操作系统中提供用户空间信息摘要、加密及压缩统ー接ロ的方法,该方法包括以下步骤(I)所述的应用程序通过套接字调用内核空间创建网络协议族套接字描述符;(2)所述的内核空间的网络协议族接收到所述的套接字调用,分配网络协议族套接字,并进行网络协议族套接字初始化;(3)所述的应用程序设置套接字调用,并发起设置集散序列请求,所述的网络协议族接收到所述的设置集散序列请求后,进行集散序列初始化;(4)所述的应用程序在网络协议族套接字描述符上向所述的网络协议族发起内存映射调用请求;
(5)所述的网络协议族收到所述的内存映射调用请求后,将离散内核页面映射到用户空间内存缓存区中,应用程序得到ー个指向该内存缓存区的指针;(6)所述的应用程序根据所述的指向该内存缓存区的指针,获得数据缓存区的起始地址以及结果缓存区的起始地址,再将需要处理的数据写入所述的数据缓存区,然后向所述的网络协议族发起执行集散序列请求;(7)所述的网络协议族收到所述的执行集散序列请求后,实施信息摘要、加密和压缩请求,并将请求结果存入所述的结果缓存区,并向所述的应用程序返回处理后数据的结果长度;
(8)所述的应用程序读取所述的结果缓存区,获取处理后数据,并将其与所述的处理后数据的结果长度拼接后输出;(9)所述的应用程序调用解除映射,关闭所述的网络协议族套接字描述符,所述的内核空间释放资源。该实现Linux操作系统中提供用户空间信息摘要、加密及压缩统ー接ロ的方法中,所述的网络协议族包括网络协议族套接字结构和与该网络协议族套接字结构的套接字操作集,所述的网络协议族套接字结构包括集散序列指针和果缓冲区指针,以及与用户空间信息摘要、加密及压缩相关的结构体转换指针,所述的套接字操作集包括映射函数指针、释放函数指针、设置套接字函数指针、取套接字函数指针以及集散序列互斥访问锁,所述的步骤(3)具体包括以下步骤(31)所述的应用程序设置套接字调用,并向所述的网络协议族发起设置集散序列请求;(32)所述的网络协议族接收到所述的设置集散序列请求后,取出所述请求中的数据缓存页面数、结果缓存页面数和算法要求;(33)所述的网络协议族根据所述的数据缓存页面数,为每个数据缓存页面申请内核页面;并将页面与集散序列进行关联;(34)所述的网络协议族根据所述的结果缓存页面数,为每个结果缓存页面申请内核页面;(35)所述的网络协议族根据所述的算法要求申请结构体转换,所述的应用程序向所述的结构体转换提供密钥和/或初始化向量。该实现Linux操作系统中提供用户空间信息摘要、加密及压缩统ー接ロ的方法中,所述的方法在步骤(35)之后还包括以下步骤(36)当所述的网络协议族检测应用程序的设置集散序列的请求參数有误或申请内核页面出错,则向所述的应用程序返回错误值。该实现Linux操作系统中提供用户空间信息摘要、加密及压缩统ー接ロ的方法中,所述的为每个数据缓存页面申请内核页面数和所述的为每个结果缓存页面申请内核页面数均不大于8。该实现Linux操作系统中提供用户空间信息摘要、加密及压缩统ー接ロ的方法中,所述的内核页面为连续分布的内核页面或离散分布的内核页面。该实现Linux操作系统中提供用户空间信息摘要、加密及压缩统ー接ロ的方法中,所述的内存映射调用请求的參数包括数据缓存页面以及结果缓存页面的内存的长度。
该实现Linux操作系统中提供用户空间信息摘要、加密及压缩统ー接ロ的方法中,所述的网络协议族将离散内核页面映射到用户空间内存缓存区中,具体为所述的网络协议族调用网络协议族对应的映射函数将离散内核页面映射到用户空间内存缓存区中。该实现Linux操作系统中提供用户空间信息摘要、加密及压缩统ー接ロ的方法中,所述的步骤(6)具体包括以下步骤(61)所述的应用程序根据所述的指向该内存缓存区的指针,获得数据缓存区的起始地址以及结果缓存区的起始地址;(62)所述的应用程序判断需要处理的数据是否大于所述的数据缓存区的大小,若不是,则进入步骤(63),若是,则进入步骤(64);(63)所述的应用程序将需要处理的数据直接写入数据缓存区,并通过设置套接字 函数向所述的网络协议族发起执行集散序列请求;(64)所述的应用程序将需要处理的数据循环写入数据缓存区,并在每次写满所述的数据缓存区之后向所述的网络协议族发起执行集散序列请求,该请求中包含指示数据是否写完的字段及大小信息。该实现Linux操作系统中提供用户空间信息摘要、加密及压缩统ー接ロ的方法中,所述的网络协议族实施信息摘要、加密和压缩请求具体为所述的网络协议族根据所述的执行集散序列请求中的指示数据是否写完的字段及大小信息,在结构体转换上实施信息摘要、加密和压缩请求。采用本发明的Linux操作系统中提供用户空间信息摘要、加密及压缩统ー接ロ的系统,其用户空间包括数据缓存区和结果缓存区,核空间包括离散内核页面单元和集散序列単元,所述的离散内核页面单元分别连接所述的内存缓存区和集散序列単元,所述的集散序列单元运行有网络协议族,所述的网络协议族向所述的应用程序提供用户空间信息摘要、加密及压缩统ー接ロ。采用本发明所述的方法,利用该网络协议族,使用户空间应用程序像使用普通套接字一样简单,同时避免了数据的两次拷贝,实现了零拷贝的高效计算,此夕卜,还依托内核空间强大和统ー的crypto系统,为用户空间提供了相对应的丰富功能,实现了代码重用,摆脱了对用户空间函数库的依赖。本发明的Linux操作系统中提供用户空间信息摘要、加密及压缩统ー接ロ的系统及方法,其结构简单,实现方式简便,应用范围也较为广泛。


图I为本发明的Linux操作系统中提供用户空间信息摘要、加密及压缩统ー接ロ的系统的结构示意图。图2为本发明的Linux操作系统中提供用户空间信息摘要、加密及压缩统ー接ロ的方法的流程示意图。图3为本发明的Linux操作系统中提供用户空间信息摘要、加密及压缩统ー接ロ的系统中的网络协议族的核心数据结构示意图。图4为本发明中的网络协议族设置套接字的流程示意图。图5实际应用中为利用本发明的Linux操作系统中提供用户空间信息摘要、加密及压缩统一接ロ的方法实现信息摘要算法的流程示意图。
具体实施例方式为了能够更清楚地理解本发明的技术内容,特举以下实施例详细说明。请參阅图I所示,为本发明的Linux操作系统中提供用户空间信息摘要、加密及压缩统ー接ロ的系统的结构示意图。其中,所述的Linux操作系统中运行有用户空间和内核空间,所述的用户空间运行有应用程序,并与所述的内核空间之间具有通信信息交互。在一种实施方式中,所述的提供用户空间信息摘要、加密及压缩统ー接ロ的系统 中,所述的用户空间为内存缓存区,所述的内存缓存区包括数据缓存区和结果缓存区,所述的用户空间与内核空间之间的通信信息包括数据类信息和控制类信息,相对应的,所述的数据类信息存储于所述的数据缓存区,所述的控制类信息存储于所述的结果缓存区。所述的内核空间包括离散内核页面单元和集散序列単元,所述的离散内核页面单元分别连接所述的内存缓存区和集散序列単元,所述的集散序列单元运行有网络协议族,所述的网络协议族具有内存映射功能,所述的网络协议族通过内存映射将所述的数据缓存区和结果缓存区均映射至所述的应用程序,并向所述的应用程序提供用户空间信息摘要、加密及压缩统一接ロ。基于该实施方式所述的系统实现Linux操作系统中提供用户空间信息摘要、加密及压缩统一接ロ的方法,如图2所示,包括以下步骤(I)所述的应用程序通过套接字调用内核空间创建网络协议族套接字描述符;(2)所述的内核空间的网络协议族接收到所述的套接字调用,分配网络协议族套接字,并进行网络协议族套接字初始化;(3)所述的应用程序设置套接字调用,并发起设置集散序列请求,所述的网络协议族接收到所述的设置集散序列请求后,进行集散序列初始化;(4)所述的应用程序在网络协议族套接字描述符上向所述的网络协议族发起内存映射调用请求;(5)所述的网络协议族收到所述的内存映射调用请求后,将离散内核页面映射到用户空间内存缓存区中,应用程序得到ー个指向该内存缓存区的指针;(6)所述的应用程序根据所述的指向该内存缓存区的指针,获得数据缓存区的起始地址以及结果缓存区的起始地址,再将需要处理的数据写入所述的数据缓存区,然后向所述的网络协议族发起执行集散序列请求;(7)所述的网络协议族收到所述的执行集散序列请求后,实施信息摘要、加密和压缩请求,并将请求结果存入所述的结果缓存区,并向所述的应用程序返回处理后数据的结果长度;(8)所述的应用程序读取所述的结果缓存区,获取处理后数据,并将其与所述的处理后数据的结果长度拼接后输出;(9)所述的应用程序调用解除映射,关闭所述的网络协议族套接字描述符,所述的内核空间释放资源。在一种较优选的实施方式中,所述的网络协议族,如图3所示,包括网络协议族套接字结构以及该网络协议族套接字结构的套接字操作集,所述的网络协议族套接字结构包括集散序列指针、结果缓冲区指针,以及与用户空间信息摘要、加密及压缩相关的结构体转换指针,所述的套接字操作集包括映射函数指针、释放函数指针、设置套接字函数指针、获取套接字函数指针以及集散序列互斥访问锁。基于该较优选的实施方式所述的系统实现Linux操作系统中提供用户空间信息摘要、加密及压缩统ー接ロ的方法中,所述的步骤(3)具体包括以下步骤(31)所述的应用程序设置套接字调用,并向所述的网络协议族发起设置集散序列请求;(32)所述的网络协议族接收到所述的设置集散序列请求后,取出所述请求中的数据缓存页面数、结果缓存页面数和算法要求;(33)所述的网络协议族根据所述的数据缓存页面数,为每个数据缓存页面申请内核页面,并将页面与集散序列进行关联;所述的为每个数据缓存页面申请内核页面数不大于8 ;
(34)所述的网络协议族根据所述的结果缓存页面数,为每个结果缓存页面申请内核页面,所述的为每个结果缓存页面申请内核页面数也不大于8,且所述的内核页面可以为连续分布的内核页面或离散分布的内核页面;(35)所述的网络协议族根据所述的算法要求申请结构体转换,所述的应用程序向所述的结构体转换提供密钥和/或初始化向量。在一种进ー步优选的实施方式中,所述的方法在步骤(35)之后还包括以下步骤(36)当所述的网络协议族检测应用程序的设置集散序列的请求參数有误或申请内核页面出错,则向所述的应用程序返回错误值。在另ー种较优选的实施方式中,所述的内存映射调用请求的參数包括数据缓存页面以及结果缓存页面的内存的长度。在又一种较优选的实施方式中,所述的步骤(5)中网络协议族将离散内核页面映射到用户空间内存缓存区中,具体为所述的网络协议族调用网络协议族对应的映射函数将离散内核页面映射到用户空间内存缓存区中。在再一种较优选的实施方式中,所述的步骤(6)具体包括以下步骤(61)所述的应用程序根据所述的指向该内存缓存区的指针,获得数据缓存区的起始地址以及结果缓存区的起始地址;(62)所述的应用程序判断需要处理的数据是否大于所述的数据缓存区的大小,若不是,则进入步骤(63),若是,则进入步骤(64);(63)所述的应用程序将需要处理的数据直接写入数据缓存区,并通过设置套接字函数向所述的网络协议族发起执行集散序列请求;(64)所述的应用程序将需要处理的数据循环写入数据缓存区,并在每次写满所述的数据缓存区之后向所述的网络协议族发起执行集散序列请求,该请求中包含指示数据是否写完的字段及大小信息。在更进ー步优选的实施方式中,所述的步骤(7)中网络协议族实施信息摘要、カロ密和压缩请求具体为所述的网络协议族根据所述的执行集散序列请求中的指示数据是否写完的字段及大小信息,在结构体转换上实施信息摘要、加密和压缩请求。在本发明的应用中,包含两类用户与内核间的通信信息控制类和数据类。控制类信息包括请求分配内存,初始化Linux crypto系统所需的转换结构tfm,以及循环控制,这类数据通过内核网络协议族提供的系统调用setsockopt进行。数据类,则包含所要处理的数据以及处理的结果,这类数据比较大,与算法效率直接相关,这类数据通过内存缓存区在用户而和内核空间进行传递。本发明包含两个内存缓存区数据缓存区和结果缓存区。这两个缓冲区均根据用户空间的应用程序的请求在内核中以页面为单位进行分配,这两个缓存区通过内存映射mmap被统一映射到应用程序中,应用程序根据自身对两个缓存区实际大小的请求,可以得到数据缓冲区和结果缓存区的开始地址。具体而言,如图I所示为本发明的系统的构成示意图,其包含两个重要的缓冲区数据缓冲区和结果缓冲区。数据缓冲区被集中到集散序列scatterlist中进行统一管理,核心的算法引擎也同时作用在该结构体上,同时它将最終的运算结果存储在结果缓冲区。图3则描述了虚拟网络协议族PF_CRYPT0的核心数据结构,它体现为ー个cryptosock结构,包含了 scatterlist指针,结果缓冲区的指针,以及所有与信息摘要、加密和压 缩相关的结构体指针tfm。与此同时它利用了 Linux网络协议族的用户空间的通信框架,定义了一类套接字操作集,这里只使用了 mmap, release, setsockopt和getsockopt函数指针。其中mmap实现了内存映射,release用来释放套接字和相关内存资源。setsockopt则用来实现内存页面申请,以及调用算法引擎。实际应用中,首先在内核头文件socket, h中添加新的协议族编号PF_CRYPT0,它不应该与现在最大的已定义的内核网络协议族编号相冲突。基于该编号,定义如图3中描述的相关结构体。并在模块初始化时通过sock_register注册·该协议族。随后,用户空间应用程序进行以下各步骤步骤1,fd = socket (PF_CRYPT0, S0CK_PACKET, 0)。通过 socket 系统调用,内核模块通过调用crypto_create申请crypto_sock结构,并对其中的sock结构体进行套接字的初始化,另外初始化PF_CRYPT0特有的scatterlist, tfm和scatterlist互斥锁等成员。步骤2,setsockopt (handle, fd, S0L_PACKET, SET_SCATTER_LIST, (void*)&req,sizeof (req))。通过 setsockopt 系统调用,并指定 SET_SCATTER_LIST 请求。req包含了请求的数据缓存区和结果缓存区的页面数以及信息摘要,加密和压缩算法名称,比如“md5”。内核模块收到SET_SCATTER_LIST请求后,调用crypto_setsockopt,该流程參考图4所示。首先会查看当前是否已经申请过内存页,如果是,并且当前内存页已经被映射,则返回资源忙的错误,否则查看该次请求的内存数和已经申请的内存数是否一致,如果不一致,则释放旧的内存,并重新申请新的内存,否则跳过该步骤。如果请求页面数为0,则释放已经申请的页面。判断请求中的算法名称是否存在并和上次请求一致,如果一致则跳过,否则释放旧的tfm结构体,并申请对应本次请求的tfm结构体。申请内存的核心函数调用为_get_free_pages (GFP_KERNEL | _GFP_C0MP | _GFP_ZER0,0),最后ー个參数为申请页面的阶数,这里以一个页面为单位申请内存,可以在最大可能程度上保证成功分配内存。步骤3,mmapbuf = mmap (O, mmapbuf_len, PR0T_READ | PR0T_WRITE, MAP_SHARED,fd,0)。通过mmap系统调用将步骤2中申请的内核页面统一映射到用户空间。mmapbuf_len是数据缓存区和结果缓存区大小之和,単位为字节。映射过程由内核模块中的cryptojnmap完成。_apbuf指向了内存映射区的首地址,根据它和申请的数据缓存区和结果缓存区页面数,可以计算它们的起始地址,记为databuf和resultbuf,这里的databuf和mmapbuf的值相同。cryptojnmap函数是实现内存映射的核心,关键代码如下
1start = vma->vm_start;
2for (i = 0; i < cryp_sock->slist _pages; i + + ) {
3struct page *page = virt_to_page(cryp_sock ->slist[i]);
4int pg—num;
5for (pg num = 0; pg num < cryp sock ->slist order; pg num+ + , page++){— — — — —
6err = vrn—insert—page (vma, start, page);
7if (unlikely(err))
8goto out;
9start += PAGE—SIZE;
11}
12for (i =〇;i < cryp—sock —>result—pages; i++) {
13struct page *page = virt to page (cryp sock ->result[i]);
14int pg num;
15for (pg—num = 0; pg—num < cryp—sock ->result—order; pg—num++, page++){ — — — — —
16err = vrn—insert—page (vma, start, page);
17if (unlikely(err))
18goto out;
19start +ニ PAGE—SIZE;
20} —
21 }slist是记录申请的数据缓存区页面的指针数组,result是记录申请的结果缓存区页面的指针数组,vma是当前应用程序进程需要申请的虚拟内存vm_area_struct结构,vm_jnsert_page通过将页面对应的page类型插入到该结构中实现了内存映射。步骤4,向databuf区直接写入需要处理的数据,这里需要考虑两种情况当目前的databuf缓存区的大小满足一次处理完当前数据,此时请求中设置数据结束字段end为1,并且提供该数据长度len。当目前的databuf缓存区的大小不满足一次处理完当前数据时,需要循环处理,此时分成多个数据块,每个数据块大小即为databuf缓存区的大小,此时请求中设置数据结束字段end为0,无需提供该数据长度len。每填充完ー个数据块,则进入步骤5进行数据处理。当处理到最后ー个数据块时,此时可能则置数据结束字段end为1,并且提供该数据长度len。步骤5, setsockopt(fd, S0L_PACKET, D0_SCATTER_LIST, (void*)&hash_req,sizeof (hash_req)))。此时内核模块调用 crypto_setsockopt 处理 D0_SCATTER_LIST,參考图4及图5所示。当一次处理完当前数据或者循环处理完最后ー个数据块后,则将结果写入resultbuf对应的内存页中,等待用户空间读取。步骤6,用户程序直接读取resultbuf,即可得到结果。 步骤7,munmap (mmapbuf, handle, mmapbuf_len)。通过 munmap 系统调用解除内存映射。
步骤8,參考步骤2,此时将req中的请求页面置为0,内核模块将释放申请的内存页和算法引擎tfm。步骤9, close (fd)。close释放套接字描述,对应内核模块中的crypto_release函数,清理套接字资源,并判断当前是否存在已分配内存页和tfm,如果有则ー并释放,所以步骤8是可以省略的。图5为本发明所述信息摘要算法的程序流程图,由于Linux对信息摘要,加密和压 缩算法提供了统ー的封装,所以本发明中实施加密和压缩算法的流程与此图类似。采用本发明的Linux操作系统中提供用户空间信息摘要、加密及压缩统ー接ロ的系统,其用户空间包括数据缓存区和结果缓存区,核空间包括离散内核页面单元和集散序列単元,所述的离散内核页面单元分别连接所述的内存缓存区和集散序列単元,所述的集散序列单元运行有网络协议族,所述的网络协议族向所述的应用程序提供用户空间信息摘要、加密及压缩统ー接ロ。采用本发明所述的方法,利用该网络协议族,使用户空间应用程序像使用普通套接字一样简单,同时避免了数据的两次拷贝,实现了零拷贝的高效计算,此夕卜,还依托内核空间强大和统ー的crypto系统,为用户空间提供了相对应的丰富功能,实现了代码重用,摆脱了对用户空间函数库的依赖。本发明的Linux操作系统中提供用户空间信息摘要、加密及压缩统ー接ロ的系统及方法,其结构简单,实现方式简便,应用范围也较为广泛。在此说明书中,本发明已參照其特定的实施例作了描述。但是,很显然仍可以作出各种修改和变换而不背离本发明的精神和范围。因此,说明书和附图应被认为是说明性的而非限制性的。
权利要求
1.一种Linux操作系统中提供用户空间信息摘要、加密及压缩统一接口的系统,所述的Linux操作系统中运行有用户空间和内核空间,所述的用户空间运行有应用程序,并与所述的内核空间之间具有通信信息交互,其特征在于,所述的提供用户空间信息摘要、加密及压缩统一接口的系统中,所述的用户空间为内存缓存区,所述的内存缓存区包括数据缓存区和结果缓存区,所述的内核空间包括离散内核页面单元和集散序列单元,所述的离散内核页面单元分别连接所述的内存缓存区和集散序列单元,所述的集散序列单元运行有网络协议族,所述的网络协议族向所述的应用程序提供用户空间信息摘要、加密及压缩统一接口。
2.根据权利要求I所述的基于Linux操作系统提供用户空间信息摘要、加密及压缩统一接口的系统,其特征在于,所述的通信信息包括数据类信息和控制类信息,所述的数据类信息存储于所述的数据缓存区,所述的控制类信息存储于所述的结果缓存区。
3.根据权利要求I所述的基于Linux操作系统提供用户空间信息摘要、加密及压缩接口一致性的系统,其特征在于,所述的网络协议族具有内存映射功能,所述的网络协议族通 过内存映射将所述的数据缓存区和结果缓存区均映射至所述的应用程序。
4.根据权利要求I至3中任一项所述的基于Linux操作系统提供用户空间信息摘要、加密及压缩接口一致性的系统,其特征在于,所述的网络协议族包括网络协议族套接字结构以及该网络协议族套接字结构的套接字操作集,所述的网络协议族套接字结构包括集散序列指针、结果缓冲区指针,以及与用户空间信息摘要、加密及压缩相关的结构体转换指针,所述的套接字操作集包括映射函数指针、释放函数指针、设置套接字函数指针、获取套接字函数指针以及集散序列互斥访问锁。
5.一种基于权利要求I所述的系统实现Linux操作系统中提供用户空间信息摘要、力口密及压缩统一接口的方法,其特征在于,所述的方法包括以下步骤 (1)所述的应用程序通过套接字调用内核空间创建网络协议族套接字描述符; (2)所述的内核空间的网络协议族接收到所述的套接字调用,分配网络协议族套接字,并进行网络协议族套接字初始化; (3)所述的应用程序设置套接字调用,并发起设置集散序列请求,所述的网络协议族接收到所述的设置集散序列请求后,进行集散序列初始化; (4)所述的应用程序在网络协议族套接字描述符上向所述的网络协议族发起内存映射调用请求; (5)所述的网络协议族收到所述的内存映射调用请求后,将离散内核页面映射到用户空间内存缓存区中,应用程序得到一个指向该内存缓存区的指针; (6)所述的应用程序根据所述的指向该内存缓存区的指针,获得数据缓存区的起始地址以及结果缓存区的起始地址,再将需要处理的数据写入所述的数据缓存区,然后向所述的网络协议族发起执行集散序列请求; (7)所述的网络协议族收到所述的执行集散序列请求后,实施信息摘要、加密和压缩请求,并将请求结果存入所述的结果缓存区,并向所述的应用程序返回处理后数据的结果长度; (8)所述的应用程序读取所述的结果缓存区,获取处理后数据,并将其与所述的处理后数据的结果长度拼接后输出;(9)所述的应用程序调用解除映射,关闭所述的网络协议族套接字描述符,所述的内核空间释放资源。
6.根据权利要求5所述的实现Linux操作系统中提供用户空间信息摘要、加密及压缩统一接口的方法,其特征在于,所述的网络协议族包括网络协议族套接字结构和与该网络协议族套接字结构的套接字操作集,所述的网络协议族套接字结构包括集散序列指针和果缓冲区指针,以及与用户空间 信息摘要、加密及压缩相关的结构体转换指针,所述的套接字操作集包括映射函数指针、释放函数指针、设置套接字函数指针、取套接字函数指针以及集散序列互斥访问锁,所述的步骤(3)具体包括以下步骤 (31)所述的应用程序设置套接字调用,并向所述的网络协议族发起设置集散序列请求; (32)所述的网络协议族接收到所述的设置集散序列请求后,取出所述请求中的数据缓存页面数、结果缓存页面数和算法要求; (33)所述的网络协议族根据所述的数据缓存页面数,为每个数据缓存页面申请内核页面;并将页面与集散序列进行关联; (34)所述的网络协议族根据所述的结果缓存页面数,为每个结果缓存页面申请内核页面; (35)所述的网络协议族根据所述的算法要求申请结构体转换,所述的应用程序向所述的结构体转换提供密钥和/或初始化向量。
7.根据权利要求6所述的实现Linux操作系统中提供用户空间信息摘要、加密及压缩统一接口的方法,其特征在于,所述的方法在步骤(35)之后还包括以下步骤 (36)当所述的网络协议族检测应用程序的设置集散序列的请求参数有误或申请内核页面出错,则向所述的应用程序返回错误值。
8.根据权利要求6或7所述的实现Linux操作系统中提供用户空间信息摘要、加密及压缩统一接口的方法,其特征在于,所述的为每个数据缓存页面申请内核页面数和所述的为每个结果缓存页面申请内核页面数均不大于8。
9.根据权利要求6或7所述的实现Linux操作系统中提供用户空间信息摘要、加密及压缩统一接口的方法,其特征在于,所述的内核页面为连续分布的内核页面或离散分布的内核页面。
10.根据权利要求5所述的实现Linux操作系统中提供用户空间信息摘要、加密及压缩统一接口的方法,其特征在于,所述的内存映射调用请求的参数包括数据缓存页面以及结果缓存页面的内存的长度。
11.根据权利要求5所述的实现Linux操作系统中提供用户空间信息摘要、加密及压缩统一接口的方法,其特征在于,所述的网络协议族将离散内核页面映射到用户空间内存缓存区中,具体为 所述的网络协议族调用网络协议族对应的映射函数将离散内核页面映射到用户空间内存缓存区中。
12.根据权利要求5所述的实现Linux操作系统中提供用户空间信息摘要、加密及压缩统一接口的方法,其特征在于,所述的步骤(6)具体包括以下步骤 (61)所述的应用程序根据所述的指向该内存缓存区的指针,获得数据缓存区的起始地址以及结果缓存区的起始地址; (62)所述的应用程序判断需要处理的数据是否大于所述的数据缓存区的大小,若不是,则进入步骤(63) ,若是,则进入步骤(64); (63)所述的应用程序将需要处理的数据直接写入数据缓存区,并通过设置套接字函数向所述的网络协议族发起执行集散序列请求; (64)所述的应用程序将需要处理的数据循环写入数据缓存区,并在每次写满所述的数据缓存区之后向所述的网络协议族发起执行集散序列请求,该请求中包含指示数据是否写完的字段及大小信息。
13.根据权利要求12所述的实现Linux操作系统中提供用户空间信息摘要、加密及压缩统一接口的方法,其特征在于,所述的网络协议族实施信息摘要、加密和压缩请求具体为 所述的网络协议族根据所述的执行集散序列请求中的指示数据是否写完的字段及大小信息,在结构体转换上实施信息摘要、加密和压缩请求。
全文摘要
本发明涉及一种Linux操作系统中提供用户空间信息摘要、加密及压缩统一接口的系统,其中,用户空间为内存缓存区,内存缓存区包括数据缓存区和结果缓存区,内核空间包括离散内核页面单元和集散序列单元,离散内核页面单元分别连接内存缓存区和集散序列单元,集散序列单元运行有网络协议族。本发明还涉及实现Linux操作系统中提供用户空间信息摘要、加密及压缩统一接口的方法,利用该网络协议族,实现了零拷贝的高效计算,还依托统一的crypto系统为用户空间提供了丰富功能,实现了代码重用,摆脱了对函数库的依赖。本发明的系统及方法,其结构简单,实现方式简便,应用范围也较为广泛。
文档编号G06F21/00GK102663276SQ20121005193
公开日2012年9月12日 申请日期2012年3月1日 优先权日2012年3月1日
发明者刘利, 徐正伟, 梅举三 申请人:上海大亚科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1