我们讨论的前提是物理地址的映射关系建立之后, 这个虚拟地址是用户空间用malloc等分配的内存地址,而在内核空间分配的就比较简单
1. 当我们分配内存位于高端内存下
phyAddr = virt_to_phys(virtAddr);
2.如果分配的内存位于高端内存时:
phyAddr = virt_to_phys(virtAddr);这个函数就不行了, 这个是函数是用户线程映射部分,
而高端内存映射情况就不清楚了
我们可以根据页来计算物理地址
先我把用户空间的页面锁在内存中
down_read(¤t->mm->mmap_sem);
result = get_user_pages(current, current->mm,
user_addr, data->npages, 0, 0,
data->pagevec, NULL);
up_read(¤t->mm->mmap_sem);
if (result < 0) { nfs_writedata_release(data);
break; }
然后
phyAddr = PFN_PHYS(page_to_pfn(pages[pageIdx]));
方法2是个通用的方法, 对于什么样虚拟地址都可以这样转换