专利名称:一种数据传输的方法及系统的制作方法
技术领域:
本发明属于数据通信领域,尤其涉及一种外围设备和用户程序之间数据传输的方法及系统。
背景技术:
目前,在很多面向特殊用途的芯片解决方案中,普遍采用的是通用中央处理器(Central Processing Unit,CPU)核加数字信号处理(Digital SignalProcessing,DSP)引擎的嵌入式系统架构,如网际协议(Internet Protocol,IP)处理器、第三代(3G)手机芯片、IP电视(IPTV)的芯片等。Linux是嵌入式系统采用的主流操作系统之一。
在以Linux构建的嵌入式系统中,CPU核以外的处理设备,如输入/输出(Input/Output,I/O)设备等外围设备与主存之间的数据通讯通常采用直接内存访问(Direct Memory Access,DMA)方式。由于CPU与外围设备的通信性能限制,一般必须在系统启动时在主存中配置固定的内存空间作为DMA缓冲区,实现内存和外部存储器之间的数据交换,而不是在每次通讯时动态配置。另外,主存中还必须保持若干个由操作系统可以直接访问的内核缓冲区,缓冲外围设备和主存之间需要交换的数据。
由于Linux系统采用虚拟地址映射,用户态与内核态均不能直接访问对方的地址空间。因此,通常用户态与内核态的相互通讯有两种方式一是将数据在内核态和用户态之间做一次拷贝,这种方式适用于数据量小,且性能不敏感的应用。二是使用地址映射,即将用户态地址和物理地址都映射到同一块物理内存,这种方式适用于数据量大,且性能要求较高的应用,在实现时主要分成两个阶段
1.外围设备驱动使用DMA方式从DMA缓冲区存取数据;2.用户程序使用操作系统从内核缓冲区调用存取数据;在阶段1中,当外围设备使用DMA方式对预先配置的DMA缓冲区完成数据存取后,触发中断通知操作系统数据已经处理完毕,中断例程调度其他程序将DMA缓冲区中的数据拷贝到内核缓冲区。在阶段2中,用户程序使用系统调用获取内核缓冲区对应的用户态地址。
在上述方案中,由于用户程序与设备外围设备之间的数据通讯至少要经历一次拷贝,数据通讯效率比较低。同时,使用DMA方式写数据时,由于数据缓冲使用无缓冲(uncached)模式且采取静态分配模式,读取效率低下。由于地址映射是很费时的操作,因此,当用户态与内核态通讯使用地址映射方式时,通常使用大块连续内存,一次映射就绪,并由相应的内核模块来管理这块内存。除非使用保留内存,很难在系统运行一段时间之后分配到大块连续内存。同时,如果与外围设备通讯的数据大小有很大波动,则会导致保留内存中出现大量碎片。
发明内容本发明实施例的目的在于提供一种数据传输方法和系统,实现两个通信方之间的数据零拷贝通信。
为了解决上述技术问题,本发明实施例提出的技术方案如下一种数据传输方法,所述方法基于主存缓冲区和内核实现,所述主存缓冲区包括至少两个缓冲块,每个缓冲块配置有指示该缓冲块的指示信息,所述方法包括下述步骤第一通信方从内核获取至少一个空闲缓冲块的指示信息,并将数据写入对应的空闲缓冲块;第二通信方从内核获取所述承载数据的缓冲块的的指示信息,并从对应的承载数据的缓冲块读取数据。
一种数据传输系统,所述系统包括第一通信方、第二通信方、内核和主存缓冲区;主存缓冲区包括至少两个缓冲块,每个缓冲块配置有指示该缓冲块的指示信息;内核,用于管理缓冲块的指示信息;第一通信方,从主存缓冲区获取至少一个空闲缓冲块的指示信息,并将数据块写入对应的空闲缓冲块;第二通信方,从内核获取所述承载数据的缓冲块的指示信息,并从对应的承载数据的缓冲块读取数据。
本发明实施例通过将主存缓冲区划分为至少两个缓冲块,并在两个通信方之间进行通信时,采用让对方获取承载数据的缓冲块的指示信息,对方根据指示信息直接去缓冲块读取数据,实现双方通信中的数据零拷贝,有效提高了系统性能,节省了宝贵的内存资源,降低了系统成本。
图1是本发明实施例中缓冲块的状态迁移示意图;图2是本发明实施例中数据传输的实现原理图;图3是本发明实施例中数据传输的系统结构图。
具体实施方式为了使本发明实施例的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明实施例进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
本发明实施例适用于包含内核的操作系统,且操作系统中的用户程序与内核对应不同的地址空间,在本发明实施例中,外围设备与用户程序之间动态交换缓冲块指示信息,同时结合地址映射实现了用户程序与外围设备之间数据的零拷贝,可以大幅度提高数据传输性能。
在本发明实施例中,内核将主存缓冲区划分为至少两个缓冲块,对应每个缓冲块配置有指示该缓冲块的指示信息,指示信息可以为缓冲块指针,也可以为指代缓冲块的信息体,信息体可以包含缓冲块指针,指示信息通常是由内核进行管理。该指示信息包含对应缓冲块的物理地址。缓冲块的大小可以相等,以方便内核管理,每个缓冲块的大小不限,一般为主存缓冲区的最小自然单位,当然缓冲块的大小也可以不相等。这样就可以将用户数据分解成以缓冲块为单元的数据组,然后通过缓冲块实现数据传输。
如图1所示,为方便管理,可以根据当前使用者的不同,将主存缓冲区中的缓冲块分为以下四个状态自由态此时缓冲块未写入数据,处于空闲状态,可以随时被外围设备或者用户程序取用;外围设备占用态缓冲块被外围设备占用,外围设备可以读写数据;内核占用态此时缓冲块中已经有数据,且被内核所使用;用户程序占用态此时缓冲块被用户程序占用,用户程序可以读写数据。
状态迁移的方式可以为从自由态转移到用户程序占用态再转换到内核占用态或逆向转换,也可以为从自由态转移到外围设备占用态再转移到内核占用态或逆向转移。
每个状态中的所有缓冲块的指示信息可以用一个队列来管理,每一个指示信息队列对应一个相同状态的缓冲块队列,本发明实施例中,对应四种缓冲块状态,指示信息队列相应包括自由态缓冲块指示信息队列,用于指示处于自由态的空闲缓冲块;内核占用态缓冲块指示信息队列,用于指示处于内核占用态的缓冲块;外围设备占用态缓冲块指示信息队列,用于指示处于外围设备占用态的缓冲块;用户程序占用态缓冲块指示信息队列,用于指示处于用户程序占用态的缓冲块;
当然,根据需要,还可以设定不同状态的缓冲块及相应的指示信息队列。
作为本发明的另一实施例,每一个缓冲块的状态也可以使用主存缓冲区首部的状态记录表来记录,这样只需要一个缓冲块队列就可以记录所有缓冲块的状态了。
由于外围设备和用户程序使用的是不同的地址空间,因此缓冲块的交换需要结合地址映射。当数据从外围设备传输到用户程序时,需要将缓冲块的物理地址映射到用户空间,建立缓冲块的物理地址与用户态地址之间的映射。在用户空间,每一个缓冲块都有一个单独的用户态地址,每一个用户态地址分别对应唯一的物理地址。
地址映射的方式可以在传输数据之前进行,也可以在将数据写入缓冲块后进行。
参见图2,以缓冲块指示信息队列对缓冲块状态进行管理为例,介绍本发明实施例数据从外围设备传输到用户程序的过程。首先,外围设备需要获取至少一个空闲缓冲块,即从内核中自由态缓冲块指示信息队列中获取至少一个自由态缓冲块指示信息,然后根据指针信息中的缓冲块物理地址,直接向获取的空闲缓冲块写数据。数据写入缓冲块后,内核控制承载数据的缓冲块的指示信息从外围设备占用态缓冲块的指示信息队列迁移到内核占用态缓冲块的指示信息队列中,并将处于自由态的相应数量的空闲缓冲块指示信息迁移到外围设备占用态缓冲块的指示信息队列中,供外围设备使用。
当用户程序请求读取数据时,先通知内核将处于内核占用态的缓冲块映射到用户空间,建立缓冲块的物理地址与用户态地址之间的映射。用户程序开始读取数据时,内核控制承载数据的缓冲块指示信息从内核占用态队列迁移到用户程序占用态队列。用户程序从缓冲块指示信息得到物理地址,根据映射关系查询缓冲块指示信息中物理地址对应的用户态地址,并用户程序根据用户态地址从对应的缓冲块读取数据。当用户程序完成数据读取后,承载数据的缓冲块恢复为空闲缓冲块,内核将使用完毕的空闲缓冲块的指针归还自由态缓冲块的指示信息队列。
数据从用户程序输出到外围设备的数据传输过程与上述过程类似,主要区别在于缓冲块状态的迁移不同以及地址映射不同。用户程序从处于自由态的缓冲块中获取空闲缓冲块,内核将用户程序获取的空闲缓冲块的用户态地址映射到用户空间,用户程序根据用户态地址向获取的空闲缓冲块写数据。数据写入缓冲块后,缓冲块从用户程序占用态迁移到对应的内核占用态,并将处于自由态的相应数量的空闲缓冲块迁移到用户程序占用态。
当外围设备请求读取数据时,缓冲块从内核占用态迁移到外围设备占用态,外围设备获取承载数据的缓冲块的指示信息,根据指示信息中包含的物理地址去相应的缓冲块读取数据。当外围设备完成数据读取后,将使用完毕的空闲缓冲块的指针归还内核,此时缓冲块的状态迁移到自由态。
在本发明实施例中,用户程序或者外围设备根据需要传输的数据量以及缓冲块的大小确定需要的缓冲块数量,可能需要不止一个空闲缓冲块,如果是多个缓冲块组成缓冲块组,则用户程序或者外围设备将数据分解到每一个缓冲块上,传输时,缓冲块组中所有缓冲块的数据总和构成完整的用户数据。
以下以具体的例子,描述一下用户程序读取外围设备数据的过程。当启动外围设备将数据写入到缓冲块后,在采用直接内存访问方式完成的中断处理中,首先外围设备从处于外围设备占用态的缓冲块中获取空闲缓冲块的指针,并在指针指示下的缓冲块中写入数据,写入数据的多个缓冲块组成一个缓冲块组,该缓冲块组中的缓冲块的状态迁移到内核占用态。然后,内核将相应数量的处于自由态的缓冲块的状态迁移到用户程序占用态。当用户程序请求数据时,先通知内核将缓冲块映射到用户空间。然后,判断是否有处于内核占用态的缓冲块,若有,则将处于内核占用态的一个缓冲块组返回给用户进程,若没有,则可以等待,也可以不等待,这取决于用户进程的需求。当用户程序完成了对这一组缓冲块承载的数据的读取后,通知内核,内核将该组缓冲块迁移到自由态。
图3示出了本发明实施例中数据传输的系统结构,该系统包括第一通信方31、第二通信方32、操作系统内核33、主存缓冲区34和映射模块35。在实施数据传输方法前,内核33通过映射模块35将主存缓冲区划分为多个缓冲块,缓冲块的大小最好相等,一般为主存缓冲区的最小自然单位。每个缓冲块都配置有指示该缓冲块的指示信息,指示信息包含缓冲块的物理地址。
映射模块35,用于建立缓冲块的物理地址和用户态地址之间的映射。缓冲块的物理地址和用户态地址之间的映射可以在缓冲块划分之后进行,也可以在第一通信方或者第二通信方请求数据时进行。
内核33,用于管理缓冲块的指示信息。
第一通信方31,用于向主存缓冲区34读写数据,当需向主存缓冲区写入数据时,从主存缓冲区中获取至少一个空闲缓冲块的指示信息,将数据写入对应的空闲缓冲块。
第二通信方32,用于向主存缓冲区34读写数据,从内核获取所述承载数据的缓冲块的指示信息,根据所述指示信息得到缓冲块的地址信息,根据所述地址信息从对应的承载数据的缓冲块读取数据,数据读取完成后,将空闲缓冲块归还内核。
其中第一通信方可以为外围设备,对应地,第二通信方为用户程序,此时地址信息为用户态地址;第一通信方可以为用户程序,对应地,第二通信方为外围设备,此时地址信息为物理地址。
在本发明实施例中,用户程序或者外围设备得到的缓冲块可能不止一个,而是包括多个缓冲块的一组,一个缓冲块组中所有缓冲块中的数据总和构成完整的用户数据。
本发明实施例通过采用用户空间到物理空间的地址映射,以及将用户数据分解传送的方式,不需要在内核缓冲区和DMA缓冲区之间进行数据拷贝,实现了用户程序到内核空间的数据零拷贝,同时在内核与外围设备的DMA传输过程中使用在内核中交换缓冲块指示信息的方式,实现主存到外围设备的数据零拷贝,从而实现了用户程序到外围设备之间数据传输的零拷贝,有效提高了系统性能,节省了宝贵的内存资源,降低了系统成本。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
权利要求
1.一种数据传输方法,其特征在于,所述方法基于主存缓冲区和内核实现,所述主存缓冲区包括至少两个缓冲块,每个缓冲块配置有指示该缓冲块的指示信息,所述方法包括下述步骤第一通信方从内核获取至少一个空闲缓冲块的指示信息,并将数据写入对应的空闲缓冲块;第二通信方从内核获取所述承载数据的缓冲块的的指示信息,并从对应的承载数据的缓冲块读取数据。
2.如权利要求
1所述的数据传输方法,其特征在于,所述指示信息为缓冲块指针或者指代缓冲块的信息体。
3.如权利要求
1所述的数据传输方法,其特征在于,所述第一通信方和第二通信方中,其中一方为外围设备,另一方为用户程序。
4.如权利要求
3所述的数据传输方法,其特征在于,所述指示信息中包含缓冲块的物理地址,并且,所述方法还包括所述内核将缓冲块的物理地址映射到用户空间,建立缓冲块的物理地址与用户态地址之间的映射关系。
5.如权利要求
4所述的数据传输方法,其特征在于,所述方法还包括所述外围设备根据缓冲块指示信息中包含的物理地址在对应的缓冲块上写入数据或从对应的缓冲块上读取数据;所述用户程序根据所述映射关系,查询缓冲块指示信息中物理地址对应的用户态地址,然后根据所述用户态地址在对应的缓冲块上写入数据或从对应的缓冲块上读取数据。
6.如权利要求
4或5所述的数据传输方法,其特征在于所述内核在数据传输之前,将主存缓冲区包括的所有缓冲块的物理地址映射到用户空间并建立所述映射关系;或者所述内核在第一通信方将数据写入对应的空闲缓冲块后,再将所述承载数据的缓冲块的物理地址映射到用户空间并建立所述映射关系。
7.如权利要求
1所述的数据传输方法,其特征在于,所述内核分别建立空闲缓冲块指示信息队列、内核占用态缓冲块指示信息队列、第一通信方占用态缓冲块指示信息队列和第二通信方占用态缓冲块指示信息队列,并根据各指示信息队列对缓冲块进行管理。
8.如权利要求
1所述的数据传输方法,其特征在于,所述内核在每一个缓冲块的主存缓冲区首部的状态记录表中记录缓冲块的状态,并根据记录信息对缓冲块进行管理。
9.一种数据传输系统,其特征在于,所述系统包括第一通信方、第二通信方、内核和主存缓冲区;主存缓冲区包括至少两个缓冲块,每个缓冲块配置有指示该缓冲块的指示信息;内核,用于管理缓冲块的指示信息;第一通信方,从主存缓冲区获取至少一个空闲缓冲块的指示信息,并将数据块写入对应的空闲缓冲块;第二通信方,从内核获取所述承载数据的缓冲块的指示信息,并从对应的承载数据的缓冲块读取数据。
10.如权利要求
9所述的数据传输系统,其特征在于,,所述第一通信方和第二通信方中,其中一方为外围设备,另一方为用户程序。
11.如权利要求
10所述的数据传输系统,其特征在于,所述系统还包括映射模块,用于将缓冲块的物理地址映射到用户空间,建立缓冲块物理地址与用户态地址之间的映射。
专利摘要
本发明适用于计算机通信领域,提供了一种数据传输方法,所述方法基于主存缓冲区和内核实现,所述主存缓冲区包括至少两个缓冲块,每个缓冲块配置有指示该缓冲块的指示信息,所述方法包括第一通信方从内核获取至少一个空闲缓冲块的指示信息,并将数据写入对应的空闲缓冲块;第二通信方从内核获取所述承载数据的缓冲块的指示信息,并从对应的承载数据的缓冲块读取数据。相应的,本发明还提供一种数据传输系统。本发明在两个通信方之间进行通信时,实现双方通信中的数据零拷贝,有效提高了系统性能,节省了宝贵的内存资源,降低了系统成本。
文档编号G06F12/08GK1996271SQ200610064660
公开日2007年7月11日 申请日期2006年12月30日
发明者陈康林, 南元 申请人:华为技术有限公司导出引文BiBTeX, EndNote, RefMan