完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
MMU,Memory Management Unit,存储管理单元。 MMU的工作流程为:首先,配置一个地址映射表的基地址。然后,每输入一个虚拟地址则输出一个物理地址。地址映射表可以简单认为是虚拟地址和物理地址的映射关系表,该表由驱动程序生成,存储于DDR(显存)中。 拿GPU中的MMU举例说明其工作流程。 图中#1过程传输的数据一般有:顶点数据、纹理数据、页表数据等;地址为物理地址; 图中#2过程一般包含:寄存器读写和中断;地址为寄存器地址; 图中#3过程除了#1中所述数据之外,还有GPU产生的中间数据,比如:染色后的顶点、片段数据等;地址为虚拟地址。 GPU若要正确的读写DDR,必须通过MMU获取到正确的物理地址。 地址映射表的基地址通过配置寄存器告诉GPU。地址映射表的基地址是一个物理地址。 MMU获取物理地址的过程如下图所示: 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 原作者:ScandalRafflesia |
|
相关推荐 |
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
飞凌嵌入式ElfBoard ELF 1板卡-CAN编程示例之开发板测试
654 浏览 0 评论
该问题是用APP给芯海科技的CST92F25芯片发指令是出现的
2242 浏览 1 评论
771 浏览 0 评论
1530 浏览 1 评论
2276 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 05:56 , Processed in 0.612120 second(s), Total 71, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号