一种基于sgl链表的DMA传输方法技术

技术编号:18350169 阅读:63 留言:0更新日期:2018-07-01 23:12
本发明专利技术提供了一种基于sgl链表的DMA传输方法,应用于CPU中。配置至少一个sgl entry的sgl entry链表,每个sgl entry对应一个index,每个index指向一个寄存地址,寄存地址连续。确定当前DMA传输对应起始sgl entry index在的寄存地址。发起DMA传输命令至DMA控制器,使得DMA控制器根据起始sgl entry index,从SGL MEN中找到相应的起始sgl entry后,开始按照sgl entry中的存储地址传输数据至第二寄存器DATA MEN中。借助sgl链表,传输离散物理地址的数据成为单一操作。提高了数据传输效率。

【技术实现步骤摘要】
一种基于sgl链表的DMA传输方法
本专利技术属于数据处理
,具体涉及一种基于sgl链表的DMA传输方法。
技术介绍
DMA(DirectMemoryAccess,直接内存存取)传输是将数据从一个地址空间复制到另外一个地址空间的传输方式。CPU初始化这个传输动作,传输动作本身是由DMA控制器来实行和完成。这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作。DMA传输方式对于高效能嵌入式系统算法和网络是很重要的。在传统DMA方式传输数据的过程中,要求源物理地址和目标物理地址必须是连续的。但在有的体系中,连续的存储器地址不一定是连续的,则采用DMA方式传输数据要分成多次完成,CPU需要多次向DMA发起命令。例如,传输完一块物理地址连续的数据后,CPU向DMA发起一次中断命令,然后,CPU再向DMA发起针对进行下一块物理地址连续的数据的传输命令,直至完成所有的数据,发起CPU再向DMA发起中断命令。其中第一块物理地址连续的数据中的第一个地址为源物理地址,第二个地址为此一块物理地址连续的数据中的第一个地址的目标物理地址。例如,当我们要建立一个从内存到磁盘的DMA数据传输,数据存储在物理地址不连续的缓存区中。那么CPU通常会为这些不连续的缓存区中的每一个缓存区做一次传输,即每次传输时均重新发起一次DMA命令。或者把这些不连续的缓存区里的数据全都移动到另一个很大的物理地址连续的缓存区里边,然后再发起DMA命令,开始传输。当我们要建立一个从磁盘向内存的数DMA据传输,也是需要通过中间的块移动,将数据块分散到内存中不联续的物理地址中。可见,现有的DMA数据传输方法,数据传输效率较低。
技术实现思路
本专利技术提供一种基于sgl链表的DMA传输方法,以解决现有的DMA数据传输方法,数据传输效率较低的问题。一种基于sgl链表的DMA传输方法,应用于CPU中,包括以下步骤:获取被传输数据,确定所述被传输数据的大小和所有存储地址;配置sglentry链表,用第一寄存器SGLMEN来存储所述sglentry链表,所述sglentry链表包括至少一个sglentry,每个sglentry携带一块存储地址连续的被传输数据的数据大小信息、所述被传输数据的存储地址信息以及下一个sglentry对应的被传输数据的存储地址信息,其中,每个sglentry对应一个index,每个index指向一个第一寄存器中的寄存地址,所述寄存地址连续;确定当前DMA传输对应的sglentry链表的起始sglentry对应的index在第一寄存器SGLMEN中的寄存地址;发起DMA传输命令,将所述DMA传输命令发送至DMA控制器,使得所述DMA控制器根据所述起始sglentry对应的index,从所述SGLMEN中找到相应的起始sglentry后,开始按照所述sglentry中的存储地址传输数据至第二寄存器DATAMEN中。优选的,在上述一种基于sgl链表的DMA传输方法中,所述sglentry链表最大支持2048个sglentry。优选的,在上述一种基于sgl链表的DMA传输方法中,DMA控制器对sglentry中的被传输数据的最小传输单位为512Byte。优选的,在上述一种基于sgl链表的DMA传输方法中,所述发起DMA传输命令,将所述DMA传输命令发送至DMA控制器,使得所述DMA控制器根据所述起始sglentry对应的index,从所述SGLMEN中找到相应的起始sglentry后,开始按照sglentry中的存储地址传输数据至第二寄存器DATAMEN中,具体是指,DMA控制器根据起始sglentry对应的起始sglentryindex,从SGLMEN中找到起始sglentry中对应的第一块存储地址连续的被传输数据的起始存储地址,按照所述起始存储地址将所述起始sglentry中对应的被传输数据,按照所述数据大小信息传输至第二寄存器DATAMEN中;当完成对所述起始sglentry中对应的被传输数据的传输后,从SGLMEN中找到与起始sglentryindex的寄存地址连续的下一个index对应的第二个sglentry,将所述第二个sglentry对应的第二块地址连续的被传输数据,按照第二块地址连续的的起始存储地址将所述第二个sglentry中对应的被传输数据的传输至第二寄存器DATAMEN中。优选的,在上述一种基于sgl链表的DMA传输方法中,还包括:将所述第二寄存器DATAMEN中的地址分区,且获取所述每个分区的边界地址;依次传输所述被传输数据至所述第二寄存器DATAMEN,且实时寄存在第二寄存器DATAMEN的地址中;判断当前寄存的被传输数据在所述第二寄存器DATAMEN中的寄存地址是否为所述边界地址,如果是,则使得下一次传输至第二寄存器的被传输数据存储至分区的起始地址。优选的,在上述一种基于sgl链表的DMA传输方法中,每个sglentry链表中至少包括一个起始sglentryindex,与每个起始sglentryindex向对应的index的寄存地址之间均不连续。优选的,在上述一种基于sgl链表的DMA传输方法中,所述发起DMA传输命令,将所述DMA传输命令发送至DMA控制器,使得所述DMA控制器根据所述起始sglentryindex,从所述SGLMEN中找到相应的起始sglentry后,开始按照sglentry链表中的index传输数据至第二寄存器DATAMEN中之后,还包括:判断是否收到中断请求,如果是,则重新确定当前DMA传输对应的sglentry链表的起始sglentryindex;其中,中断请求是指所述当前DMA传输对应的sglentry链表中的每个index对应储存的sglentry中被传输数据的存储地址和/或下一个sglentry对应的被传输数据的存储地址为无效地址,无法按照所述无效地址传输数据至第二寄存器DATAMEN时,DMA控制器向CPU发出的暂停数据传输的请求。本专利技术提供的一种基于sgl链表的DMA传输方法,数据传输通过sgl链表完成。Sgl链表储存在第一储存器SGLMEN中,该链表由CPU配置,配置所用时间相较现有的DMA传输过程的时间而言极短。需要传输的是原本物理地址不连续的几块数据,这些数据储存在链表中的寄存地址连续的entry中,也就是说被传输的数据在SGLMEN中,每一块连续物理地址的数据被配置在sgl链表中的不同的entry中。这些数据块与数据块之间用sgl链表串联起来,因为链表中的entry对应的index的寄存地址是连续的,所以等同于利用本专利技术提供的方法传输的是是一大块地址连续的数据。所述sgl链表包括至少一个sglentry,每个sglentry对应一快已知大小的被传输数据、所述被传输数据的存储地址以及下一个sglentry对应的被传输数据的存储地址,然后cpu发起数据传输命令,把链表首地址告诉DMA控制器,首地址是指第一个entry中对应的一块地址连续的数据的起始地址。DMA传输完这块物理连续的数据后,就不用再发中断了,而是根据根据链表中指向的下一块物理连续地址的起始地址继续进行传输。当完成此链表中最后一个entry对应的数据传输后,发起一次中断即可完成当次DMA数据传输过本文档来自技高网
...
一种基于sgl链表的DMA传输方法

