應用背景
在嵌入式系統開發中,ARM 和 FPGA 之間的通信可以使用 ARM 側的 DDR 作為通道。由于 FPGA 也可以直接訪問到 ARM 側 DDR,但 DDR 作為共享通信時,就不能被操作系統的內存管理子系統管理。因此,需要預留一部分物理內存,使其不被內核管理。接下來將為大家詳細介紹在 Linux 系統中通過預留物理內存實現 ARM 與 FPGA 高效通信的方法,預留物理內存包括 memreserve、Linux 內核啟動參數 cmdline 和 Linux Reserved-Memory 三種方案。
Linux 內存管理概述
Linux 內存管理的主要目標是滿足進程 (Process) 對內存的需求,同時最大限度地利用有限的內存資源。為了實現這個目標,Linux 內存管理采用了一系列的技術和策略,包括虛擬內存 (Virtual Memory)、頁式內存管理 (Paging)、交換空間 (Swap Space) 等。
在 Linux 內存管理內部是一個復雜的系統,由多個組件和子系統構成,共同協作,實現高效的內存使用。其中包含物理內存管理 (Physical Memory Management),虛擬內存管理 (Virtual Memory Management),內存分配器 (Memory Allocator),交換空間管理 (Swap Space Management)。通過內存管理系統,整個物理內存被有效管理。默認情況下,是對整個物理內存進行管理。
為特定的應用或者設備預留一部分物理內存做指定用途,這部分內存不受 Linux 內存系統管理,在需要使用的時候再對這部分內存進行管理,這就是內核中提供的 Reserved Memory 機制。
預留內存三種方法
1. Memreserve
通過設備樹的 memreserve 分配的內存,無法再被操作系統使用。因此這種方案不建議在共享 DDR 的方案中使用。如內核源碼目錄下arch/arm/boot/dts/socfpga_cyclone5.dtsi。
圖1 CycloneV SoC 設備樹 Memreserve 節點
2. Linux 內核啟動參數 cmdline
Linux 內核啟動參數 cmdline 提供了啟動選項。其中 mem 選項用來設置系統內存的 size,也即操作系統管理的物理內存 size。當 mem 指定的 size 小于實際物理內存 size,剩余的部分不受 Linux 的內存管理系統管理。如 SoC FPGA 有 4G 物理內存,當 mem=3G 時,末尾的 1G 高端內存,不受操作系統管理。
3. Linux Reserved Memory 預留內存機制
Reserved Memory,顧名思義,把系統中的一部分內存保留,內核不會為它建立頁表,在內核初始化過程中,解析該 reserved-memory 節點時,會將該段地址從 memblock 模塊中移除。一般應用程序不能訪問這段內存。如內核源碼目錄下arch/arm64/boot/dts/altera/socfpga_stratix10.dtsi,下圖 (圖2) 為設備樹節點:
圖2 設備樹節點
關鍵參數:
通過 reg 參數,指定保存內存的特定范圍
通過 no-map,指定操作系統不允許創建虛擬映射
通過 compatible=,這塊內存會被用來進行 Contiguous Memory Allocator for dma
總結
本文主要介紹了 Linux 系統中通過預留物理內存實現 ARM 與 FPGA 高效通信的方法,預留物理內存包括 memreserve、Linux 內核啟動參數 cmdline 和 Linux Reserved-Memory 三種方案。但在選擇具體實現方式時,應根據系統的動態需求、內存管理要求和硬件特性進行權衡。
-
FPGA
+關注
關注
1643文章
21957瀏覽量
614038 -
ARM
+關注
關注
134文章
9306瀏覽量
374990 -
嵌入式系統
+關注
關注
41文章
3665瀏覽量
130896 -
Linux
+關注
關注
87文章
11459瀏覽量
212782
原文標題:Linux 中 ARM 與 FPGA 通信的預留內存三種實現方案
文章出處:【微信號:駿龍電子,微信公眾號:駿龍電子】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
評論