at_yukari.hara
2020年10月6日 10時29分
必要なCMA領域のサイズはシステム構成により動的に決まるため、十分なサイズを一概に申し上げることはできません。
CMAサイズを変更する際は、動作に影響がないか、お客様自身で十分に確認を行ってください。
お客様の作成したアプリケーションが動作する領域が不足した際に、CMA領域のサイズを変更したい場合もあるかと思います。
今回は例としてArmadillo-IoT G3LのCMAサイズを標準の320MiBから64MiBに変更をしてみました。
CMA(Contiguous Memory Allocator)とは
ある領域を特別な領域として、普段はユーザプロセス用のメモリとして使用します。
ドライバが要求する場合などいざというときに、ユーザプロセス用のメモリを強制立ち退きさせてDMA用のメモリとして使用可能な技術です。
1.通常のCMAサイズ
Armadilloに電源を投入すると、起動ログに以下のログが表示され、CMAサイズが320MiBであることが確認できます。
>boot …(略) Reserved memory: created CMA memory pool at 0xac000000, size 320 MiB …(略)
2.サイズの変更方法
DeviceTreeの以下ファイルの"size"を変更することで、CMAサイズの変更が可能です。
/linux-4.9-x1-at[バージョン]/arch/arm/boot/dts/imx7d.dtsi
以下修正箇所
reserved-memory { #address-cells = <1>; #size-cells = <1>; ranges; /* global autoconfigured region for contiguous allocations */ linux,cma { compatible = "shared-dma-pool"; reusable; size = <0x14000000>; /* こちらを変更 */ linux,cma-default; }; };
"size"は16進数で指定しますので、64MiBに変更したい場合は、以下のように変更します。
size = <0x4000000>;
3.ビルド
Linuxカーネルをビルドして、イメージを書き換えます。
イメージの書き換え方法はマニュアルをご参照ください。
4.確認
イメージを書き換えてArmadilloに電源を投入すると、起動ログに以下のログが表示され、CMAサイズが64MiBに変更されたことが確認できます。
>boot …(略) Reserved memory: created CMA memory pool at 0xbc000000, size 64 MiB …(略)