CN101826031A - 基于Linux***的PCM流捕获的实现方法 - Google Patents

基于Linux***的PCM流捕获的实现方法 Download PDF

Info

Publication number
CN101826031A
CN101826031A CN200910119178A CN200910119178A CN101826031A CN 101826031 A CN101826031 A CN 101826031A CN 200910119178 A CN200910119178 A CN 200910119178A CN 200910119178 A CN200910119178 A CN 200910119178A CN 101826031 A CN101826031 A CN 101826031A
Authority
CN
China
Prior art keywords
kernel
space
user
data
pcm
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
CN200910119178A
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.)
Individual
Original Assignee
Individual
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 Individual filed Critical Individual
Priority to CN200910119178A priority Critical patent/CN101826031A/zh
Publication of CN101826031A publication Critical patent/CN101826031A/zh
Pending legal-status Critical Current

Links

Images

Landscapes

  • Telephonic Communication Services (AREA)

Abstract

本发明提供了一种Linux操作***下实时捕获PCM数据的方法,包括:使用内存映射实现内核与用户空间之间的数据交互;使用零拷贝机制使得每次内核与用户空间之间的数据拷贝次数减少50%;使用非阻塞I/O在应用层读取内核中的PCM数据。采用本发明的技术方案,既可以实现对内核中PCM数据的捕获,还可以满足对高实时性的要求,不会出现数据的丢失。本发明的程序可作为一个模块***Linux操作***内核,并作为内核的一部分执行。适用于2.6版内核的Linux操作***。

Description

