赞
踩
在LINUX应用程序中,业务需求上需要利用DMA来进行数据搬移的操作,但由于LINUX应用程序中访问的都是虚拟地址,且这个虚拟地址对应的物理地址并不一定是连续的。而DMA的操作是针对物理地址来实现的,且必须是连续的物理地址,来满足突发数据的传输。这就涉及到如何来处理虚拟地址与DMA操作之间的关系了。
实现虚拟地址和DMA地址之间的统一性,可以利用如图1所示的方法:
1在DDR上先预留160M内存给DMA使用,将160M内存的首地址(物理地址)通过地址映射,得到虚拟地址,此虚拟地址就是这160M内存的起始地址对应的物理地址,应用程序可以通过访问虚拟地址来实现对这160M内存的读写。
2对这160M的连续物理地址的内存需要进行管理,保证用户在使用DMA时,通过在这160M的空间中申请内存,来保证DMA操作的可行性。
在LINUX应用程序中,业务需求上需要利用DMA来进行数据搬移的操作,但由于LINUX应用程序中访问的都是虚拟地址,且这个虚拟地址对应的物理地址并不一定是连续的。而DMA的操作是针对物理地址来实现的,且必须是连续的物理地址,来满足突发数据的传输。这就涉及到如何来处理虚拟地址与DMA操作之间的关系了。
实现虚拟地址和DMA地址之间的统一性,可以利用如图1所示的方法:
1在DDR上先预留160M内存给DMA使用,将160M内存的首地址(物理地址)通过地址映射,得到虚拟地址,此虚拟地址就是这160M内存的起始地址对应的物理地址,应用程序可以通过访问虚拟地址来实现对这160M内存的读写。
2对这160M的连续物理地址的内存需要进行管理,保证用户在使用DMA时,通过在这160M的空间中申请内存,来保证DMA操作的可行性。
图1. 虚拟地址与DMA地址的统一性方案
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。