【技术保护点】
1.一种基于sgl链表的DMA传输方法,应用于CPU中,其特征在于,包括以下步骤:确定当次DMA传输的数据的大小和所有存储地址;配置sgl entry链表,用第一寄存器SGL MEN来存储所述sgl entry链表,所述sgl entry链表包括至少一个sgl entry,每个sgl entry携带一块存储地址连续的被传输数据的数据大小信息、所述被传输数据的存储地址信息以及下一个sgl entry对应的被传输数据的存储地址信息,其中,每个sgl entry对应一个index,每个index指向一个第一寄存器中的寄存地址,所述寄存地址连续;确定当前DMA传输对应的sgl entry链表的起始sgl entry对应的index在第一寄存器SGL MEN中的寄存地址;发起DMA传输命令,将所述DMA传输命令发送至DMA控制器,使得所述DMA控制器根据所述起始sgl entry对应的index,从所述SGL MEN中找到相应的起始sgl entry后,开始按照所述sgl entry中的存储地址传输数据至第二寄存器DATA MEN中。

【技术特征摘要】
1.一种基于sgl链表的DMA传输方法,应用于CPU中,其特征在于,包括以下步骤:确定当次DMA传输的数据的大小和所有存储地址;配置sglentry链表,用第一寄存器SGLMEN来存储所述sglentry链表,所述sglentry链表包括至少一个sglentry,每个sglentry携带一块存储地址连续的被传输数据的数据大小信息、所述被传输数据的存储地址信息以及下一个sglentry对应的被传输数据的存储地址信息,其中,每个sglentry对应一个index,每个index指向一个第一寄存器中的寄存地址,所述寄存地址连续;确定当前DMA传输对应的sglentry链表的起始sglentry对应的index在第一寄存器SGLMEN中的寄存地址;发起DMA传输命令,将所述DMA传输命令发送至DMA控制器,使得所述DMA控制器根据所述起始sglentry对应的index,从所述SGLMEN中找到相应的起始sglentry后,开始按照所述sglentry中的存储地址传输数据至第二寄存器DATAMEN中。2.根据权利要求1所述的一种基于sgl链表的DMA传输方法,其特征在于,所述sglentry链表最大支持2048个sglentry。3.根据权利要求1所述的一种基于sgl链表的DMA传输方法,其特征在于,DMA控制器对sglentry中的被传输数据的最小传输单位为512Byte。4.根据权利要求1所述的一种基于sgl链表的DMA传输方法,其特征在于,所述发起DMA传输命令,将所述DMA传输命令发送至DMA控制器,使得所述DMA控制器根据所述起始sglentry对应的index,从所述SGLMEN中找到相应的起始sglentry后,开始按照sglentry中的存储地址传输数据至第二寄存器DATAMEN中,具体是指,DMA控制器根据起始sglentry对应的起始sglentryindex,从SGLMEN中找到起始sglentry中对应的第一块存储地址连续的被传输数据的起始存储地址,按照所述起始存储地址将所述起始sglentry中对应的被传输数据,按照所述数据大...

【专利技术属性】
技术研发人员:郑文霞彭鹏姜黎
申请(专利权)人:湖南国科微电子股份有限公司
类型:发明
国别省市:湖南,43

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1