mini2440MMU管理建立页表笔记
来源:互联网 发布:安卓软件制作器 编辑:程序博客网 时间:2024/05/18 14:14
近来看韦东山老师的书,发现群里很多朋友对MMU章节搞不太清楚,小弟不才,把自己的理解写下来跟大家分享,高手请飘过:)
韦老师书部分源码如下:
1、unsigned long virtuladdr, physicaladdr;
2、unsigned long *mmu_tlb_base = (unsigned long *)0x30000000;
/*
* Steppingstone的起始物理地址为0,第一部分程序的起始运行地址也是0,
* 为了在开启MMU后仍能运行第一部分的程序,
* 将0~1M的虚拟地址映射到同样的物理地址
*/
8、virtuladdr = 0;
9、physicaladdr = 0;
*(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) | \
MMU_SECDESC_WB;
/*
* 0x56000000是GPIO寄存器的起始物理地址,
* GPBCON和GPBDAT这两个寄存器的物理地址0x56000010、0x56000014,
* 为了在第二部分程序中能以地址0xA0000010、0xA0000014来操作GPBCON、GPBDAT,
* 把从0xA0000000开始的1M虚拟地址空间映射到从0x56000000开始的1M物理地址空间
*/
18、virtuladdr = 0xA0000000;
19、physicaladdr = 0x56000000;
*(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) | \
MMU_SECDESC;
/*
* SDRAM的物理地址范围是0x30000000~0x33FFFFFF,
* 将虚拟地址0xB0000000~0xB3FFFFFF映射到物理地址0x30000000~0x33FFFFFF上,
* 总共64M,涉及64个段描述符
*/
27、virtuladdr = 0xB0000000;
28、physicaladdr = 0x30000000;
while (virtuladdr < 0xB4000000)
{
*(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) | \
MMU_SECDESC_WB;
virtuladdr += 0x100000;
physicaladdr += 0x100000;
}
首先,程序第2行指定了页表基址为0x30000000,意思是页表从0x30000000这个地址开始存放,由于页表有4096个条目,所以大小为4*4096=16k。
当我们拿到一个32位的虚拟地址,取出其前12位,在页表中寻找条目(如:12位二进制组成的数字是1,就是页表中第一个条目,是2就是第二个条目,依次类推),2的12次方刚好够找4096个。找到条目后,条目的内容大致是这样的:段基址(12位)+控制位(这里具体哪一位是做什么的先不管)。得到的段基址是12位的,从后20位全0到后20位全F,一共表示了1M大小的地址范围。之前我们不是用了虚拟地址的前12位在页表中寻找条目吗,现在用剩下的20位在从段基址开始的1M地址中找到具体的单元。因此,物理地址就应该是:段基址+虚拟地址的后20位;
现在我们再看看程序
第8行开始要完成的功能在注释里有,我们现在主要看看程序是什么意思,韦工这里讲的很简略;
如:*(mmu_tlb_base + (virtuladdr >> 20)) = (physicaladdr & 0xFFF00000) | MMU_SECDESC_WB;
mmu_tlb_base 表示页表基址,页表从这里开始存放,也就是sdram刚开始的16k;
virtuladdr>>20 实际上就得到了虚拟地址的前12位。
两个加起来就确定了页表中的一个条目;一个条目能寻址1M大小的物理地址;
等号右边 (physicaladdr & 0xFFF00000) 表示物理地址的前12位,对应上面说的段基址。
MMU_SECDESC_WB 对后面位赋值。(具体在宏定义里有)
整句话就完成了对页表中一个条目的赋值。
18行开始的程序类似;
27行开始有
virtuladdr += 0x100000;
physicaladdr += 0x100000;
因为一个条目能寻址1M,sdram有64M。所以每次赋值完递增1M。
以为就是我的理解,有错的地方请大家留言指正。
- mini2440MMU管理建立页表笔记
- arm-linux内存管理学习笔记(2)-内核临时页表的建立
- oracle建立和管理表
- UCOS_II学习笔记---任务管理之建立任务函数分析
- 建立内存管理架构
- 项目建立管理
- 在同一主机上建立用户管理的复制数据库 笔记
- STM32F0库应用技术笔记——iar工程建立&时钟管理
- 人力资源管理计划—RACI表的建立步骤
- oracle建立表空间 新建用户以及权限管理
- activiti5工作流(业务流程管理),建立基本表(25张)
- mysql 管理数据库和管理表笔记
- 走向管理:建立工作汇报机制
- 走向管理:建立工作汇报机制
- Oracle 建立账户和管理
- 建立本地repo 管理仓库
- Oracle 建立账户和管理
- 建立json数据库笔记
- 什么是广告活动
- linux学习
- Spring AOP的几个概念
- SAP方丈语录之三十- 如何转入SAP
- qt 中自定义信号类型方法
- mini2440MMU管理建立页表笔记
- 教你如何迅速秒杀掉:99%的海量数据处理面试题
- 大小写字母转换 (简化算法)
- chrome ui test, worker
- WEP的四次握手过程
- [Android开发经验分享] 启动程序时不显示主Activity的方法
- C++.QT编程学习笔记——点击一个按钮后出现选择文件对话框
- 总结 php导出Excel php
- 网络广告购买方式,RTB, DSP, AdExchange扫盲知识点汇总