基于Linux***的PCM流捕获的实现方法
技术领域
本发明涉及Linux操作***,具体涉及在Linux操作***中捕获PCM流的实现方法。
背景技术
很多Linux下的音频通信软件支持多种音频编解码,这些音频数据在写入声卡之前会被解码成PCM格式。有的情况下,这些音频数据在被解码之前一直处于加密状态,所以只有通过提取声卡中的PCM数据才可以得到这些音频数据并进行处理。由于音频通信对延迟十分敏感,而且经常要求多路通信并发进行,于是这些写入声卡的PCM数据只有被尽可能及时的提取出来,才能将延迟减小到最小。同时,在Linux操作***中,PCM数据是通过设备驱动程序写入硬件设备的,用户空间进程无法实现这个功能,于是本文提出了一种利用Linux可加载声卡驱动模块的设计方法,采用零拷贝技术,减少了内核空间与用户空间之间的数据拷贝,使得应用程序可以高效的捕获写入声卡设备中的PCM数据。
零拷贝是实现主机或路由器等设备高速网络接口的主要技术。零拷贝技术通过减少或消除关键通信路径影响速度的操作,降低数据传输的操作***开销和协议处理开销,从而有效提高通信性能,实现高速数据传输。本文仅指降低数据传输的操作***开销。
零拷贝(zero-copy)的基本思想是:数据从设备到用户程序空间传递的过程中,减少数据拷贝次数,减少***调用,实现CPU的零参与,彻底消除CPU在这方面的负载。实现零拷贝用到的最主要技术是DMA数据传输技术和内存区域映射技术,本文使用内存映射技术。传统的数据处理,需要经过设备到内核空间,内核空间到用户空间这两次拷贝,同时还需要经历用户向***发出的***调用。而零拷贝技术则首先在用户空间建立一块缓存区域,并将其映射到内核空间,用户空间程序直接对这块内存进行访问,从而减少了***内核向用户空间的内存拷贝,同时减少了***调用的开销。
图1说明了普通拷贝与零拷贝的区别。应用零拷贝技术使每次读取数据减少了一次内核到用户空间的拷贝,拷贝次数减少了50%,如果读操作的频率很高,使用零拷贝技术可以极大的提高读取数据的效率。
发明内容
本发明提出了一种基于Linux操作***的高效PCM数据捕获机制,即利用网络缓存中常用的零拷贝技术,提高PCM数据的捕获效率。
为了解决上述问题,本发明提供了一种基于Linux操作***的PCM流捕获的方法,包括:
a目标机在调用用户进程时打开DSP设备文件,并将PCM流写入内核缓冲区;
b将内核缓冲区所在内存映射到用户空间;
c所述测试主机对用户空间特定区域进行读取操作。
进一步的,所述步骤b具体是指:通过将内核中PCM数据所在缓冲区映射到用户空间的方法,实现零
拷贝技术,减少数据拷贝的次数,并使用户空间可以访问内核中的PCM数据。
进一步的,所述步骤c具体是指:在内存映射空间的起始位置分配特定的数据结构,使内核与用户空间实现读写操作的同步,用户空间读取完毕之后通知内核,使内核中的环形缓冲区可以重新向次区域写入PCM数据。
进一步的,所述特定的数据结构包含如下两个信息:用于空间已读取PCM数据在内核缓冲区中的偏移、用户空间已读取PCM数据的字节数。
采用上述方案,本发明利用零拷贝技术结合非阻塞的数据读取,可以实现并优化PCM数据的捕获,在Linux***上可用来破解和提取加密的音频数据。
附图说明
图1为现有技术的零拷贝示意图
图2为本发明的内存映射区域数据结构示意图
图3为本发明方法的流程图
具体实施方式
以下结合附图和具体实例,对本发明进行详细说明。
本发明通过在驱动程序中使用零拷贝技术来减少数据在内核空间和用户空间移动的次数,实现的方法是,在驱动程序中实现与mmap***调用相关联的***调用的回调函数,在这个函数中使用remap_pfn_range函数将内核空间中的缓存区域映射到用户空间,应用程序在捕获PCM数据之前使用mmap***调用,就可以将映射区域中的PCM数据读取出来。
本发明PCM数据的捕获通过应用程序和驱动程序之间相互配合来完成,主要实现方法是使用内存映射***调用mmap,该***调用直接将设备内存映射到用户进程的地址空间里,这样就提供用户程序直接访问设备内存的能力,映射意味着将用户空间的一段内存与设备内存关联起来,无论何时当程序在分配的地址范围内读写时,实际上访问的就是设备内存空间。在驱动程序模块加载时为每个虚拟声音设备分配内存空间并将地址保存在mmap_area_va中。在应用程序中,读取设备内存之前将执行***调用mmap。
PCM数据的捕获需要驱动程序与应用程序配合完成,当零拷贝的内存映射建立之后,通过在此内存区域的起始地址处存放已写入设备且还未被应用程序读取的PCM数据的地址和长度,来达到在驱动程序和应用程序之间传递信息的目的。
Linux驱动程序需要提供与read***相关联的方法,应用程序直接通过对设备文件使用read***调用来读取数据。但是由于本文使用了零拷贝机制,所以直接通过读取内存映射区域的方法来实现。每次读操作所需的信息是缓存中数据的偏移即front的值和要读取的字节数count,可以在与read***调用关联的方法中实现内核与用户空间信息的传递。本发明提出在使用零拷贝机制的同时使用共享映射区域头部的方法在内核空间与用户空间之间传递信息。
本发明的实现方法是,设备缓存留出头部的一小块区域存放一个数据结构,这个数据结构保存了front和count的值,并与数据缓冲区一起被映射到用户空间中。图2显示了设备缓存的结构。
图3为应用程序捕获PCM数据读操作的流程图。本发明的应用程序采用非阻塞的方式捕获PCM流,每次读取数据之前都通过poll询问的方式来判断当前缓冲区中是否有数据,如果有则立即读取头部信息,再根据这些信息读取PCM数据;如果缓冲区为空,则简单的返回-EAGAIN。具体实现时可以在应用程序中每次读操作之前执行select***调用,驱动中实现与之相关联的poll方法,用于返回判断当前设备是否可读的umask掩码。读操作完成后,通过一个ioctl***调用将count的值清零并更新front的值,应用程序得到dsp_read中的内容后,将数据直接从设备内存的映射空间读取出来,用户空间映射区域的环形缓存起始地址data_area_va加上front的值就得到了读取数据的起始地址,然后通过比较front和写时rear的大小就可以选择相应的方式读取数据。
通过以上方法,本发明可以实现对Linux***中PCM数据的高效捕获。

