嵌入式中 MMU的功能
学习嵌入式才发现要看的书太多,外面的世界很精彩啊,现在来说说MMU吧,MMU是Memory Management Unit的缩写,是用来管理虚拟内存系统的器件。 MMU通常是CPU的一部分,本身有少量存储空间存放从虚拟地址到物理地址的匹配表。此表称作TLB(转换旁置缓冲区)。所有数据请求都送往MMU,由 MMU决定数据是在RAM内还是在大容量存储器设备内。如果数据不在存储空间内,MMU将产生页面错误中断。在现代处理器中扮演着非常重要的角色。操作系统通过使用处理器的MMU功能,能够实现很多功能,具体如下:(MMU所起的作用也可参考http://wenku.baidu.com/view/09085f7427284b73f242502f.html)
I. 虚拟内存。有了虚拟内存,可以在处理器上运行比实际物理内存大的应用程序。为了使用虚拟内存,操作系统通常要设置一个交换分区(通常是硬盘),通过将不活跃的内存中的数 据放入交换分区,操作系统可以腾出其空间来为其它的程序服务。虚拟内存是通过虚拟地址来实现的。
II. 内存保护。根据需要对特定的内存区块的访问进行保护,通过这一功能,我们可以将特定的内存块设置成只读、只写或是可同时读写。
在嵌入式系统中,通常不会使用虚拟地址这一功能,因为它会使得任务的调度时间不具确定性。还有另一个原因就是,嵌入式系统的存储空间通常很小,有的只采用FLASH作为存储介质,并没有特定的空间用做交换分区。那在嵌入式系统中,MMU会用来做内存保护吗?是的,MMU在嵌入式系统中主要是用来做内存保护用的。还记得《程序中的段》中所提到的.text段和.rdata段吗?我们说这两个段通常是相邻放在连续的内存块中的,且这块内存会是只读的,而这就需要MMU来帮忙了!将这两个段所在的内存区块设置成只读的目的是,可以防止其内容被出错的程序意外的改写了。对于设置成只读的内存区当被意外的改写时,处理器会产生一个段异常,而操作系统则利用这一异常产生一个core(或dump)文件。通过这一文件,我们可以分析出是哪一段程序试图去改写只读内存的。应当说采用了内存保护的方法,可能使得程序出错时,我们找到问题的根源会相对的容易和快,因为其更接近出错的程序点。如果不具有内存保护功能,那么有可能程序去改写.text或.rdata段所在的区块时,还能运行,最后出错的地方可能离实际的出错点更为的“远”。
那是谁来负责将.text和.rdata段设置成只读的呢?通常这可以在我们的应用程序在初始化操作系统时完成。
对于MMU的一个特性我们在此不得不提及,MMU中存在页的概念,对于所有的MMU功能其操作都是以页的大小来进行的。比如,对于32位的x86处理器其页的大小是4K字节。在采用MMU设置内存的读写属性时,我们必须将页的起始地址作为设置参数,且这一地址必须是页的整数倍,k或者说地址必须是页对齐的。那从嵌入式系统开发的角度来看,我们需要注意什么呢?我们必须保护.text的起始地址必须是页对齐的,这是通过设置连接器的脚本来达到目的,即将.text段的起始地址设置成以页大小进行对齐,还有吗?先看图 1,为了解释方便我们假设.rdata段也在.text段中,且.text的起始地址已经采用连接器脚本设置成了页对齐的。
我们说了对于MMU的操作是以页来进行的,那我们得保证.text的大小是页的整数倍,那如何保证?很简单,将.data段的起始地址也通过连接器脚本设置成页对齐就行了。这样看来,为了使用MMU,可能会造成一点点的内存空间浪费,因为当.text的大小不是页的整数倍时,我们得将其变成页的整数倍,即实际的.text段与.data段可能会有空隙。图 2中示例了将.text段和.data段的起始地址设置成页对齐。
在实践中,使用MMU解决了如下几个问题:
①使用DRAM作为大容量存储器时,如果DRAM的物理地址不连续,这将给程序的编写调试造成极大不便,而适当配置MMU可将其转换成虚拟地址连续的空间。
②ARM内核的中断向量表要求放在0地址,对于ROM在0地址的情况,无法调试中断服务程序,所以在调试阶段有必要将可读写的存储器空间映射到0地址。
③系统的某些地址段是不允许被访问的,否则会产生不可预料的后果,为了避免这类错误,可以通过MMU匹配表的设置将这些地址段设为用户不可存取类型。
启动程序中生成的匹配表中包含地址映射,存储页大小(1M,64K,或4K)以及是否允许存取等信息。
例如:目标板上的16兆DRAM的物理地址区间为0xc000,0000~0xc07f,ffff;0xc100,0000~0xc17f,ffff;16兆ROM的虚拟地址区间为:0x0000,0000~0x00ff,ffff。 匹配表配置如下:
可以看到左边是连续的虚拟地址空间,右边是不连续的物理地址空间,而且将DRAM映射到了0地址区间。 MMU通过虚拟地址和页面表位置信息,按照转换逻辑获得对应物理 地址,输出到地址总线上。
应注意到的是使能MMU后,程序继续运行,但是对于程序员来说程序计数器的指针已经改变,指向了ROM所对应的虚拟地址。
嵌入式中 MMU的功能的更多相关文章
- 第九章 C语言在嵌入式中的应用
上章回顾 编码的规范和程序版式 版权管理和申明 头文件结构和作用 程序命名 程序注释和代码布局规范 assert断言函数的应用 与0或NULL值的比较 内存的分配和释放细节,避免内存泄露 常量特性 g ...
- 在.NET程序中实现HttpServer功能
亲爱的下午茶 博客园 首页 新随笔 联系 订阅 管理 随笔-6 文章-0 评论-10 在.NET程序中实现HttpServer功能 最近在实现一个可视化数据解析工具,需要在Wpf程序中实 ...
- 73.Vivado使用误区与进阶——在Vivado中实现ECO功能
关于Tcl在Vivado中的应用文章从Tcl的基本语法和在Vivado中的应用展开,继上篇<用Tcl定制Vivado设计实现流程>介绍了如何扩展甚至是定制FPGA设计实现流程后,引出了一个 ...
- ADO.NET 中的新增功能
ADO.NET 中的新增功能: .NET Framework (current version) 以下是 .NET Framework 4.5 中 ADO.NET 的新增功能. SqlClient D ...
- CSS3中的动画功能(一)
css3中的动画功能分为transitions功能和animations功能,这两种功能都可以通过改变css属性值来产生动画效果.今天带大家一起来看看css3动画功能中的transitions的用法. ...
- 使用vs中的发布功能发布asp.net core项目时遇到ERROR_CERTIFICATE_VALIDATION_FAILED错误
今天将VS2015编制的一个asp.net core项目发布到服务器进行测试,使用的是vs中主菜单"生成"中的"发布"功能. 遇到了一个错误,在网上反复检索尝试 ...
- SQLSERVER2014中的新功能
SQLSERVER2014中的新功能 转载自:http://blog.csdn.net/maco_wang/article/details/22701087 博客人物:maco_wang SQLSER ...
- Eclipse 中的重构功能
Eclipse 中的重构功能使其成为了一个现代的 Java 集成开发环境 (IDE),而不再是一个普通的文本编辑器.使用重构,您可以轻松更改您的代码,而不必担心对别处造成破坏.有了重构,您可以只关注于 ...
- 在Sharepoint 2010中启用Session功能的说明文档
在Sharepoint 2010中启用Session功能的说明文档 开发环境:Windows 7系统,SharePoint Server 2010,Visual Studio 2010 按以下步骤进行 ...
随机推荐
- 设计模式_Command_命令模式
形象例子: 俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送 信息,她对我有什么指示,就写一张纸条让她弟弟带给我.这不,她弟弟又传送过来一个COMMAND,为了感谢他,我请他吃了 ...
- MVC框架模式技术实例(用到隐藏帧、json、仿Ajax、Dom4j、jstl、el等)
前言: 刚刚学完了MVC,根据自己的感悟和理解写了一个小项目. 完全按照MVC模式,后面有一个MVC的理解示意图. 用MVC模式重新完成了联系人的管理系统: 用户需求: 多用户系统,提供用户注册.登录 ...
- sys.stdout 重定向
通俗的来说,sys.stdout的功能类似与C++里面的文件输出功能fprintf. 接下来直接入正题,让我们来看代码: >>> import sys >>> te ...
- Visual Studio C++ Command Line
最近在Visual Studio 2012进行vp8的开发,之前一直都是在ubuntu上进行开发,关于编译链接的一些选项可直接在makefile中定义,比如vp8的头文件都放在include文件下面, ...
- [C++]VAssistX函数添加注释功能设置
问题情况:每次手写注释太慢,而且不系一.问题原因:C++可以利用宏写注释,也可以使用VAssistX提供的方法.问题处理:1.安装VAssistX在VS2010上 2.VS2010菜单->VAs ...
- like用法
SQL:btitle like '%"+keyword+"%' 存储过程:keyword like ''%'+@keyword+'%'' 直接查找:name like '%wang ...
- for循环中使用了return
for循环中使用了return,导致没有循环完毕就结束了整个方法的执行.
- C++学习笔记(十三):类、包和接口
看标题感觉这些术语和C++没有什么关系啊,包和接口是Java等语言加入的概念. 这篇文章是基于Java等语言的新概念(相对于C++来说的新概念)来看C++的设计思路. 类: C++中,一个文件可以包含 ...
- squid 安装、配置、优化
官方网站:http://www.squid-cache.org 下载路径:wget http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABL ...
- 日志文件C++ 时间 文件 行数
#include <stdio.h> #include<windows.h> #include <time.h> #define Line __LINE__ #de ...