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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章