yxchugo 发表于 2012-06-22 10:18

[求助]小弟在读LDD3内存映射一章遇到一个看不懂的地方

这本书的第十五章,也就是内存映射和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结构体的定义,来看都不明白这一句求出的偏移量是什么东西,哪位前辈了解的,希望不要吝啬解释一下。
先谢谢啦!
页: [1]
查看完整版本: [求助]小弟在读LDD3内存映射一章遇到一个看不懂的地方