任何人都知道如何在无页面方法中将虚拟地址转换为物理地址。参考设备驱动程序手册,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 等虚拟地址变量的算术运算计算物理地址?