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

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