- 论坛徽章:
- 0
|
我改了个函数,或许能满足你的要求,用户态分配内存的虚拟地址你自己传下来,然后用这个函数得到pfn,pfn<<PAGE_SHIFT就是物理地址,即可以直接把物理地址给设备做DMA。此外在用户态要用mlock锁住内存不要swap出去
- pfn_t userpage_to_pfn(unsigned long user_va)
- {
- struct page *page[1];
- int npages;
- pfn_t pfn;
- might_sleep();
- npages = get_user_pages(current, current->mm, user_va, 1, 1, 1, page,
- NULL);
- if (unlikely(npages != 1)) {
- struct vm_area_struct *vma;
- vma = find_vma(current->mm, user_va);
- if (vma == NULL || user_va < vma->vm_start ||
- !(vma->vm_flags & VM_PFNMAP)) {
- get_page(bad_page);
- return page_to_pfn(bad_page);
- }
- pfn = ((user_va - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff;
- } else
- pfn = page_to_pfn(page[0]);
- return pfn;
- }
复制代码 |
|