デバイスメモリのページフレーム番号はどのように決定しますか? 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;
...
}