- 论坛徽章:
- 0
|
这本书的第十五章,也就是 内存映射和DMA,“使用nopage映射内存”一节,在423页下面有个例子。代码如下- /*
- * The nopage version.
- */
- 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;
- // Eventually remove these printks
- printk (KERN_NOTICE "---- Nopage, off %lx phys %lx\n", offset, physaddr);
- printk (KERN_NOTICE "VA is %p\n", __va (physaddr));
- printk (KERN_NOTICE "Page at %p\n", virt_to_page (__va (physaddr)));
- if (!pfn_valid(pageframe))
- return NOPAGE_SIGBUS;
- pageptr = pfn_to_page(pageframe);
- printk (KERN_NOTICE "page->index = %ld mapping %p\n", pageptr->index, pageptr->mapping);
- printk (KERN_NOTICE "Page frame %ld\n", pageframe);
- get_page(pageptr);
- if (type)
- *type = VM_FAULT_MINOR;
- return pageptr;
- }
复制代码 小弟我不懂这一行:- unsigned long offset = vma->vm_pgoff << PAGE_SHIFT;
复制代码 我结合wm_area_struct 结构体的定义,来看都不明白这一句求出的偏移量是什么东西,哪位前辈了解的,希望不要吝啬解释一下。
先谢谢啦! |
|