Posted at

Linuxでユーザー空間で動作するプログラムとハードウェアがメモリを共有するためのデバイスドライバ(メモリ不足の場合)

More than 3 years have passed since last update.

前回投稿した「Linuxでユーザー空間で動作するプログラムとハードウェアがメモリを共有するためのデバイスドライバ」で紹介したudmabufでは、dma_alloc_coherent()を使ってカーネル空間上にDMAバッファを確保しています。

カーネルのバージョンやビルド時のパラメータにもよりますが、通常はdma_alloc_coherent()はCMA(Continuous Memory Allocator)という仕組みを使ってバッファを確保しています。このCMAは確保できる"総容量"が決まっており、通常は16Mバイトです。したがって udmabuf ではこれを越えるバッファサイズを確保しようとすると失敗します。

実はCMAで確保できる総容量はカーネル起動時のパラメータで指定できます。例えば、devicetree に次のように指定すれば、CMAバッファの最大バイト数を128Mバイトに変更できます。


devicetree.dts


chosen {
bootargs = "console=ttyPS0,115200n8 consoleblank=0 root=/dev/mmcblk0p2 rw rootwait earlyprintk cma=128M";
linux,stdout-path = "/amba@0/serial@e0001000";
};

当然、物理メモリ以上の容量は指定できませんし、あまり大きな値を指定すると他のプロセスに支障が出るので注意してください。