虚拟地址转换为物理地址
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
我们讨论的前提是物理地址的映射关系建立之后, 这个虚拟地址是用户空间用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是个通用的方法, 对于什么样虚拟地址都可以这样转换