zynq平臺,PS 與 PL共享內存的方法

開發環境:Ubuntu18.04

軟件環境:Linux內核、uboot源碼及FPGA程序

硬件環境:zynq 開發板 mz7100

 

關於本文中所述問題,PS(arm Linux)與(FPGA) 共享的事PS端的內存。開發板的內存共有1G(0x00000000 ~ 0x40000000),其中768M(0x00000000 ~ 0x30000000)爲Linux操作系統所擁有,剩餘256M(0x30000000 ~ 0x40000000)作爲PS與PL共用的內存。

這樣,就需要解決解決Linux系統預留內存的問題,解決該問題有兩種方法:一種是通過配置uboot啓動參數,另一種是修改Linux源碼,我採用了第一種。

 

1、配置uboot啓動參數。

我們採用配置uboot啓動參數的方式,把Linux系統可佔用的內存空間限定到了 768M,參數如下:

optargs=mem=768M ethaddr=00:0a:35:00:01:20 cma=128M

其中,mem=768M 就是配置的啓動參數。這樣做的好處是,在不修改內核源碼的情況下,就可以輕鬆的解決內存預留的問題,不足之處在於,這樣只能預留高地址段的內存,系統會自動把低地址段的內存分配至系統。

 

2、通過修改內核源碼的方式

通過 memblock_free、memblock_remove兩個函數來釋放掉指定物理地址。

個人理解是,這種方式相當於先讓內核佔用完整的內存,並建立內存映射表,然後通過這兩個函數,再釋放掉指定物理地址的映射關係,達到內存預留的目的。這種方法的好處在於可以可以靈活的實現內存預留,想預留那塊內存您做主,不便之處在於需要修改內存。

推薦一個帖子:https://www.uisrc.com/forum.php?mod=viewthread&tid=2506&extra=

 

另:

解決完內存共享的問題以後,我們需要把VDMA輸入的視頻流(HDMI)寫入到共享的內存中,在調試vdma的驅動時,發現dma

申請內存總是失敗。經過查看內核允許申請最大連續內存是16M(左圖),而我們的DMA需要申請的連續內存是64M,因此會報錯,通過配置參數 cma=128M,把內核允許申請連續內存的大小改爲128M(右圖),這樣就滿足了我們的需求,解決了驅動的問題。

 

 

 

 

 

 

 

 

 

 

 

 

 

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