複数の物理的に連続していないメモリ バッファを単一の線形ユーザー空間アドレスにマッピングしています。私は vm_insert_page() と get_page() を使用します。割り当てられたすべてのページで get_page() を使用する必要があるのは、特定のバッファーの最初のページのみが 0 を超える参照カウントを持ち、vm_insert_page() は 0 を超える参照カウントを必要とするためです。おそらく (ネット上のいくつかの投稿によると) 私は不要になった場合は、 get_page() を呼び出して参照カウントをインクリメントするページを「解放」する必要があります。ただし、ページを「解放」する方法がよくわかりません。get_page() によって返される各ページ構造体を追跡し、対応する API を呼び出して、マッピング解除中にページを解放する必要がありますか? OSが自動的にそれを行うようには見えません。つまり、ユーザープロセスが存在した後、
私の疑似コードは次のようなものです:
pci_alloc_consistent() への呼び出しを使用して、複数の phys 非連続メモリ バッファを割り当てます。 上記で割り当てられたすべてのバッファ内のすべての 4K チャンクに対して virt_to_page(phys_chunk_addr) を使用してページ構造体を作成します // phys バッファの最初のページだけなので、これが必要です // vm_insert_page() で必要な参照カウント > 0 になります! get_page() を呼び出してページ参照カウントをインクリメントします vm_insert_page() を使用してページを vma に配置します提案/ポインタをありがとう。ダン。