Claims (4)

1.一种基于Linux操作***的PCM流捕获的方法,包括:
a目标机在调用用户进程时打开DSP设备文件,并将PCM流写入内核缓冲区;
b将内核缓冲区所在内存映射到用户空间;
c所述测试主机对用户空间特定区域进行读取操作。
2.如权利要求1所述的方法,其特征在于:
所述步骤b具体是指:通过将内核中PCM数据所在缓冲区映射到用户空间的方法,实现零拷贝技术,减少数据拷贝的次数,并使用户空间可以访问内核中的PCM数据。
3.如权利要求1所述的方法,其特征在于:
所述步骤c具体是指:在内存映射空间的起始位置分配特定的数据结构,使内核与用户空间实现读写操作的同步,用户空间读取完毕之后通知内核,使内核中的环形缓冲区可以重新向次区域写入PCM数据。
4.如权利要求3所述的方法,其特征在于:
所述特定的数据结构包含如下两个信息:用于空间已读取PCM数据在内核缓冲区中的偏移、用户空间已读取PCM数据的字节数。
CN200910119178A 2009-03-06 2009-03-06 基于Linux***的PCM流捕获的实现方法 Pending CN101826031A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN200910119178A CN101826031A (zh) 2009-03-06 2009-03-06 基于Linux***的PCM流捕获的实现方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN200910119178A CN101826031A (zh) 2009-03-06 2009-03-06 基于Linux***的PCM流捕获的实现方法

Publications (1)

Publication Number Publication Date
CN101826031A true CN101826031A (zh) 2010-09-08

Family

ID=42689959

Family Applications (1)

Application Number Title Priority Date Filing Date
CN200910119178A Pending CN101826031A (zh) 2009-03-06 2009-03-06 基于Linux***的PCM流捕获的实现方法

Country Status (1)

Country Link
CN (1) CN101826031A (zh)

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101917350A (zh) * 2010-09-13 2010-12-15 南京中兴特种软件有限责任公司 一种Linux下基于网卡驱动的零拷贝以太网报文捕获及发送的实现方法
CN102467473A (zh) * 2010-11-03 2012-05-23 Tcl集团股份有限公司 一种在用户空间和内核之间传输数据的方法和装置
CN103064692A (zh) * 2011-10-19 2013-04-24 北京市三希电子科技开发公司 一种固件的更新方法及装置
CN103106083A (zh) * 2011-11-09 2013-05-15 北京市三希电子科技开发公司 一种固件的加载方法及装置
CN104166864A (zh) * 2014-08-01 2014-11-26 北京民芯科技有限公司 一种智能读写器和智能卡之间的通信方法及***
CN104268036A (zh) * 2014-10-13 2015-01-07 浪潮电子信息产业股份有限公司 一种基于零拷贝的快照卷读方法
CN104778089A (zh) * 2015-04-23 2015-07-15 河北远东通信***工程有限公司 一种基于Linux内核的多点到多点数据发布和订阅方法
CN103914325B (zh) * 2014-04-02 2017-04-05 中国科学院微电子研究所 基于混合内存的Linux***的关机、开机方法及***

