一种dma读操作的实现装置和方法

文档序号:6439335阅读:165来源:国知局
专利名称:一种dma读操作的实现装置和方法
一种DMA读操作的实现装置和方法技术领域
本发明属于计算机IO通信领域,具体涉及一种DMA读操作的实现装置和方法。
技术背景
DMA (Direct Memory Access,直接内存存取),允许不同速度的硬件装置来沟通, 而不需要依于CPU的大量中断负载。否则,CPU需要从来源把每一片段的资料复制到暂存器,然后把他们再次写回到新的地方。在这个时间中,CPU对于其他的工作来说就无法使用。 DMA传输将数据从一个地址空间复制到另外一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作。DMA传输对于高效能的嵌入式系统算法和网络是很重要的。
现有的外设在进行DMA读操作时,首先需要CPU将当前DMA读操作的描述符信息通过写寄存器的方式告知外设,外设DMA弓I擎分析DMA读描述符后发起DMA读操作,最后外设通过中断请求告知CPU DMA读操作完成。
专利号为ZL200810004252. 6的专利披露了一种高速多协议数据传输系统和方法,该方法数据传输的流程如上所述,存在几个影响性能的问题1)每次DMA读操作开始之前都需要CPU将描述符写到外设,每次DMA读操作结束之后都需要外设中断CPU,这对CPU 是一个不小的负担;2)由于IO总线的特性所致,DMA操作的长度较大时效率较高,如果存在很多小的DMA操作,将严重影响系统性能。
专利号为ZL200910091053. 8的专利披露了一种直接存储器访问的实现方法,该方法采用固定连续缓冲区以及查询方式实现DMA,避免了 CPU中断以及大量寄存器写操作带来的开销,但是存在以下问题1)该方法只针对DMA写操作了设计。2)在大量小块数据传输时,同样存在总线利用率利用不高。发明内容
本发明的目的在于,提供一种DMA读操作的实现装置和方法,解决现有技术中利用DMA方式从主机内存读取数据效率不高的问题。
为实现上述的目的,本发明提供一种DMA读操作的实现装置,所述实现装置包括 主机单元和与所述主机单元连接的网卡单元;其改进之处在于,所述主机单元包括CPU和内存模块;所述CPU控制所述内存模块;所述网卡单元包括DMA读写操作模块和DMA读引擎 (DMAReadEngine);所述DMA读引擎(DMAReadEngine)控制所述DMA读操作模块。
本发明提供的优选技术方案中,所述内存模块包括缓冲区写指针(wr_ptr)、缓冲区读指针(rd_ptr)、缓冲区基地址(kise^ddr)、缓冲区长度(Ien);所述网卡单元包括基地址寄存器(baSe_addr reg)、长度寄存器(len reg)、缓冲区写指针寄存器(wr_ptr reg)和缓冲区读指针寄存器(rd_ptr reg)。
本发明提供的第二优选技术方案中,所述CPU包括缓冲区读指针模块(rd_ptr_cpu) 。
本发明提供的第三优选技术方案中,所述DMA读引擎(DMAReadEngine)比较所述缓冲区写指针(wr_ptr)和所述缓冲区读指针(rd_ptr),计算出缓冲区BUF当前待读取数据长度 cur_rd_len ;
所述DMA读引擎(DMAReadEngine)向主机单元发送DMA读请求,请求地址为kiSe_ addr+rd_ptr,长度为 cur_rd_len ;
所述DMA读引擎(DMAReadEngine)等待DMA读请求返回,然后更新所述缓冲区读指针(rd_ptr)至Ij rd—ptr+cur—rd—len 处。
本发明提供的第四优选技术方案中,提供一种DMA读操作的实现方法,其改进之处在于,所述方法包括如下步骤
1 分别对所述网卡单元中的所述基地址寄存器(baSe_addr reg)、所述长度寄存器(len reg)、所述缓冲区写指针寄存器(Wr_ptr reg)和所述缓冲区读指针寄存器(rd_ptr reg)初始化,所述所有寄存器的初始值设置为0 ;2 所述CPU将缓冲区的基地址(base_ addr)和长度信息(Ien)分别写到所述基地址寄存器(baSe_addr reg)和所述长度寄存器 (len reg)中;3 所述CPU读取缓冲区读指针寄存器(rd_ptr reg)的值,并计算出当前缓冲区(BUF)空闲空间大小;4 判断当前缓冲区(BUF)空闲空间大小是否小于当前待传送的数据块大小,如果判断结果为“是”,则返回步骤3 ;如果判断结果为“否”,则所述CPU将这块数据写到缓冲区(BUF)的地址为baSe_addr+Wr_ptr处,然后将所述缓冲区写指针(wr_ptr) 更新到wr_ptr+Cur_wr_len处,并写到所述缓冲区写指针寄存器(wr_ptr reg)中。
本发明提供的第五优选技术方案中,在所述步骤3中,所述CPU定时读取所述缓冲区读指针寄存器(rd_ptr reg)的值,并将其保存在所述缓冲区读指针模块(rd_ptr_CpU) 中,所述CPU比较所述缓冲区读指针模块(rd_ptr_CpU)和所述缓冲区写指针(wr_ptr)计算出当前缓冲区空闲空间大小。
与现有技术比,本发明提供的DMA读操作的实现装置和方法,避免了描述符交换和CPU中断,将大大减少CPU的参与,降低CPU负担,提高IO总线利用率;再者,解决了在现有的DMA读操作中,在出现大量的小数据块的交换时,由于描述符交换和中断所占的开销比例相对很大,总线的利用率将会非常低的问题;而且DMA读操作的实现装置和方法可以将较小的DMA读操作合并成较大的DMA读操作,使DMA读操作对于小数据块交换和大数据块交换没有差别。


