3

複数の物理的に連続していないメモリ バッファを単一の線形ユーザー空間アドレスにマッピングしています。私は 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 に配置します
    
提案/ポインタをありがとう。ダン。

4

1 に答える 1