私は、2.6.35.3カーネルの組み込みLinuxシステムで作業しています。ARM i.MX287のLinux DMA_ZONEメモリを増やす
デバイス内では、データキャプチャドライバの1つに4MB + 192kBの連続DMA対応バッファが必要です。ドライバはSPI転送を使用してこのバッファにデータをコピーします。
ユーザー空間アプリケーションは、バッファをユーザー空間にマップするためのmmapシステムコールを発行し、その後、利用可能なデータを直接読み取ります。
kmallocなどの他のメソッドを使用して4 MBを超えるバッファを割り当てることができないため、バッファはalloc_bootmem_low_pagesコールを使用して割り当てられます。
しかし、最近のアップグレードのために、バッファ領域を22MB + 192kBに増やす必要があります。私が読んだとおり、Linuxカーネルには16MBのDMA対応メモリしかありません。したがって、理論的には、この設定を微調整する方法がない限り、これは不可能です。
これを実行する方法を知っている人がいる場合は、教えてください。
これは良い考えですか、これがシステムを不安定にしますか?
alloc_bootmem_pagesは、[リンク](https://www.kernel.org/doc/gorman/html/understand/understand008.html)に従ってZONE_NORMALからメモリを割り当てるのが理想的です。しかし私の場合、起動時にカーネルパニックが発生し、ダンプを解析すると、dma_alloc_coherent呼び出しによってパニックが引き起こされることがわかりました。 alloc_bootmem_pagesがZONE_NORMALからメモリを割り当てている場合、どのようにこの種のカーネルパニックが起こりますか?私はこれが別の質問であるべきだと思います。 –
あなたのドライバが 'dma_alloc_coherent'を直接呼び出していないと思います。カーネルパニックのエラーメッセージとは何ですか?バックトレースは 'dma_alloc_coherent'がドライバ(とくに' alloc_bootmem_pages'コール内)から呼び出されたことを示していますか?また、どのような組み込みアーキテクチャですか? –
これは私のドライバではなく、dma_alloc_coherentを呼び出すイーサネットドライバがいくつかあります。私はすべてのメモリを割り当てているので、システム内の他のドライバの中には、必要なDMAバッファを割り当てることができないものがあります。カーネルパニックは、メモリ不足だと言います。私のアーキテクチャはARM iMX287です。 –