当前位置:   article > 正文

LINUX内存池实现_arm linux 内存池

arm linux 内存池

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地址的统一性方案

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/292376
推荐阅读
相关标签
  

闽ICP备14008679号