linux 物理地址的映射关系

我们讨论的前提是物理地址的映射关系建立之后, 这个虚拟地址是用户空间用malloc等分配的内存地址,而在内核空间分配的就比较简单


1. 当我们分配内存位于高端内存下 
 phyAddr = virt_to_phys(virtAddr);

2.如果分配的内存位于高端内存时:
 phyAddr = virt_to_phys(virtAddr);这个函数就不行了, 这个是函数是用户线程映射部分,
而高端内存映射情况就不清楚了

我们可以根据页来计算物理地址
先我把用户空间的页面锁在内存中
down_read(&current->mm->mmap_sem);
result = get_user_pages(current, current->mm,
user_addr, data->npages, 0, 0,
data->pagevec, NULL);
up_read(&current->mm->mmap_sem);
if (result < 0) { nfs_writedata_release(data);
break; }

然后
phyAddr = PFN_PHYS(page_to_pfn(pages[pageIdx]));

方法2是个通用的方法, 对于什么样虚拟地址都可以这样转换
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值