内存管理单元编程实例.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
内存管理单元编程实例

一、MMU初步了解 ?? ?概念:内存管理单元(memory management unit),简称MMU ?? ?主要作用:负责虚拟地址到物理地址之间的转换 ?? ??? ??? ? 提供硬件机制的内存访问权限检查 ?? ? ?? ?发展由来:由于程序的大小逐步发展到大于内存的大小这一问题的出现 ?? ?导致了虚拟存储器的产生,虚拟存储器的基本思想是:数据、堆栈的总 ?? ?大小可以超越物理存储器(大于内存的程序在执行的时候只将其中需要 ?? ?运行的一部分调入内存,其他部分在外部存储器中)。由于虚拟存储器 ?? ?的出现导致cpu发出的虚拟地址不能够直接送至地址总线,这是就需要 ?? ?一个将虚拟地址转换物理地址的设备,它就是内存管理单元(MMU)。 ?? ? ?? ?32位处理器最大可以虚拟出的地址范围是0~0xffffffff ?? ? 二、工作特点 ?? ?1、没有启用MMU时候,cpu发出的地址是物理地址 ?? ?2、启用MMU后,cpu发出的是虚拟地址 ?? ?注:另一说法其实是cpu总发出虚拟地址,只不过是在没有进行空间映射 ?? ?时候,虚拟地址到物理地址的转换是一种线性转换的机制。 ?? ? ?? ?虚拟地址到物理地址的转换方法一般有两种: ?? ?其一、使用一个固定的函数式 ?? ?其二、建立一个表格进行映射。(页表由一个个条目组成) ?? ? ?? ?ARM cpu使用页表进行地址转换的过程: ?? ?1)根据给定的虚拟地址找到一级页表中的条目 ?? ?2)如果此条目是段描述符,直接返回物理地址,转换结束 ?? ?3)否则此条目是二级页表,继续在二级表中查找下一条目 ?? ?4)如果此条目是页描述符,则返回物理地址,转换结束 ?? ?5)其他的情况,则转换出错 ?? ? ?? ?注:有上述的过程不难知道一般的ARM处理器最多用到二级页表。 ?? ? 三、TLB了解 ?? ?概念:转译查找缓存(translation lookaside buffer) ?? ?作用:解决MMU每次转换都需查表,降低了cpu性能的问题 ?? ?工作过程:当cpu发出一个虚拟地址的时候,MMU会首先访问TLB,如果 ?? ?在TLB中有这一虚拟地址的描述符,则直接使用该描述符进行地址转换 ?? ?。否则MMU访问页表找到对应的描述符在进行地址转换和权限检查,同时 ?? ?使用一定的算法将这一描述填入TLB中。 ?? ? 四、Cache了解 ?? ?概念:在主存和cpu的寄存器之间的告诉小容量存储器,简称高速缓冲存 ?? ?储器,也有的将其叫做快取 ?? ?作用:将正在执行的指令地址附近的一部分指令或者数据从主存调入这 ?? ?个存储器,供cpu在一段时间内使用,从而提高程序运行的速度。 ?? ? ?? ?一般离cpu越近的cache速度越高,但是其容量一般比较小(按一级、二级 ?? ?cache来说,一级更高速,二级容量更大一些) ?? ? ?? ?cache有指令快取(ICache)和数据快取(DCache) ?? ? 五、mmu编程实例:(实验平台mini2440) ?? ?下面的实验是将GPB的地址0射到0xA0000000,然后再对虚拟地址 ?? ?进行操作,点亮led的实例,实验目的在于学习mmu的页表建立,以及的段址映射 ?? ?的方法。 ?? ? ?? ?1、启动代码(start.S) ?? ?.text ?? ?.global _start ?? ?_start: ?? ??? ?ldr sp, =0x4096?? ??? ??? ?@以下是c程序,运行前需要设置栈指针 ?? ??? ?bl? disable_watch_dog ?? ??? ?bl? memsetup ?? ??? ?bl? copy_2th_to_sdram ?? ??? ?bl? create_page_table ?? ??? ?bl? mmu_init ?? ??? ?ldr sp, =0xB4000000 ?? ??? ?ldr pc, =0xB0000000???? @这个地址很重要,他必须是第二阶段代码的重载地址(运行地址) ?? ?halt: ?? ??? ?bl? halt ?? ??? ? ?? ?2、初始化事件(init.c) ?? ? /* ?*?init.c:?进行一些初始化,在Steppingstone中运行 ?*?它和head.S同属第一部分程序,此时MMU未开启,使用物理地址 ?*/? /*?WATCHDOG寄存器?*/ #define WTCON?(*(volatile unsigned long?*)0 /*?存储控制器的寄存器起始地址?*/ #define

文档评论(0)

zhanghc + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档