9

LDD3/Chから。15 /セクション「remap_pfn_rangeの使用」および「単純な実装」では、pfnはvm_pgoffフィールドと同等になっています。私はこれに混乱しています。どうしてそうなるのでしょうか?

vm_pgoffは次のように記述されていることに注意してください。

ファイル内の領域のオフセット(ページ単位)。ファイルまたはデバイスがマップされる場合、これはこの領域にマップされる最初のページのファイル位置です。

したがって、マップされた最初のページがファイルの最初のページにも対応している場合(これは非常に一般的だと思います)、vm_pgoffは0になります。正しいですか?その場合、これはremap_pfn_range()のpfnパラメーターの正しい値ではないようです。ここで何が欠けていますか?正しい値は何ですか?参照しやすいように、以下のLDD3(ページ番号426)から関連するコードを複製しています。

static int simple_remap_mmap(struct file *filp, struct vm_area_struct *vma)
{
if (remap_pfn_range(vma, vma->vm_start, vm->vm_pgoff,
                    vma->vm_end - vma->vm_start,
                    vma->vm_page_prot))
    return -EAGAIN;
...
}
4

1 に答える 1

5

あなたが提供した特定の例は、/ dev / memと非常によく似た、物理メモリをマップできる文字デバイスファイルの実装です。ファイルのオフセットを指定することにより、物理メモリアドレスを指定します。したがって、オフセットを取得し、ページサイズで除算してPFNを見つける計算。

「実際の」デバイスドライバの場合、通常、デバイスメモリマップドレジスタまたはRAMの物理アドレスをデバイス仕様からハードコーディングし、それを使用してPFNを(ページサイズで割って)導出します。

于 2012-07-16T05:29:42.977 に答える