ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MMU

2020-11-12 12:02:11  阅读:338  来源: 互联网

标签:va MMU 地址映射 pgt base offset uint32


MMU,Memory Management Unit,存储管理单元。输入一个虚拟地址和一个地址映射表的基地址,输出一个物理地址。

图1. 获取下一级页表的基地址的过程
PGT_L1_BASEPGT_L1_BASE......PGT_L0_BASEPGT_L0_BASEOFFSET_0OFFSET_0PGT_L0PGT_L0......PGT_L1PGT_L1PGT, Page Table
L0, Level-0
PGT, Page Table...
Viewer does not support full SVG 1.1

图2. 获取最终物理地址的过程
PAPA......PA_BASEPA_BASEOFFSETOFFSETPA, Pysical AddrPA, Pysical AddrViewer does not support full SVG 1.1

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

标签:va,MMU,地址映射,pgt,base,offset,uint32
来源: https://www.cnblogs.com/cngpus/p/13963182.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有