Cited By (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101917350B (zh) * 2010-09-13 2012-08-15 南京中兴特种软件有限责任公司 一种Linux下基于网卡驱动的零拷贝以太网报文捕获及发送的实现方法
CN101917350A (zh) * 2010-09-13 2010-12-15 南京中兴特种软件有限责任公司 一种Linux下基于网卡驱动的零拷贝以太网报文捕获及发送的实现方法
CN102467473B (zh) * 2010-11-03 2015-02-11 Tcl集团股份有限公司 一种在用户空间和内核之间传输数据的方法和装置
CN102467473A (zh) * 2010-11-03 2012-05-23 Tcl集团股份有限公司 一种在用户空间和内核之间传输数据的方法和装置
CN103064692A (zh) * 2011-10-19 2013-04-24 北京市三希电子科技开发公司 一种固件的更新方法及装置
CN103106083B (zh) * 2011-11-09 2016-03-23 北京市三希电子科技开发公司 一种固件的加载方法及装置
CN103106083A (zh) * 2011-11-09 2013-05-15 北京市三希电子科技开发公司 一种固件的加载方法及装置
CN103914325B (zh) * 2014-04-02 2017-04-05 中国科学院微电子研究所 基于混合内存的Linux***的关机、开机方法及***
CN104166864A (zh) * 2014-08-01 2014-11-26 北京民芯科技有限公司 一种智能读写器和智能卡之间的通信方法及***
CN104166864B (zh) * 2014-08-01 2017-12-12 陈志河 一种智能读写器和智能卡之间的通信方法及***
CN104268036A (zh) * 2014-10-13 2015-01-07 浪潮电子信息产业股份有限公司 一种基于零拷贝的快照卷读方法
CN104778089A (zh) * 2015-04-23 2015-07-15 河北远东通信***工程有限公司 一种基于Linux内核的多点到多点数据发布和订阅方法
CN104778089B (zh) * 2015-04-23 2017-12-26 河北远东通信***工程有限公司 一种基于Linux内核的多点到多点数据发布和订阅方法

Similar Documents

Publication Publication Date Title
CN101826031A (zh) 基于Linux***的PCM流捕获的实现方法
CN111221758B (zh) 处理远程直接内存访问请求的方法和计算机设备
CN101150488B (zh) 一种零拷贝网络报文接收方法
CN101616194B (zh) 主机网络性能优化***及方法
KR101300447B1 (ko) 메시지 통신 기술
US8225332B2 (en) Method and system for protocol offload in paravirtualized systems
CN101630270B (zh) 数据处理***和方法
KR100758272B1 (ko) 데이터 무 복사 파일 이동 방법
CN105677597A (zh) 数据写入方法及装置
WO2012141696A1 (en) Input/output processing
CN102571925A (zh) 一种在光纤通道环境中利用rdma存取数据的方法
CN101257457A (zh) 网络处理器复制报文的方法和网络处理器
WO2024082944A1 (zh) 一种多处理器数据交互方法、装置、设备及存储介质
JP6492083B2 (ja) インフィニバンド(IB)上で仮想ホストバスアダプタ(vHBA)を管理およびサポートするためのシステムおよび方法、ならびに単一の外部メモリインターフェイスを用いてバッファの効率的な使用をサポートするためのシステムおよび方法
CN102291298B (zh) 一种高效的面向长消息的计算机网络通信方法
JP2006085400A (ja) データ処理システム
WO2022021896A1 (zh) 一种进程间通信的方法及装置
WO2012141694A1 (en) Input/output processing
CN103986585A (zh) 报文预处理方法及其装置
CN109857517B (zh) 一种虚拟化***及其数据交换方法
Tianhua et al. The design and implementation of zero-copy for linux
US20140025859A1 (en) Input/output processing
CN106790162B (zh) 虚拟网络优化方法与***
US9288163B2 (en) Low-latency packet receive method for networking devices
CN108063737B (zh) 一种FCoE存储区域网读请求处理方法及***

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
DD01 Delivery of document by public notice

Addressee: Wang Zhong

Document name: Notification of before Expiration of Request of Examination as to Substance

DD01 Delivery of document by public notice

Addressee: Wang Zhong

Document name: Notification that Application Deemed to be Withdrawn

C02 Deemed withdrawal of patent application after publication (patent law 2001)
WD01 Invention patent application deemed withdrawn after publication

Application publication date: 20100908