linux mmu的实现的讲解_MMU工作原理及其实现

MMU

MMU,Memory Management Unit,存储管理单元。

MMU的工作流程为:首先,配置一个地址映射表的基地址。然后,每输入一个虚拟地址则输出一个物理地址。地址映射表可以简单认为是虚拟地址和物理地址的映射关系表,该表由驱动程序生成,存储于DDR(显存)中。

a3fa29a95ef659e6ad39fff82c37be0e.png

拿GPU中的MMU举例说明其工作流程。

f220c4ea8c4e5b295c9e60a3eae00ab3.png

图中#1过程传输的数据一般有:顶点数据、纹理数据、页表数据等;地址为物理地址;

图中#2过程一般包含:寄存器读写和中断;地址为寄存器地址;

图中#3过程除了#1中所述数据之外,还有GPU产生的中间数据,比如:染色后的顶点、片段数据等;地址为虚拟地址。

GPU若要正确的读写DDR,必须通过MMU获取到正确的物理地址。

地址映射表的基地址通过配置寄存器告诉GPU。地址映射表的基地址是一个物理地址。

MMU获取物理地址的过程如下图所示:

ec0bc4be57a0e368d9cbae4f77400542.png

a0ae1bffc113d8c96803aaf84c3dec5d.png

MMU工作过程的示例代码如下:

uint8_t mem[SIZE]; // 显存

uint64_t va = 0x89ab1234567; // 输入的虚拟地址

uint32_t pgt_l0_base = 0x0; // 第一层级地址映射表的基地址

uint32_t offset_0 = va[47:39] * 8; // 从va的第39到47位得到在第一层级地址映射表的偏移量

uint32_t pgt_l1_base = mem[pgt_l0_base + offset_0]; // 第二层级地址映射表的基地址,参看图1

uint32_t offset_1 = va[38:30] * 8; // 从va的第30到38位得到在第二层级地址映射表的偏移量

uint32_t pgt_l2_base = mem[pgt_l1_base + offset_1]; // 第三层级地址映射表的基地址

uint32_t offset_2 = va[29:21] * 8; // 从va的第21到29位得到在第三层级地址映射表的偏移量

uint32_t pgt_l3_base = mem[pgt_l2_base + offset_2]; // 第四层级地址映射表的基地址

uint32_t offset_3 = va[20:12] * 8; // 从va的第12到20位得到在第四层级地址映射表的偏移量

uint32_t pa_base = mem[pgt_l3_base + offset_3]; // 物理地址的基地址

uint32_t offset = va[11:0]; // 从va的第0到11位得到物理地址的偏移量

uint32_t pa = pa_base + offset; // 得到最终的物理地址,参看图2

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值