嵌入式内存管理

来源:互联网 发布:js怎么产生随机数 编辑:程序博客网 时间:2024/06/09 18:27

我们希望内 存在通过有效的分配之后能够容纳更多的任务以提高CPU 的利用率。

一般而言,内存管理需要完成以下功能:二次定址、保护、共享、逻辑组织和物理组织。下面给予简单阐述:
首先,进程调入调出内存存在随机性,我们需要内存管理提供二次定址功能使得任务再次调入内存能够和先前一样正常运行。其次,不同的进程为了自己的正常运行需要有自己的私有空间,内存管理需要提供相应的保护机制以容许这种私有空间的存在。再次,为了能够协同完成更高级的功能,不同进程之间需要有不同形式的交互,比如说访问对方数据,使用对方进程代码等等,而内存管理所完成的共享功能可以保证顺利实现。另外,由于计算机采用的是线性存储设备,而计算机程序本身为了完成自身的逻辑任务就有了适合自己特点的逻辑划分,如果操作系统或计算机硬件能够顺利实现这个逻辑划分和线性存储之间的顺利转换对程序本身实现的相对独立性等方面不无裨益。因此内存管理需要提供相应的逻辑组织功能。最后一点需要指出的就是,计算机存储设备是多样的,如何合理的管理这些存储设备以提高操作系统性能也是内存管理的功能要求的,这就是内存管理的物理组织功能。

虚拟内存机制基于分页技术或者分页与分段两种技术的结合,它是现代操作系统的一个显著特征。虚拟内存技术的实现需要有硬件支持,并得到操作系统配合共同完成,从而能够提供给每个进程一个几乎不受限制的虚拟内存空间。虚拟内存机制的实现不仅需要操作系统方面的软件支持,而且需要有相应的硬件支持,比如地址转换功能支持等。硬件支持主要包括地址转换功能,以及一些为了提高软件支持效率而做出的相应的支持,如MMU 等。

最初,运行于这类没有MMU 的CPU 之上的都是一些很简单的单任务操作系统,或者更简单的控制程序,甚至根本就没有操作系统而直接运行应用程序。在这种情况下,系统无
法执行复杂的任务,或者执行时效率很低。此外,所有的应用程序都需要针对不同的硬件平台进行重写,这要求程序员十分了解硬件特性。这些都阻碍了应用于这类CPU 之上的嵌入式产品开发的速度。标准的Linux 内核采用虚拟内存管理技术来提高系统运行效率,这种设计在硬件上需要有微处理器内嵌的内存管理单元(MMU)的支持。
因此,在许多没有MMU 的嵌入式应用中标准Linux 内核关于虚拟内存管理部分的代码就变得冗余了,甚至会对系统整体性能产生负面的影响。uCLinux 正是为了解决这一问题
而开发的。它是一种专为嵌入式系统设计的Linux,这里字母u 即为micro(微小)的意思,字母C 是Control 的缩写,可见uCLinux 是为微控制领域量身定做的Linux 版本。uCLinux的设计思想就是通过对标准Linux 内核的裁减,去除虚拟内存管理部分代码,并且对内存分配进行优化,从而达到提高系统运行效率的目的。它经过各方面的小型化改造,形成了
一个高度优化的、代码紧凑的嵌入式Linux,虽然它的体积很小,但是仍然保留了Linux的大多数的优点:稳定、良好的移植性、优秀的网络功能、完备的对各种文件系统的支持、
以及标准丰富的API。它的主要特征如下:

(1) 通用Linux API
(2) 内核体积 < 512 KB
(3) 内核 +文件系统<900 KB
(4) 完整的TCP/IP 协议栈
(5) 支持大量其它的网络协议
(6) 支持各种文件系统,包括 NFS、ext2、ROMfs and JFFS、MS-DOS 和FAT16/32

虚拟内存的设计思想就是系统通过不断的将进程正在使用的部分装入RAM,而将其余部分(包括暂时没有用到的数据和堆栈等)存储到磁盘上,从而使对RAM 需求较大的程序
可以在RAM 容量相对较小的系统中顺利的运行。

逻辑地址和物理地址之间的转换工作是由内核和内存管理单元(MMU)共同完成的,许多现代CPU 中都集成有MMU 模块。内核告诉MMU 如何为每个进程分配逻辑页面,而MMU 在进程提出内存请求时完成实际的转换工作。当地址转换无法完成的时候,如,由于给定的逻辑地址不合法或者由于逻辑页面没有对应的物理页面时,MMU 就给内核发送“页面错误”信号。MMU 也负责增强内存保护,如果一个应用程序试图在它的内存中对一个已经标明是只读的页面进行写操作,MMU 报错,并交由内核处理。MMU 的主要好处在于快速,为了获得同样的效果,缺少MMU 时操作系统将不得不使用软件为每个进程的每一次内存引用进行校验,可以想象,这个操作是非常频繁的,结果系统的处理能力很大程度上消耗在了对内存引用的校验上,系统性能受到极大的影响。而在有MMU 参与的情况下,内核只是偶尔参加工作,比如在发生页面错误的时候,这些情况与全部的内存引用数量相比是十分微小的。

 uCLinux 内核运行方式
uCLinux 的内核有两种可选的运行方式:可以在flash 上直接运行,也可以加载到内存中运行。后者可以减少内存需要。
Flash 运行方式(XIP):把内核的可执行映像烧写到flash 上,系统启动时从flash 的某个地址开始逐句执行。这种方法实际上是很多嵌入式系统采用的方法。内核加载方式:把内核的压缩文件存放在flash 上,系统启动时读取压缩文件在内存里解压,然后开始执行,这种方式相对复杂一些,但是运行速度可能更快(RAM 的存取速率要比Flash 高)。


原创粉丝点击