图1为DMA读操作的实现装置的结构图。
图2为DMA读操作的实现方法的流程图。
具体实施方式
如图1所示,DMA读操作的实现装置,包括主机单元和网卡单元;所述主机单元和网卡单元相连接;所述主机单元包括CPU和内存模块;所述CPU控制所述内存模块进行操作;所述内存模块包括缓冲区写指针(wr_ptr)、缓冲区读指针(rd_ptr)、基地址寄存器 (base_addr reg)、长度寄存器(len reg)、缓冲区写指针寄存器(wr_ptr reg)和缓冲区读指针寄存器(rd_ptr reg);所述基地址寄存器(iDasejddr reg)、所述长度寄存器(Ien reg)、所述缓冲区写指针寄存器(wr_ptr reg)和所述缓冲区读指针寄存器(rd_ptr reg) 设置在所述内存模块的一块连续的缓冲区中;所述网卡单元包括DMA读写操作模块和DMA 读引擎(DMAReadEngine);所述DMA读引擎控制所述DMA读写操作模块的操作;所述CPU包括缓冲区读指针模块(rd_ptr_CpU)。
如图2所示,DMA读操作的实现方法,该方法将多个DMA操作合并成一个DMA操作, 可以带来较大的益处。该方法的具体实施步骤如下
主机CPU在设备驱动程序中申请一块连续的内存区域BUF,设备上设计四个寄存器base_addr reg、Ien reg、wr_ptr reg禾口 rd_ptr reg,分别存储发包缓冲区缓冲区基地址t3ase_addr、缓冲区长度len、缓冲区写指针wr_ptr和缓冲区读指针rd_ptr,所有寄存器初始化为0 ;主机CPU侧
步骤1 对所述内存模块中的所述基地址寄存器03aSe_addr reg)、所述长度寄存器(len reg)、所述缓冲区写指针寄存器(Wr_ptr reg)和所述缓冲区读指针寄存器(rd_ptr reg)进行初始化,将所述所有寄存器的初始值设置为0 ;
步骤2 所述CPU将缓冲区的基地址(baSe_addr)和长度信息(Ien)分别写到所述基地址寄存器(baSe_addr reg)、所述长度寄存器(len reg)中;
步骤3 所述CPU等待到网卡单元的数据传输请求,读取缓冲区读指针寄存器(rd_ Ptr reg)的值,并计算出当前缓冲区(BUF)空闲空间大小;在所述步骤3中,所述CPU定时读取所述缓冲区读指针寄存器(rd_ptr reg)的值,并保存在所述缓冲区读指针模块(rd_ ptr_cpu)中,所述CPU等待到设备的数据传输请求,然后比较所述缓冲区读指针模块(rd_ ptr_cpu)和所述缓冲区写指针(wr_ptr)计算出当前缓冲区空闲空间大小;
步骤4 判断当前缓冲区(BUF)空闲空间大小是否小于当前待传送的数据块大小 (cur_wr_len),如果判断结果为“是”,则返回步骤3 ;如果判断结果为“否”,则所述CPU将这块数据写到缓冲区(BUF)的地址为base_addr+wr_ptr处,然后将所述缓冲区写指针(wr_ ptr)更新到wr_ptr+cur_wr_len处,并写到所述缓冲区写指针寄存器(wr_ptr reg)中。
由于写外设寄存器的操作开销较大,主机CPU可以不用每个数据块传输都进行, 而是采用定时写的方式实现,主机CPU维护一个变量wr_ptr_cpu,并定时的将wr_ptr_cpu 资额到外设寄存器wr_ptr_reg中。设备侧
所述DMA读引擎(DMAReadEngine)比较所述缓冲区写指针(wr_ptr)和所述缓冲区读指针(rd_ptr),计算出缓冲区BUF当前待读取数据长度Cur_rd_len ;
所述DMA读引擎(DMAReadEngine)向主机单元发送DMA读请求,请求地址为kiSe_ addr+rd_ptr,长度为 cur_rd_len ;
所述DMA读引擎(DMAReadEngine)等待DMA读请求返回,然后更新所述缓冲区读指针(rd_ptr)至Ij rd—ptr+cur—rd—len 处。
需要声明的是,本发明内容及具体实施方式
意在证明本发明所提供技术方案的实际应用,不应解释为对本发明保护范围的限定。本领域技术人员在阅读本申请说明书后,在其精神和原理启发下,可作各种修改、等同替换、或改进。但这些变更或修改均在申请待批的保护范围内。
权利要求
1.一种DMA读操作的实现装置,所述实现装置包括主机单元和与所述主机单元连接的网卡单元;其特征在于,所述主机单元包括CPU和内存模块;所述CPU控制所述内存模块;所述网卡单元包括DMA读写操作模块和DMA读引擎(DMAReadEngine);所述DMA读引擎 (DMAReadEngine)控制所述DMA读操作模块。
2.根据权利要求1所述的实现装置,其特征在于,所述内存模块包括缓冲区写指针 (wr_ptr)、缓冲区读指针(rd_ptr)、缓冲区基地址(l3ase_addr)、缓冲区长度(Ien);所述网卡单元包括基地址寄存器(baSe_addr reg)、长度寄存器(len reg)、缓冲区写指针寄存器 (wr_ptr reg)和缓冲区读指针寄存器(rd_ptr reg)。
3.根据权利要求1所述的实现装置,其特征在于,所述CPU包括缓冲区读指针模块 (rd_ptr_cpu)。
4.根据权利要求1所述的实现装置,其特征在于,所述DMA读引擎(DMAReadEngine)比较所述缓冲区写指针(wr_ptr)和所述缓冲区读指针(rd_ptr),计算出缓冲区BUF当前待读取数据长度cur_rd_len ;所述DMA读引擎(DMAReadEngine)向主机单元发送DMA读请求,请求地址为base_ addr+rd_tr,长度为 cur_rd_len ;所述DMA读引擎(DMAReadEngine)等待DMA读请求返回,然后更新所述缓冲区读指针 (rd_ptr)至Ij rd_ptr+cur_rd_len 处。
5.根据1-4项权利要求任一项所述的DMA读操作的实现装置的DMA读操作的实现方法,其特征在于,所述方法包括如下步骤1 分别对所述网卡单元中的所述基地址寄存器(baSe_addr reg)、所述长度寄存器 (len reg)、所述缓冲区写指针寄存器(Wr_ptr reg)和所述缓冲区读指针寄存器(rd_ptr reg)初始化,所述所有寄存器的初始值设置为0 ;2 所述CPU将缓冲区的基地址(base_ addr)和长度信息(Ien)分别写到所述基地址寄存器(baSe_addr reg)和所述长度寄存器 (len reg)中;3 所述CPU读取缓冲区读指针寄存器(rd_ptr reg)的值,并计算出当前缓冲区(BUF)空闲空间大小;4 判断当前缓冲区(BUF)空闲空间大小是否小于当前待传送的数据块大小,如果判断结果为“是”,则返回步骤3 ;如果判断结果为“否”,则所述CPU将这块数据写到缓冲区(BUF)的地址为baSe_addr+Wr_ptr处,然后将所述缓冲区写指针(wr_ptr) 更新到wr_ptr+Cur_wr_len处,并写到所述缓冲区写指针寄存器(wr_ptr reg)中。
6.根据权利要求5所述的实现方法,其特征在于,在所述步骤3中,所述CPU定时读取所述缓冲区读指针寄存器(rd_ptr reg)的值,并将其保存在所述缓冲区读指针模块(rd_ ptr_cpu)中,所述CPU比较所述缓冲区读指针模块(rd_ptr_CpU)和所述缓冲区写指针 (wr_ptr)计算出当前缓冲区空闲空间大小。
全文摘要
本发明提供了一种DMA读操作的实现装置和方法,实现装置包括主机单元和与所述主机单元连接的网卡单元;所述主机单元包括CPU和内存模块;所述网卡单元包括DMA读写操作模块和DMA读引擎;所述DMA读引擎控制所述DMA读写操作模块的操作。实现方法包括读取缓冲区读指针寄存器的值,并计算出当前缓冲区空闲空间大小;判断当前缓冲区空闲空间大小是否小于当前待传送的数据块大小,如果判断结果为“否”,则CPU将这块数据写到缓冲区的地址为base_addr+wr_ptr处,然后将缓冲区写指针更新到wr_ptr+cur_wr_len处,并写到所述缓冲区写指针寄存器中。本发明提供的DMA读操作的实现装置和方法避免了描述符交换和CPU中断,将大大减少CPU的参与,降低CPU负担,提高IO总线利用率。
文档编号G06F13/28GK102521179SQ20111038317
公开日2012年6月27日 申请日期2011年11月28日 优先权日2011年11月28日
发明者刘朝辉, 刘灿, 姬乃军, 张英文, 李锋伟, 李静, 窦晓光 申请人:曙光信息产业股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1