ページなしの方法で仮想アドレスが物理アドレスにどのように変換されるかは誰でも知っています。Device Drivers book を参照すると、nopage メソッドは次のように指定されます。
struct page *simple_vma_nopage(struct vm_area_struct *vma,
unsigned long address, int *type)
{
struct page *pageptr;
unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
unsigned long physaddr = address - vma->vm_start + offset;
unsigned long pageframe = physaddr >> PAGE_SHIFT;
if (!pfn_valid(pageframe))
return NOPAGE_SIGBUS;
pageptr = pfn_to_page(pageframe);
get_page(pageptr);
if (type)
*type = VM_FAULT_MINOR;
return pageptr;
}
page_shift は、仮想メモリ アドレスと物理メモリ アドレスのオフセットを表すために使用されるビット数です。しかし、オフセット変数とは何ですか? address や vm_start などの仮想アドレス変数の算術演算から物理アドレスを計算する方法は?