1、概述
操作系统的内存管理功能用于向操作系统提供一致的地址映射功能和内存页面的申请、释放操作。在嵌入式实时系统中,
系统支持的虚拟内存管理机制,对于另外一些系统,可能只有flat式的简单内存管理机制。
2、内存管理机制:
大体上来说,嵌入式系统所用到的内存管理机制主要有以下两种:
虚拟内存管理机制:
有一些嵌入式处理器提供了MMU,在MMU具备内存地址映射和寻址功能,它使操作系统的内存管理更加方便。如果存在MMU
换, 所有的应用程序只需要使用虚拟地址寻址数据。 这种使用虚拟地址寻址整个系统的主存和辅存的方式在现代操作系统中被
虚拟内存的管理方法使系统既可以运行体积比物理内存还要大的应用程序,也可以实现“按需调页”策略,既满足了程序的
在Linux系统中,虚拟内存机制的实现为我们提供了一个典型的例子:在不同的体系结构下, 使用了三级或者两级页式管理
换。基于虚拟内存管理的内存最大好处是:由于不同进程有自己单独的进程空间,十分有效的提高了系统可靠性和安全性。
非虚拟内存管理机制
在实时性要求比较高的情况下,很多嵌入式系统并不需要虚拟内存机制:因为虚拟内存机制会导致不确定性的 I/O阻塞时间
统的致命缺陷;另外,从嵌入式处理器的成本考虑,大多采用不装配MMU 的嵌入式微处理器。所以大多嵌入式系统采用的是实存
地址的访问不需要经过MMU,而是直接送到地址线上输出,所有程序中访问的地址都是实际的物理地址;而且,大多数嵌入式操作系
运行空间。一个进程在执行前,系统必须为它分配足够的连续地址空间,然后全部载入主存储器的连续空间。
由此可见,嵌入式系统的开发人员不得不参与系统的内存管理。从编译内核开始,开发人员必须告诉系统这块开发板到底
分配情况并关注应用程序需要运行空间的大小。另外,由于采用实存储器管理策略,用户程序同内核以及其它用户程序在一个地址空
间,以使得程序不至于破坏系统的正常工作,或导致其它程序的运行异常;因而,嵌入式系统的开发人员对软件中的一些内存操作要格外小心
UCOS就是使用非虚拟内存管理的一个例子,在UCOS中,所有的任务共享所有的物理内存,任务之间没有内存保护机制,这样
当,会引起系统崩溃。
3、内存在系统中的生命期:
对于内存在整个嵌入式运行过程中,以3种方式存在:
1、 在bootstraping 阶段,内存以临时内存分配的形式出现,当完成系统启动后,这些内存会回收供以后系统使用。
2、 在正常运行阶段,内存以两种方式存在:
1) 系统为代码,数据分配的永久内存,这些内存在系统运行过程中是不会改变的,有的硬件的I/O等外设也把相应的地址映射到固定的
2) 动态内存分配空间:这些内存不会固定分配,而是根据系统需要而动态分配的,如果利用非虚拟内存管理机制,一般需要改造
4、内存管理的具体应用:
A、Linux系统的内存管理机制
Linux内存管理机制中,X86体系结构是利用虚拟内存管理的典型,在i386CPU上,首先要进行段式映射,Linux 没有用到段式管理
为4GB, 也就是说只分了一段, 从而使段式映射没有起作用。在页式映射中,对于嵌入式i386芯片来说,实际上是两层映射,
映射都到物理空间了,而是动态映射, 如果程序运行时内核发现虚拟页面没有映射或映射的是磁盘页面, 会作相应的缺页处理
在程序运行的过程中, 涉及到的内存操作主要有内存分配、内存使用、内存回收、内存页面换出、页面换入。内存分配会
的free_area 中获得需要的内存块。如果内存不足, 则会启动Kswapd这个守护进程腾出部分物理内存。除了被调用, Kswapd
1) 检测物理内存剩余的情况, 如果短缺, 则按LRU策略断开active_list 队列中部分可交换页面的映射, 使页面变为不活
inactive_dirty_list队列, 为换出做准备。
2) 每次都执行, 把inactive_ dirty_list 中的页面写入交换设备, 并且回收一部分inactive_clean_list 中的页面。
Linux系统 虚拟内存机制的屏蔽
由于虚拟内存在时间上的不可预期性,对于实时性要求很高的系统,必须屏蔽虚拟内存机制。在uCLinux中就利用了这种技
思路:
为了满足在工业控制中一些任务的实时性要求,必须屏蔽内核的虚拟内存管理机制以增强Linux的实时性。当要更改内核的某
件编译的方法。思路是用#ifdef或 #ifndef屏蔽现有语句,在#else宏编译语句中包括自己编写的代码。实现虚拟内存的机制有
制、请页机制、交换机制、内存共享机制,将实现这些机制的数据结构和函数屏蔽或修改,还要修改与之相关的文件。需要改动
在 /include/linux、/mm、/drivers/char、/fs、/ipc/kernel、/init目录下。主要的改动如下:与虚存有关的主要的数
的vm_area_struct去掉,vm_area_struct利用了vm_ops来抽象出对虚拟内存的处理方法,屏蔽与虚拟内存操作有关的函数。内存映射主要由
交换操作,屏蔽用于交换的结构和函数声明,以及实现交换的代码。取消内核守护进程kswapd。
B、UCOS的内存管理:
UCOS的内存管理与大多数嵌入式系统一样,是flat内存,但在此flat内存的基础上进行了优化,使在动态内存分配的时候
UCOS的具体方法是:把连续的大块内存进行分区,每个分区包含整数个大小相同的内存块,在一个系统中有多个不同内存大小的分
同大小的内存分区中分配相应大小的内存。对于不用的内存,又重新释放回原来的分区。通过这样的内存管理算法,解决了内存粹片的
参看源码。主要由以下几个函数实现:
OSMemCreate():创建内存分区
OSMenGet() :为应用程序分配一段内存
OSMenPut():回收应用程序不再使用的内存
5、结论:
内存管理是嵌入式系统的一个重要方面,虚拟内存管理机制在为进程安全提供很好保证的同时,也为开发人员提供了一个
面。但是它也带来了时间不确定性的缺陷。根据不同的系统需求,我们可以选取相应的内存管理策略。在现在大多数的实时系统
统的实时性,但是增加了开发的难度,任务内存操作不当,可能引起系统崩溃。
由于虚拟内存管理的请求换页机制在很大程度上影响了系统的实时性能,现在有些开发人员提出了一个折衷方案,即不用
存映射、共享虚拟内存等功能.
嵌入式系统内存管理
最新推荐文章于 2024-07-08 13:05:29 发布