gpu模拟器内存使用

本文详细描述了Linux系统中虚拟内存管理和页表分配的过程,涉及显存拷贝、虚拟内存地址计算、物理页的分配及页表的walk函数,解释了如何从根页表开始逐级分配,直到满足分配需求,以及MMU如何转换虚拟地址为物理地址的应用场景。
摘要由CSDN通过智能技术生成

情况一

        比如一开始的显存拷贝,需要先开辟设备端地址

我们有记录已经使用的虚拟内存,那么最新的虚拟内存分配地址是放在后边的,所以根据sz和已经使用了的虚拟内存我们能够得到这次虚拟内存的起始和结束地址

现在需要为这次映射消耗实际物理页号和页表

mem现在是返回符合需要大小的物理页的起始地址

所以拿到物理页之后,我们把物理页清0,然后把它映射在我们的根页表上

先看walk函数,参数前两个分别是根页表的起始地址和这次要分配的虚拟地址的起始,因为映射也是需要分配物理页表的,所以这里可以看到如果是没有分配的,我们会分配一个物理页表,然后把它映射到表上。总的来说,这个walk对于这次做的事情是

1、看a虚拟地址对应的二级页表是否分配,如果没有,就分配

2、看a虚拟地址对应的一级页表是否分配,如果没有,就分配

最后返回的是a虚拟地址对应的最后一级页表的页表项地址

接着我们回到上一级来看。传入参数是根页表,起始地址,大小,以及申请的物理页总和的起始地址

这里512-L0就是这个原因,从最后一级页表往上分配。

这里就是要把最后一集的页表项和物理地址关联起来,64位地址,由于物理页是按照4096来划分的,就是2^12次方,所以物理页一页的起始地址总是低位为12个0,所以变成页表项目就需要右移12位然后左移10位,低10位是标志之类的。

其实就是反过来找实际物理页的时候,我们pte里存的也不需要低12位,因为总是0,我们只需要拿到前面的位,然后右移10位,左移12位就可以了。

那么最里面的for循环干的事情就是一直循环0级页表,直到填满或者满足分配大小为止。

当跳出内层循环的时候,如果还不满足分配大小,说明0级页表已经分配完了,那么就在1级页表上再找一个项,然后再分配,同理2级页表也是如此,直到分配完毕

这里注意每次分配映射一个物理页的时候,a和pa都是+=pagesize的,a是看虚拟内存是分配完毕,pa是找到下一个要分配的物理页地址。

最后我们返回虚拟地址,那么记住这个地址,利用mmu转换就能操作实际的物理地址(对于模拟器而言)

这里的参数是根页表,需要传的虚拟地址,原数据地址,长度,这里很显然就是一页页去操作实际物理页赋值。

  • 11
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值