petalinux 保留一段專用記憶體給你的驅動程式

2021-10-03 05:56:07 字數 3436 閱讀 7305

在實際應用中,需要保留一段專用記憶體,給驅動程式或者應用程式,比如給pl 訪問的一段記憶體,用於查表,等等。

來自參與的問題:

其中重要的參考來自:

要從系統位址空間保留記憶體範圍,可以在裝置樹配置中使用保留的記憶體節點。 每個子節點定義乙個特定的記憶體空間,並且可以根據核心文件中所述可用於保留記憶體節點的不同引數進行配置。 然後可以通過memory-region引數將保留的儲存空間分配給特定的裝置驅動程式。

用於64位cortex-a53 mpsoc的system-top.dts檔案中的裝置樹節點:

reserved-memory ;}; 

reserved-driver@0 ;

或者在基於yocto的petalinux project-spec / meta-user / recipes-bsp / device-tree / files / system-user.dtsi 中針對32位cortex-a9 zynq進行定製的類似裝置樹節點:

/include/ "system-conf.dtsi"

/ ; };

reserved-driver@0 ;

};

在裝置驅動程式中,可以通過解析裝置樹節點來處理記憶體區域的屬性,並且一旦知道了實體地址和大小,就可以使用memremap / ioremap呼叫來對映記憶體區域。 下面的**引用了保留的記憶體分配:

/* get reserved memory region from device-tree */

np = of_parse_phandle(dev->of_node, "memory-region", 0);

if (!np)

rc = of_address_to_resource(np, 0, &r);

if (rc)

lp->paddr = r.start;

lp->vaddr = memremap(r.start, resource_size(&r), memremap_wb);

dev_info(dev, "allocated reserved memory, vaddr: 0x%0llx, paddr: 0x%0llx\n", (u64)lp->vaddr, lp->paddr);

由於保留的記憶體區域已被核心排除以用於通用,並標記為無對映,因此iomem資訊(/ proc / iomem)顯示系統ram小於板上的記憶體量。

root@plnx_aarch64:~# cat /proc/iomem

00000000-6fffffff : system ram

00080000-00b37fff : kernel code

011c9000-012b8fff : kernel data

once the device is loaded, the allocation can be confirmed:

[  126.191774] reserved-memory reserved-driver@0: device tree probing

[ 126.198595] reserved-memory reserved-driver@0: allocated reserved memory, vaddr: 0xffffff8020000000, paddr: 0x70000000

通常,保留記憶體空間與dma引擎一起使用,因此從裝置驅動程式的角度來看,整合這兩個框架可能很有用。 對於該特定目的,可以將相容屬性設定為shared-dma-pool,從而生成為特定裝置驅動程式保留的dma記憶體池。

reserved-memory ;

};reserved-driver@0 ;

這樣,裝置驅動程式僅需要以常規方式使用dma api,但無需使用預設的cma記憶體池,而是將為此特定裝置使用保留的記憶體區域。

/* initialize reserved memory resources */

rc = of_reserved_mem_device_init(dev);

if(rc)

/* allocate memory */

dma_set_coherent_mask(dev, 0xffffffff);

lp->vaddr = dma_alloc_coherent(dev, alloc_size, &lp->paddr, gfp_kernel);

dev_info(dev, "allocated coherent memory, vaddr: 0x%0llx, paddr: 0x%0llx\n", (u64)lp->vaddr, lp->paddr);

核心日誌是這樣的:

[    0.000000] reserved memory: created dma memory pool at 0x0000000070000000, size 256 mib

[ 0.000000] reserved memory: initialized node buffer@0, compatible id shared-dma-pool

[ 0.000000] cma: reserved 128 mib at 0x0000000068000000

在啟動驅動程式後,核心日誌是這樣的: 

root@plnx_aarch64:~# insmod /lib/modules/4.6.0-xilinx/extra/reserved-memory.ko

[ 80.745166] reserved-memory reserved-driver@0: device tree probing

[ 80.750183] reserved-memory reserved-driver@0: assigned reserved memory node buffer@0

[ 81.220878] reserved-memory reserved-driver@0: allocated coherent memory, vaddr: 0xffffff8020000000, paddr: 0x70000000

有時,不需要將保留的記憶體區域分配給特定的裝置驅動程式,而只打算擁有比預設的更大的cma記憶體池。 對於該特定用例,可以使用乙個額外的屬性來指向核心,以將保留的記憶體區域用作預設的cma記憶體池。

reserved-memory ;

};

核心日誌是這樣的:

[    0.000000] reserved memory: created cma memory pool at 0x0000000070000000, size 256 mib

[ 0.000000] reserved memory: initialized node buffer@0, compatible id shared-dma-pool

重要的一段

2006 6 23 22 44 00 重要的一段 這幾個月都用在開發心電監護系統上了,終於告一段落,倍感輕鬆。欣慰的是,有了成果,並且成果正走在產品化路上。5月31日,孕育 設計監護儀樣機結構和pcb 6月7日,生日 pcb板製好,開始焊接和除錯 6月17日,tata,監護儀終於可以見人了。介紹一下...

一段SQL指令碼

create table gc col1 char 10 drop table gc 處理引數 declare str varchar 100 select str 1,2,3,4,5 插入處理 declare s varchar 8000 select s select replace str,u...

String擷取一段

1.若知道要從第幾個位置開始擷取,可以直接選用substring 方法 2.若不知道要從哪邊開始擷取,但是知道string中要從哪段開始,只是要中間一段字串 如 string str age 20 address sz name mason int begin str.indexof address...