2017-06-06 8 views
2

私は、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対応メモリしかありません。したがって、理論的には、この設定を微調整する方法がない限り、これは不可能です。

これを実行する方法を知っている人がいる場合は、教えてください。

これは良い考えですか、これがシステムを不安定にしますか?

答えて

2

ZONE_DMA 16MBの制限は、特定のデバイスのハードウェア制限によって課されます。具体的には、旧式のPCアーキテクチャでは、のDMAを実行するカードは、物理アドレス空間の最初の16MBに割り当てられたバッファを必要としました。これは、ISAインタフェースに最初の2^24 = 16MB物理メモリ。したがって、これらのカードのデバイスドライバは、このハードウェア制限に対応するためにDMAバッファをZONE_DMA領域に割り当てます。

組み込みシステムとデバイスのハードウェアによっては、デバイスに制限があります。この制限が適用される場合、デバイスが22MBのメモリブロックをアドレス指定できるようにするためのソフトウェア修正はありません。また、DMAアドレス空間を16MB以上に拡張する場合はもちろんシステム不安定になる。

一方、デバイスがこの制限の対象でない場合(22MBバッファに書き込む唯一の方法)、ZONE_DMAにメモリを割り当てる理由はありません。この場合、alloc_bootmem_low_pagesコールをalloc_bootmem_pagesコールに置き換えるだけで、22MBのバッファを割り当てても問題ありません。システムが不安定になった場合は、デバイスがハードウェア制限の対象となるであり、にはに22MBバッファを使用できない可能性があります。

+0

alloc_bootmem_pagesは、[リンク](https://www.kernel.org/doc/gorman/html/understand/understand008.html)に従ってZONE_NORMALからメモリを割り当てるのが理想的です。しかし私の場合、起動時にカーネルパニックが発生し、ダンプを解析すると、dma_alloc_coherent呼び出しによってパニックが引き起こされることがわかりました。 alloc_bootmem_pagesがZONE_NORMALからメモリを割り当てている場合、どのようにこの種のカーネルパニックが起こりますか?私はこれが別の質問であるべきだと思います。 –

+0

あなたのドライバが 'dma_alloc_coherent'を直接呼び出していないと思います。カーネルパニックのエラーメッセージとは何ですか?バックトレースは 'dma_alloc_coherent'がドライバ(とくに' alloc_bootmem_pages'コール内)から呼び出されたことを示していますか?また、どのような組み込みアーキテクチャですか? –

+0

これは私のドライバではなく、dma_alloc_coherentを呼び出すイーサネットドライバがいくつかあります。私はすべてのメモリを割り当てているので、システム内の他のドライバの中には、必要なDMAバッファを割り当てることができないものがあります。カーネルパニックは、メモリ不足だと言います。私のアーキテクチャはARM iMX287です。 –

0

私の最初の試みは答えがあまりにも一般的すぎるようです。私は特定のi.MX287アーキテクチャーについてコメントで言及していると思いますが、DMAゾーンのサイズは、パラメータで設定可能なです。これは32Megsほど大きくすることができます。関連する構成オプションは、「システムタイプ - >フリースケールi.MXS実装 - > DMAメモリゾーンサイズ」の下にある必要があります。

このアーキテクチャでは、ハードウェアの制限(x86アーキテクチャ上の方法)に対処するのではなく、メモリのレイアウト方法を決定するように見えるので、変更するのが安全だと思われます。

ドライバを32Megに設定して、自分のドライバでalloc_bootmem_pagesalloc_bootmem_low_pagesの両方をテストしようとすると、そのうちの1つが動作する可能性があります。

そうでなければ、アイデアが足りないと思います。

関連する問題