我们讨论的前提是物理地址的映射关系建立之后, 这个虚拟地址是用户空间用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是个通用的方法, 对于什么样虚拟地址都可以这样转换
本文探讨了在不同内存区域中,如何将虚拟地址转换为物理地址。详细介绍了使用virt_to_phys函数在低端内存中的应用,以及在高端内存中通过锁定用户页面并利用PFN_PHYS函数进行转换的通用方法。
589

被折叠的 条评论
为什么被折叠?



