6

カーネル空間に複数のバッファーを割り当てるカーネルドライバーがあります (物理的に連続し、ページ境界に整列し、整数のページで構成されます)。次に、ドライバーがこれらのバッファーの一部をユーザー空間に mmap できるようにする必要があります (もちろん、mmap() 呼び出しごとに 1 つのバッファー)。ドライバーは、その目的のために単一文字デバイスを登録します。ユーザー空間プログラムは、mmap したいバッファーをカーネルに伝えることができなければなりません (たとえば、そのインデックスまたは一意の ID、または以前に ioctl() によって解決された物理アドレスを指定することによって)。

たとえば、(ユーザー空間から) mmap() のオフセット パラメータを使用して、これを行いたいと考えています。

mapped_ptr = mmap(NULL, buf_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, (MAGIC + buffer_id) * PAGE_SIZE);

「MAGIC」はマジックナンバーで、buffer_idはmmapしたいバッファIDです。次に、カーネル部分には次のようなものがあります。

static int my_dev_mmap(struct file *filp, struct vm_area_struct *vma)
{
  int bufferID = vma->vm_pgoff - MAGIC;
  /* 
   * Convert bufferID to PFN by looking through driver's buffer descriptors
   * Check length = vma->vm_end - vma->vm_start
   * Call remap_pfn_range()
   */
}

mmap() の「オフセット」はインデックスまたは識別子を指定することを想定していないため、その役割は、mmap-ed デバイスの先頭からスキップされたバイト (またはページ) の数を提供することです。 (またはファイル)メモリ(連続していると思われますよね?)。

ただし、メインラインで、「オフセット」を使用して mmap-ed バッファーを区別するドライバーをいくつか見てきました。

これに代わる解決策はありますか?

PS 物理的に隣接し、8 バイトの境界メモリ バッファーに配置されている場合にのみ動作する、いくつかの異常な SoC のグラフィックス コントローラーを扱っているという理由だけで、これらすべてが必要です。そのため、そのようなバッファーはカーネル空間にのみ割り当て、mmap() を介してユーザー空間に渡すことができます。

コントローラーのプログラミング (命令バッチの作成とカーネル ドライバーへのプッシュ) の大部分は、ユーザー空間で実行されます。また、物理的に連続したメモリの単一の大きなチャンクを割り当てることはできません。その場合、非常に大きくする必要があり (たとえば、16 + MiB)、alloc_pages_exact() が失敗するためです。

4

2 に答える 2

1

最後に、開いている 1 つのデバイス ファイル記述子 (カーネル内の構造体ファイル) ごとに正確に 1 つのバッファーを mmap し、ioctl() を介して制御を実装することを選択しました。1 つの IOCTL は新しいバッファーを割り当てるため、もう 1 つは既知の ID を持つ既に割り当てられたバッファーにアタッチするためです。バッファに関する情報を取得するための別のもの。通常、ユーザー空間は同時に約 10..20 個のバッファーを mmap() するため、この場合には適切でクリーンなソリューションです。

于 2012-09-10T19:50:15.117 に答える
1

オフセットを使用してユーザー空間からドライバーにインデックスを渡すことに問題はありません。バグがある場合は、ドライバーが個々のページから大きなバッファーを組み立てて、実質的に連続してユーザー空間に提示したいので、オフセットが実際にはこのバッファーへのオフセットであることを確認してください。しかし、私の意見では、このように物事を行うことに何の問題もありません。

別の方法として、カーネル 3.5 以降を使用できる場合は、"Contiguous Memory Allocator" (CMA) を使用することもできます。詳細については、<linux/dma-contiguous.h>およびdrivers/base/dma-contiguous.cを参照してください。参照としてhttps://lwn.net/Articles/486301/もありますが、その記事とコードがメインラインにマージされるまでに (もしあれば) どれだけ変更されたかはわかりません。

于 2012-09-09T21:12:39.077 に答える