一种嵌入式系统的内存分配方案
嵌入式操作系统内存管理机制及内存保护分析

1 嵌入式 系统 内存 管理存在 的问题
内存 管 理 机 制 是 嵌 入 式 系统 研 究 中 的 一 个 重 点 和 难 点 的 问 题 . 对 有 内 存 管 理 单 元 ( 针 MMU) 的 处 理
器 设 计 的 一 些 桌 面 操 作 系 统 ( Wid w 、 iu ) 使 用 了 虚 拟 存 储 器 的 概 念 ,虚 拟 内 存 地 址 被 送 到 如 n o s Ln x 都
实 存 储 管 理 策 略 ,从 而 对 内存 的 访 问 是 直 接 的 . 对 地 址 的 访 问 不 需 要 经 过 MMU, 是 直 接 送 到 地 址 线 它 而 上 输 出 , 有 程 序 中访 问 的地 址 都 是 实 际 的物 理 地 址 . 且 , 多 数 嵌 入 式 操 作 系 统 对 内存 没 有 保 护 , 个 所 而 大 各 进程 实 际上共享 一个运 行空 间. 个进程 在执行 前 , 一 系统 必 须 为 它 分 配 足 够 的 连 续 地 址 空 间 , 后 全 部 载 然 入 主 存 储 的 连 续 空 间 . 样 对 嵌 入 式 系 统 的 内存 管 理 和保 护 就 显 得 极 为 重 要 . 这
基金项 目: 渭南师范学 院科研基金项 目(6 K 0 1 0 Y S3 )
作者简介 : Βιβλιοθήκη 渭涛(95 )男( , 17一 , 回)陕西渭南人 , 西安电子科技大学硕士研究生 , 渭南师范学院计算机科学 系讲 师.
嵌 入 式 系统 是 以 应 用 为 中心 , 算 机 技 术 为 基 础 , 硬 件 可 裁 剪 , 应 于 特 定 应 用 系 统 , 功 能 、 靠 计 软 适 对 可
嵌入式操作 系统 内存管理机制及 内存保护分析
一种嵌入式系统虚拟内存管理机制的实现方法

第2 7期
21 0 0年 9月
科
学
技
术
与
工
程
Vo 0 No 2 S p 01 L1 .7 e .2 0
17— 1 1 (0 0 2 -750 6 1 85 2 1 ) 76 7 —5
S in e T c n l g n g n ei g c e c e h o o y a d En i e r n
分区进行 的 , 整 个 系统 内存 (yt ati ) 作 将 ss m prt n 看 e io
一
存管理机制提出 了更 高的要求… 。作 为嵌人式 系
统 的核心 部 分 , 内存 管 理 机 制 主 要 有 两 种 : 于物 基
理 内存 的管 理 机制 和 基 于虚 拟 内存 的管 理 机 制 , 前
的基础上 , 出一个轻量级 的虚拟 内存管理机制 的实现 方法 , 提 即通过 内存映 射为 系统 提供虚拟地 址 空间、 过 内存 交换为每 通
个任务提供 足够的 内存容量。最后通过 实验 , 验证 了该方法 的有效性和实用性 。
关键词
嵌入式系统
内存 管理
虚拟 内存 A
中图法分类号
T 311; P 1. 1
文献标志码
随着嵌入 式 系统 得 到 越来 越 广 泛 的应用 , 件 软
存、 动态分配内存和 回收内存。V Wo x r k为用户提供
两种 内存 区域 : 可变 长 的 内存域 (ei ) rs n 和定长 的 内 o
的功能和结构也 日益复杂 ; 因而在有 限硬件资源的 条件下 , 尤其是在较少 内存 的情况下 , 系统应具有
用需 求 j 。
用户内存 h h — lr矗 1 l Al t l o
嵌入式系统中一种池式内存管理方案

・
1O ・ 5
实 验 科 学 与 技 术
20 0 7年 4月
・警 实 园 . 生 醢 地| 大
嵌 入 式 系统 中一种 池 式 内存 管理 方 案 ‘
张 磊 ” 。王 忠仁
成都 60 5 ) 10 4 ( 电子科技大学计算机学院
Ab ta t I l n c s a y t k mo n g me ti mb d e y tm e l t e a d r l be I d i o sr c : t。 e e s r o ma e me r ma a e n n e e d d s s S y e r a — i n ei l . n a d t n, m a i
1 引 言
17 90年左右 出现了嵌人式 系统 的概念 ,早期 的嵌人式系统主要实现一些控制功能,使用一个简
配恰恰足够的内存以满足 当前 的需求。内存动态分 配的一些分配算 法会花费不可预期 的时 间。实际 上,所有分配算法都必须针对每个数据项适用少量
的字节来存储其相关信息。如果 申请 的区块越小, 额外负担所 占的比例就越大 。此外还必须准备好处
RA (adm acs e o )i ak do a ersuc.T e f ci d r al n eai f e r m ae M r o cesm m r s i fs r ore hne et ea l e l hns o mo a g- n y n cc e v n e b e i m m y n
to ewh r e in m rU e ̄ o mb d e y tm. h s o ae d g e o S l f s e e d ss d e Ke r s e e d y t m;me r n g me t mi l c t n y a c alc t n;me r o l y wo d : mb d e s se d mo ma a e n ;s l al ai ;d n mi l ai y e o o o o mo p o y
lwip内存分配算法 -回复

lwip内存分配算法-回复LWIP(Lightweight IP)是一个嵌入式系统中的轻量级的网络协议栈。
它主要用于资源受限的系统,如小型微控制器、嵌入式系统和嵌入式操作系统。
LWIP不仅提供了TCP/IP协议栈的功能,而且还采用了一种特殊的内存分配算法来管理堆上的内存。
本文将详细介绍LWIP的内存分配算法。
LWIP的内存分配算法主要包括两个部分:内存池管理和动态内存管理。
其中,内存池管理用于事先规划和分配一块固定大小的内存池,而动态内存管理用于在程序运行时动态地分配和释放内存空间。
首先,我们来看内存池管理。
内存池管理是通过将内存划分为一组固定大小的内存块,然后将这些内存块存放到一个内存池中,以便在需要时可以快速地分配给应用程序。
具体来说,LWIP将内存划分为不同大小的内存块,这取决于应用程序对内存的需求。
每个内存块都保存着一个链表指针,用于将已分配的内存块连接起来。
当应用程序需要分配内存时,LWIP会遍历内存池中的内存块链表,找到一个大小合适的内存块来分配。
如果找到了一个可用的内存块,LWIP将该内存块从链表中移除,并返回给应用程序使用。
如果没有找到大小合适的内存块,LWIP将会分配一块更大的内存块,并将其划分为多个较小的内存块,其中一个分配给应用程序使用,而其他的内存块则重新加入到内存块链表中。
另一方面,当应用程序释放内存时,LWIP会将该内存块重新加入到内存块链表中,以便在下次分配内存时可以重新使用。
这样,在程序运行时,LWIP可以避免频繁地向操作系统请求内存空间,从而提高了内存的利用率和系统性能。
接下来,我们来看动态内存管理。
动态内存管理是指在程序运行时根据需求动态地分配和释放内存空间。
LWIP使用了一套高效的动态内存管理算法来实现这一功能。
具体来说,LWIP会维护一张内存分区表,用于记录系统中所有已分配的内存区域和大小。
当应用程序需要分配内存时,LWIP会遍历内存分区表,找到一个大小合适且未使用的内存区域来分配。
一种适用嵌入式系统的自适应动态内存管理方案

12 可靠性 .
也就是 内存分配 的请 求必须得 到满足 , 果分配 如 失败可 能会带来灾难性的后果 。嵌入式系统应用 的环
境千变万化 , 中有 一些是对 可靠性要求 极高 的。比 其
如 , 车的 自动驾驶 系统 中, 汽 系统检 测到 即将 撞 车 , 如
果因为内存分配失败 而不能进 行相应 的操 作 , 就会发
维普资讯 http://www.cqHale Waihona Puke
第l 7卷
第3 期
计 算 机 技 术 与 发 展
C OM_UTER TECHN0L GY P O AND DEVEL0P MENT
20 0 7年 3月
V( . 7 No 3 1 1 1 . M a. 2 0 r 07
一
种 适 用嵌 入 式 系统 的 自适 应 动 态 内存 管理 方案
中图分类 号 : P1 1 31 ] 文 献标识 码 : A 文章 编号 :63 6 9 (070 —04 — 3 17 — 2X 20 )3 08 0
On a tv n m i e o y Alo a i g M e h d eAd p ieDy a cM m r lc tn t o
Ab ta tTh e urme tfrra— tme。eibly, ihef in y, k slt fe b d e y t p lat n sn h i wnme r sr c : erq ie n o el i rl it hg fi e c ma e so a i c o m e d ds se a pi i su igt ero moy m c o ma a ig meh d . yme r rg e trs l fo t edvso ot ebgme r rq e t i o a r u etedvso o tebg n gn to sAn mo fa m n eut rm h iiin t h i mo fe u nl fy ucn e c h ii n t h i y y y。 d i me r , o lr u emer y rg n , u o t a i y terq ie n o me y fs tm e e u i h iiin t i mo y uwi e c r ̄r fa me t b th w o st f h e urme tt n ̄r o y e wh n r cn t edvso o bg y ld s s d g me r ? Prp ssan w mo na i rtm ei mo y o oe e me r ma g n aih t y g c—d n mi mo n gn d pieaih ei,h mp a i sh w ord c y a cme r ma a i a a tv rt y g m tc t ee h ssi o t e u e me r fa me ta di rv sn ae a das r sfr r e ie n drai t n Ho ei a etet paeo moy rg n n mp eui rt .n lobi o g g n o wa dn w d aa e la i , p tcnb h e lt fme r ma a — z o m mo y n g i r h ei mb d e y tm . g n aim tci e e d s se t n d Ke rs: mo n e n ; mo r me t d n m i me r lct rt ei ywo d me r ma a me t me r fa y g y g n ;ya c mo a o ai aih tc y l g n m
tlsf内存分配方案 -回复

tlsf内存分配方案-回复什么是TLSF内存分配方案?TLSF(Two-Level Segregated Fit)是一种高效、低碎片化的动态内存分配方案。
它通过两级分割来管理内存,将内存块按照不同的大小进行分类和组织,以提高内存分配和释放的效率。
TLSF内存分配方案被广泛应用于实时嵌入式系统、操作系统和嵌入式游戏中,因其高效性和可伸缩性而备受青睐。
为什么需要TLSF内存分配方案?在嵌入式系统和操作系统中,内存的管理是一个至关重要的任务。
内存管理方案的效率直接影响到系统的性能和稳定性。
传统的内存分配方案(如Buddy System)在分配小内存块时存在内部碎片问题。
内部碎片指的是分配给用户的内存块大小超过了其实际需求,导致浪费。
而TLSF内存分配方案则通过更精细的内存块分类和组织,减少了内部碎片的产生,提高了内存利用率。
TLSF内存分配方案的实现原理是什么?TLSF内存分配方案通过两级分割来管理内存。
首先,整个内存空间被划分为若干个区域,每个区域的大小都是2的幂次。
而无论用户申请多大的内存块,TLSF会按照不同的大小在相应的区域中查找可用的空闲块,并进行分配。
这种按照大小划分的方法避免了拆分大块内存的操作,减少了内存分配的时间开销。
针对每个区域,TLSF会维护一个双向链表,将空闲块按照大小进行分类和组织。
每个空闲块都有一个头部,其中包含了空闲块的大小、前后指针等信息。
当用户申请内存时,TLSF会在相应的区域中查找符合大小要求的空闲块,并进行分割。
如果找不到足够大的空闲块,则会分配更大的内存,并将多余的部分重新放入链表。
当用户释放内存时,TLSF会通过指针算术运算快速定位到对应的内存块,并将其合并到链表中,以避免碎片的产生。
TLSF内存分配方案的优点是什么?1. 低碎片化:TLSF内存分配方案将内存块按照不同的大小进行分类和组织,有效地减少了内部碎片的产生,提高了内存利用率。
2. 高效性:TLSF内存分配方案通过两级分割和链表组织,能够快速地分配和释放内存块,减少了内存分配和释放的时间开销。
嵌入式系统的自适应内存管理方案的算法实现

统 ,不管产 生 的内存碎 片多小 ,只要 时间足 够长 ,就 会将 内存用 完 。这种情 况在许 多嵌入 式系统 中 ,特别
是 在 高可用 性 系统 中是不 可接受 的 。 内存 分配 程序 浪费 内存 的 3种基本 方式 :即额外
m e o a a tv rt me ci ut o wadba e ns m ec mn o e o m a a i gme o . e ie ee p a i n m  ̄ d p eaih t sp r r s do o o l nm m  ̄ i i f n g n t ds Th ni g v st m h sso h t h h w d c a m e t e o a di r v sn ae a das r s nsn w e rt me cr aia o . o t r u ef g n m  ̄ n mp o eu ig r t, oe r m n lop e e t e i at ai d o h i t e lz t n i K e l S:e b d e y tm ;m e o m a a e e t;m e o fa m e t rtm ei y WO d m e d ds se m  ̄ n gm n m  ̄ r g n ;aih t c
Ab ta t nve o ra-m ec aa trs c ,h ei blt q ie n, e me  ̄ o t i wnma a iga i mei- sr c :I iw f e lt h rce it s terla i yr u r me tan w mo i i i e fhero n g n rt h t c
第 2卷 第 6 2 期
嵌入式系统的存储器管理技巧

嵌入式系统的存储器管理技巧嵌入式系统是一种专门设计用于特定应用领域的计算系统。
存储器管理在嵌入式系统设计中起着重要的作用,它对系统的性能和资源利用率有着直接影响。
本文将介绍几种常用的嵌入式系统存储器管理技巧,以帮助开发人员更好地设计和优化嵌入式系统。
一、存储器类型概述在嵌入式系统中,存储器通常分为内部存储器和外部存储器两类。
内部存储器通常指的是处理器内部的一级缓存和寄存器,速度较快但容量有限。
外部存储器则是指芯片外部连接的存储介质,如闪存、SDRAM等,容量较大但速度相对较慢。
二、存储器管理技巧1. 内存优化在嵌入式系统设计中,内存的使用非常关键。
为了最大限度地节省内存空间,可以采取以下几种优化技巧。
首先,合理使用数据结构和算法。
选择适合嵌入式系统的轻量级数据结构,如队列、链表等,可以减少内存的占用。
同时,合理选择算法,尽量减少临时变量的使用,减少内存的开销。
其次,进行代码优化。
嵌入式系统的代码大小对存储器的消耗是很大的,因此,合理使用编译器优化选项和去除不必要的代码可以有效减少存储器的使用量。
最后,灵活使用动态内存分配。
动态内存的分配和释放可以根据需要进行,避免不必要的内存占用。
但是需要注意内存泄漏和内存碎片的问题,以避免系统性能下降。
2. 外部存储器管理外部存储器在嵌入式系统中一般包括闪存、SDRAM等。
为了更好地管理外部存储器,可以采取以下技巧。
首先,合理规划存储器空间。
根据系统需求和资源限制,合理规划存储器的分布和使用,避免存储器空间的浪费。
可以采取分区、虚拟内存等技术进行管理。
其次,优化存储器读写操作。
外部存储器的读写速度相对较慢,在设计系统时要尽量减少存储器的读写次数,可采用缓存技术、预取技术等来优化存储器读写性能。
最后,采用压缩和加密技术。
为了提高存储器的利用率,可以采用数据压缩技术对存储的数据进行压缩,减少存储器的使用量。
另外,对敏感数据进行加密,确保数据的安全性。
3. 文件系统选择在嵌入式系统中,文件系统的选择也对存储器的管理起着重要作用。
基于马尔可夫链的嵌入式内存预测分配算法

Re s e a r c h o f p r e d i c t a b l e e mb e d d e d me mo r y d i s t r i b u t i o n me c h a n i s m b a s e d o n Ma r k o v
CHENG Xi a o — h u i ,GONG Yo u - ai r n 。XU An - ui r n g 。
( 1 .Co l l e g e o f Me c h a t r o n i c s En g i n e e r i n g a n d Au t o ma t i o n,S h a n g h a i Un i v e r s i t y,S h a n g h a i 2 0 0 0 7 2,Ch i n a ; 2 .Co l l e g e o f I n f o r ma t i o n S c i e n c e a n d E n g i n e e r i n g,Gu i l i n Un i v e r s i t y o f Te c h n o l o g y ,Gu i l i n 5 4 1 0 0 4 ,C h i n a ) Ab s t r a c t :To i n c r e a s e t h e a l l o c a t i o n e f f i c i e n c y o f d y n a mi c me mo r y f o r e mb e d d e d s y s t e m ,a n e w d e s i g n f o r e c a s t me t h o d o f e m— b e d d e d me mo r y a l l o c a t i o n a l g o r i t h m b a s e d o n a n a l y s i s o f c l a s s i c a l me mo r y a l l o c a t i o n a l g o r i t h m a n d Ma r k o v c h a i n p r e d i c t i o n p r i n — c i p l e i s p r e s e n t e d . Th e a l g o r i t h m i s u s e d t o p r e d i c t t h e e mb e d d e d s y s t e m me mo r y d y n a mi c a l l o c a t i o n b y t r a n s f e r q u a n t i t y s t a f s — t i c s f r o m t h e me mo r y a l l o c a t i o n a d n p r o b a b i l i t y ma t r i x, c o mb i n e d wi t h t h e c l u s t e r i n g a n a l y s i s .I n t h e a l g o r i t m h r e a l i z a t i o n,l i g h t —
tlsf原理机制

tlsf原理机制TLSF(Two-Level Segregated Fit)是一种内存分配算法,主要用于实时嵌入式系统中的动态内存管理。
TLSF旨在提供高效的内存分配和释放机制,以减少内存碎片和提高性能。
本文将详细介绍TLSF原理和机制。
一、TLSF的结构TLSF的核心是一个两层分离的空闲链表,其中包含多个块链表。
每个块链表代表一种大小的内存块。
TLSF根据内存块的大小将其分配到特定的块链表中,使得每个链表中的内存块大小相对较为接近。
TLSF的数据结构主要包括以下几个部分:1.全局控制结构体:用于记录整个内存空间的状态和信息,包括内存总大小、空闲内存大小、已分配内存大小等。
2.管理头:用于管理每个块链表的头部信息,包括块链表的位图、索引信息等。
3.块头:用于管理每个内存块,包括块的大小、状态(分配或空闲)、块链表的索引等。
二、TLSF的操作流程TLSF的操作流程主要包括内存分配和内存释放两个步骤。
1.内存分配(1)从全局控制结构体中获取适当大小的块链表。
(2)在所选的块链表中空闲针对所需大小的空闲内存块。
(3)如果找到合适的内存块,则将其分配给用户,并更新全局控制结构体中的相关信息。
(4)如果没有找到合适的内存块,则继续从更大的块链表中,直到找到合适的内存块为止。
(5)如果仍然找不到合适的内存块,则宣布内存不足,并根据特定策略处理。
2.内存释放(1)获取用户要释放的内存块。
(2)将释放的内存块标记为空闲状态,并更新全局控制结构体中的相关信息。
(3)检查相邻的空闲内存块,如果有连续的空闲内存块,则将它们合并成一个更大的空闲内存块。
(4)将合并后的空闲内存块插入到适当大小的块链表中。
三、TLSF的优势和特点1.减少内存碎片:TLSF通过使用两级分离的空闲链表和合并相邻的空闲内存块的方式,可以有效减少内存碎片,提高内存利用率。
2.高效的内存分配和释放:TLSF通过使用位图和索引的方式,可以快速找到合适的内存块,实现高效的内存分配和释放操作。
嵌入式系统的内存管理与优化技巧

嵌入式系统的内存管理与优化技巧嵌入式系统是一种特殊的计算机系统,它常常被用于各种嵌入式设备中,如智能手机、汽车控制系统和医疗设备等。
由于嵌入式系统具有资源受限、功耗低、实时性要求高等特点,对于内存的管理和优化显得尤为重要。
本文将介绍嵌入式系统的内存管理方法以及一些优化技巧。
首先,嵌入式系统的内存管理需要考虑资源受限的情况。
由于嵌入式设备的内存容量相对较小,因此必须合理利用内存空间并进行有效的管理。
一种常见的方法是使用静态内存分配。
静态内存分配是在编译阶段进行的,将内存分为固定大小的块,并在编译时决定各个模块所需的内存大小。
另一种常用的内存管理方法是动态内存分配。
动态内存分配是在运行时根据需要动态申请内存空间,提供了更大的灵活性。
然而,动态内存分配在嵌入式系统中需要小心使用,因为它可能导致内存碎片问题。
为了避免内存碎片,可以使用内存池技术。
内存池是一种预先分配一块连续内存的方法,然后通过动态内存分配算法在运行时分配和释放内存。
另一个需要考虑的因素是功耗。
嵌入式系统通常由电池供电,因此优化功耗是十分重要的。
在内存管理中,功耗优化可以通过以下方式实现。
首先,可以使用低功耗内存。
低功耗内存可以降低系统的整体功耗,减少能量消耗。
其次,可以采用自适应电压和频率调整技术。
通过根据实际负载需求自动调整电压和频率,可以达到降低功耗的目的。
此外,嵌入式系统往往有严格的实时性要求。
因此,在内存管理过程中,必须考虑到实时性的问题。
一种常见的方法是使用固定分区分配技术。
将内存划分为固定大小的分区,然后为不同的任务分配不同的分区。
这样可以确保任务之间的内存访问不会发生冲突,提高实时性能。
除了以上的内存管理方法外,还有一些其他的优化技巧可用于提高嵌入式系统的内存性能。
例如,可以通过使用编译器优化选项来减少代码的大小和执行时间,从而降低内存的需求。
此外,还可以使用压缩算法对内存进行压缩,以节省内存空间。
在开发嵌入式系统时,还需要注意一些常见的内存错误。
基于μC/OS-Ⅱ的一种嵌入式系统内存管理方案

.
・
.
・
.
以分 配 , 并修 改 相 应 的 分配 记 录 表 。 我 们 将 已经 分 配 给 用 户 的 内 存 区域 称 为 “ 占用 块 ” 未 被 分 . 接 收 系 统 或 用 户 释 放 的 内 存 区 域 .并 相 应 的 修 改 分 配 记 配 的 内存 区域 称 为 “ 闲块 ” 每个 块 都 需 要 必 要 的 管 理 元 素 对 空 。 录表。 其 进 行记 录 , 标识 其使 用 状 态 、 置 、 小 等信 息 。 初 始 化 后 。 位 大 整 用 户 申请 的 内存 空 间 必 须 是 连 续 的 .一 方 面 这 是 由 于 如 个 内存 池 作 为 一 个 大 的 空 闲 块 。 以想 见 。 可 经过 一定 时 间 的运 行 果 空 间不 连 续管 理 算 法 就 会 不 实 用 .另 外 一 方 面 是 由于 程 序 运 后 。 个 内存 区会 呈现 出 占用 块 和 空 闲 块 犬 牙 交 错 的 状 态 。 整
.
般 而 言 。 态 内存 管 理应 该 具 有 如 下 功 能 : 动 系统 最多 可 以分 配 2 0个 内存 块 。这 样 可 以 保 证 遍 历 链 0 记住 每个 分 区 的状 态 。 哪些 是 已分 配 的 。 些 是 可 以用 来 表 的 间不 会 失 去 控 制 哪 分配的 。 ‘ 每 块 最 多 分配 10 0 字 节 的 内存 。 50 0个 实 施 分 配 。 系 统 程 序或 用 户 提 出 申请 时 . 所 需 的 量予 在 按 不 支 持 虚 拟 内存 和 分 页 。
.
而 且 静 态 分 配 容 易 使 系 统 失 去 灵 活 性 .静 态 分 配 不是 本 文 讨论 况 下会 造 成 内存 浪 费 。
嵌入式实时系统内存池技术分析

嵌入式实时系统内存池技术分析
罗浩
【期刊名称】《中国新通信》
【年(卷),期】2024(26)5
【摘要】在嵌入式实时系统中,内存资源的使用通常要求较小的响应时间,并减少内存碎片的产生。
为满足这些要求,开发者普遍采用内存池技术。
通过内存池技术,申请和释放内存的过程无需系统调用的介入,这提高了执行效率,因此在嵌入式实时系统中被广泛应用。
本文详细分析了常用的内存池资源管理技术的原理,并探讨了它们在实践中采用的实现方法。
同时,总结了它们的优缺点,并根据各自的特点提出了一些有效的改进思路,以改善系统的响应速度并减少内存碎片的生成。
【总页数】4页(P34-36)
【作者】罗浩
【作者单位】航空工业西安航空计算技术研究所
【正文语种】中文
【中图分类】TP3
【相关文献】
1.嵌入式系统的一种快速内存访问对象池算法
2.嵌入式实时系统内存管理策略
3.嵌入式实时系统中动态内存管理算法的设计与实现
4.嵌入式系统中池式内存分配方法的分析
5.机载数传设备嵌入式应用软件的内存池设计
因版权原因,仅展示原文概要,查看原文内容请购买。
嵌入式终端平台内存管理算法比较

间请 求 , 伴 系 统 会 分 配 1 8K 的空 间 来 满 足 。 伙 2 B
伙 伴 系统 比 那 些 按 大 小 分 配 的 算 法 有 更 多 的 优 点 。
在最坏情况下要搜索整个链表 , 而一 般情 况 下 的搜 索 节 点 数 接 近 链 表 总 节 点 数 的 一 半 。定 义 t 为 最 坏 情 况 下 分 配
以表 1中的 数 据 为 例 , 用 伙 伴 算 法 来进 行 内 存 分 配 采 时 , 1MB的 空 间 在 申 请 时 只 可 以 申请 到 5 2KB, 利 用 1 其
率 只 有 5 左 右 , 见 其 内存 利 用 率 很 低 。 O 可
3 U B算 法
这 种 管 理 是 基 于 UB块 , 就是 固 定 大 小 的 用 户 缓 冲 也 块 来 实 现 的 。利 用 实 时 操 作 系 统 的 malc fe l /re功 能 划 分 o 出一 块 内存 空 间称 为 UB区 , UB区 的管 理 采 用 固 定 大 对 小 内存 管 理 机 制 。 UB结 构 示 意 图 如 图 2所 示 。它 的 具
存 请 求 得 不 到 满 足 , 而 严 重 地 影 响程 序 的 正 常 功 能 。试 进
考 虑 系 统 共 有 1MB 内存 空 间 可 用 , 用 伙 伴 系 统 进 行 管 采
理 。有 如 下 请 求 : 求 A,6 ; 求 B,6 ; 求 请 2 0KB 请 2 0KB 请
和 R0M , MUX 的运 行 使 用 的 是 机 身 内存 , 常 有 限 , 非 也
很 昂 贵 。嵌 入 式 平 台要 支 持 多 种 业 务 , 内存 的 使 用 和 管 理
就 显得 更加 重 要 , 果 没 有 一 套 高 效 的 内存 管 理 机 制 , 如 很 可 能 出 现 大量 的 内存 空洞 而 导 致 内存 的不 足 , 响 系 统 的 影
嵌入式系统中池式内存分配方法的分析

计算机 数字工程
Comp t r& Diia gne rn ue g tlEn i e ig
Vo . 6 No. 13 2
5 7
嵌 入 式 系统 中池 式 内存 分 配方 法 的分 析
综 上所 述 , 如果针对 嵌入 式系 统应用设 计一个
低软件开发的复杂性 和成本的三种工具 , 以 可 有效解 决 由于平 台异 构带 来 的 软 件 复用 问题 。开
发 出 一个基 于 内存 资源管 理 的框架 , 实现 软件设 计 与硬件 尢 关 , 将大 大提高嵌 入式 软件 的复用 性 。 池式 内存 分配 方法采 用 内存池 管理 内存 , 内存
分 配一定 数量 的 内存 。 由于 在 内存 池 中预 先划 分
出了若 : f 内存块 , 采用 高效 的 内存 管理算 法用 于 内
存 分配 , 以有 效 降低 内存 碎 片 的产 生 , 高 内存 可 提
2 池 式 内存 分 配方 法
从 内存池 可分 配 内存 单元 大小来分 , 为 固定 分
王明路
( 海
王 希敏
武汉
王
哲
程 大学
40 3 ) 3 0 3
摘
要
介绍适合嵌入式系统应用的池式 内存分配方法 , 详细分析 A D公司开发的一种实 时操作系统核 Vsa D P+ i l S u
+K re( D 、 入式 可配置实 时操作系统 e o enlV K)嵌 C s以及 自适应通信框架 A E中的池式 内存 分配方法及具 体应用。最后 , C 针对平台异构及嵌入式实时操作系统 R O T S的多样性 导致 的应 用软件 可复用性差 问题 , 出使 用池式 内存分 配方法框架 给 开发嵌入式系统软 件的思路 。 关键词 池式 内存分配方法 R O V Ke o A E T S D C s C
嵌入式系统的存储器系统

在嵌入式系统中,I/O操作通常被映射成存储器操作,即输入/输
出是通过存储器映射的可寻址外围寄存器和中断输入的组合来实
现的。I/O的输出操作可通过存储器写入操作实现;I/O的输入操 作可通过存储器读取操作实现。这些存储器映射的I/O空间不满足 cache所要求的特性,不能使用cache技术,一些嵌入式系统使用 存储器直接访问(DMA)实现快速存储。
嵌入式系统的存储器与通用系统的存储器有所不同,通常由ROM、 RAM、EPROM等组成。嵌入式存储器一般采用存储密度较大的存 储器芯片,存储容量与应用的软件大小相匹配。
4.2.3 常见的嵌入式系统存储设备 1.RAM(随机存储器) RAM可以被读和写,地址可以以任意次序被读。常见RAM的种类
MMU中的域指的是一些段、大页或者小页的集合。每个域的访问 控制特性都是由芯片内部的寄存器中的相应控制位来控制的。例 如在ARM嵌入式系统中,每个域的访问控制特性都是由CP15中的 寄存器C3中的两位来控制的。
MMU中的快速上下文切换技术(Fast Context Switch Extension, FCSE)通过修改系统中不同进程的虚拟地址,避免在进行进程间 切换时造成的虚拟地址到物理地址的重映射,从而提高系统的性 能。
当ARM处理器请求存储访问时,首先在TLB中查找虚拟地址。如 果系统中数据TLB和指令TLB是分开的,在取指令时,从指令TLB 查找相应的虚拟地址,对于内存访问操作,从数据TLB中查找相 应的虚拟地址。
嵌入式系统中虚拟存储空间到物理存储空间的映射以内存块为单 位来进行。即虚拟存储空间中一块连续的存储空间被映射到物理 存储空间中同样大小的一块连续存储空间。在页表和TLB中,每 一个地址变换条目实际上记录了一个虚拟存储空间的内存块的基 地址与物理存储空间相应的一个内存块的基地址的对应关系。根 据内存块大小,可以有多种地址变换。
emwin内存分配策略

emwin内存分配策略emWin是一款专为嵌入式系统设计的图形界面软件包,广泛应用于各种嵌入式设备中。
在使用emWin进行界面开发时,内存分配策略是一个非常重要的考虑因素。
本文将围绕emWin内存分配策略展开讨论,介绍常见的内存分配策略以及其适用场景。
一、静态内存分配策略静态内存分配策略是指在程序编译阶段,将界面所需的内存空间预先分配好,并在程序运行时直接使用这些预分配的内存空间。
这种策略的优点是分配过程简单,运行效率高,适用于内存资源充足且固定不变的情况。
然而,静态内存分配策略的缺点是对内存需求的估计比较困难,容易出现内存不足或浪费内存的情况。
二、动态内存分配策略动态内存分配策略是指在程序运行时,根据界面的实际内存需求动态地分配内存空间。
这种策略的优点是能够根据界面的实际情况灵活分配内存,避免了内存的浪费。
常见的动态内存分配算法包括堆内存分配算法和内存池分配算法。
1. 堆内存分配算法堆内存分配算法是指使用动态内存分配函数(如malloc和free)从堆内存中分配和释放内存。
这种算法的优点是分配和释放过程简单灵活,适用于内存需求不确定的情况。
然而,堆内存分配算法的缺点是容易产生内存碎片,造成内存的浪费和分配效率的降低。
2. 内存池分配算法内存池分配算法是指将一块连续的内存空间划分为多个固定大小的内存块,然后通过链表等数据结构管理这些内存块的分配和释放。
这种算法的优点是分配和释放过程高效,不会产生内存碎片。
内存池分配算法适用于内存需求相对固定且频繁分配和释放内存的情况。
三、混合内存分配策略混合内存分配策略是指将静态内存分配和动态内存分配结合起来使用。
可以根据界面的特点和内存资源的情况,选择合适的内存分配策略。
例如,可以将界面的静态部分使用静态内存分配策略,而将界面的动态部分使用动态内存分配策略。
这种策略可以兼顾静态内存分配和动态内存分配的优点,提高内存的利用率和运行效率。
在使用emWin进行界面开发时,选择合适的内存分配策略非常重要。
基于嵌入式系统内存分配方式及策略研究

静态分 配的可用 内存 大小在编译 或链接时确 定 ,系统初 始化阶段 预先分配好 固定 数量的 内存 ,用于存放 所有需要使 用的对象 和数据结 构 。程序运行 时能且只能 使用这些 内存 空间 。采 用这种分 配方案的程 序段 ,其大小一般在编译时就能确定。 动态分配 的内存在程序运 行时根据 需要 向系统 申请后获得 ,只有 在需要的时候 ,才分配或释放。
关 键 词 : 入 式 系统 ; 嵌 内存 ; 配 方 式 分
1 嵌入式 系统对 内存分配的要求 嵌入式系统是 一个资 源受 限系统 ,系统对 内存 开销和管理 比其他 系统更严格 。因此 ,内存管理 机制就成 为嵌入式 系统研 究 中的一个重 点和难点的问题 ,它不 同于一 般的桌 面系统 ,从整体 上看应满 足三文 面要求 : 第 一 ,实时性 。要 保证嵌入 式系统 的实时性 ,则要 求尽可 能快 速 的分 配内存 。第二 ,可靠性 。它 是嵌入式 系统内存管理 机制的基本要 求。第三 ,高效性 。嵌入式 系统 中 内存是 一种有 限并且 昂贵 的资 源。 故内存分配要尽可能 的减少 浪费 。 2 内存分配方式及分配策略研究 嵌入式 系统中内存管理方案大致 可以分为两大类 : 分配和动态 静态
21 静 态 内存 分 配 方式 .
一
般的嵌人式 系统都支持 静态分配 ,因为像 中断向量表 、操 作系 统镜像这类 的程序段 ,其程序大小在编译 和链接 时是确定 的。 静 态内存分配在 程序执行前 就进行 ,效 率较高 ;编 泽时可精 准的 估计 系统内存 的需求状况 ;所有 的内存分 配动作所需时 间很少且 固定 ; 分配的内存 一般不归 还 ,外部碎 片很 少 ;程 序易测试 ,可靠性高 。这 些 优点使得 静态 内存 分配模 式尤其适 用于 实时应用 和高 安全性 系统 。 若硬实 时系统对实时性 和可靠性要求 极高 ,不 能容忍一次 的延 时或一 带来 的不 确定 性 。 次分配失败 ,就可采用静态分配方案 ,在编译时就分配好需要 的内存 。 221 内存碎片 。内存碎片是 动态分配 ,尤其是直接 在系统堆 中分 配 .. 另一方面 ,其缺点表现为 :1 )静态分配必须在设计 时预先考虑到 的不分 区方式 的主要 问题 。在嵌 入式实 时操作系统 中 ,多次 的分配 和 所 有 的 情 况 ,一 旦 出 现 没 有 考 虑 到 的 情 况 ,系 统 就 无 法 处 理 ;2 浪 费 释放 内存 ,会把原来 很大 的一块 连续 内存 区域逐渐分 割成 许多小而且 ) 资源 ,因为静 态内存分配方 式必须按 照最坏情况进 行最大 的配 置 ,因 互 不相 邻的内存 区域 ,也就是 内存碎片 。内存碎片 主要有 两种 :一 种 此 ,往往分配 比实际用量更多的内存 ;3 )预先分配 内存也 增加了系统 是数据结构未用完它所分配 到的内存块所产 生的 “ 内部碎片 ” ;另一种 的启动时间 ;4 )为限制容量 ,必须指定程序将存储 的最大数据 量 ;5 是两个 已分配数据块 之间的 内存 由于太小 而无法用于存储 任何东西造 ) 常需限制系统 中同时容纳的进 程数 ,结束 旧任务之后才能开始新任 务 ; 成 的 “ 外部碎片” 。碎片很难消除 :如果按实 际需求 而分配大小不一 的 6 )在硬件平台不变 的情况下 ,要想增加任 务 ,添加功 能几乎不可 能 , 区块 ,就容易 产生外部 碎片 ;若 为了避免外部 碎片而把 内存 分配成大 升级困难 。这些均会 降低 系统 的可用性 。7 在程序设计阶段就必须知 小相等 ( ) 取为各需求的最大值) ,就容易造成 因区块 未被充 分利用而形 道所需 的内存 的类型和数量并作 出分 配,这 降低 了系统 的灵活性 。 成的内部碎片。 22 动 态 内存 分 配 方 式 . 2 . 内存丢失 。内存丢失 是一块 已经 分配但永远不 会被释放 的内存 .2 2 大 多数 的嵌 入式 系统 是硬 实时 系统 和软 实时 系统 的综 合 。按照 区 ,是应用程序 所造成 的缺陷。嵌入式 系统要长 时间运行 ,就要 确保 R MS理论 ,所有硬实时任 务总的 C U时 间应小于 7 %,故应采用抢先 绝对没有内存丢失。 P 0 式 多任务 调度 ,通过动态 内存分配来 满足可靠性 和实时性要 求不高 的 内存 块使用 完后 ,特定 的块必须重新 放 回它 以前 所属的分 区,否 任务 。而大部 分的面 向过 程或面 向对象 语言都提供 在堆 中创 建和 回收 则 可能造成 内存 丢失 。例如 ,用户任务 已经分配 了 6 4字 节的 内存块 , 对象的动态管理机制 ,并在缺省状态下使用 。 用 完 后 ,把 它 归 还 给 另 一 个 块 大 小 为 3 2字 节 的 分 区 ,就 产 生 了 6 — 4 静态分 配方式 注重效率 和安全 ,而动态 分配 方式则 注重 灵活性 。 3 = 2字节 的 内存 丢 失 。 23 在动态方式下 ,程序要求 的基本 内存空 间是在 目标模 块链 接装入 内存 为保证 所有分配 的内存在使用 完后能得 到释放 ,就 必须 建立一定 时确定并分配 的 ,但 是在程 序运 行过程 中允许 申请 附加的 内存空 间或 的规则来 跟踪各个 内存 的使用状 况。在动 态内存分配方式 中 ,由于程 在 内存 中移动 ,即分配工作 可以在程序运 行前及程序 运行过程 中逐步 序员无法 预知在规定 时间内要分 配多少数据块 ,故一般用链 表对 内存 完成。这样就 避免分 配而不被使用 的内存 ,降低 了对 内存 的总体 需求 , 的分配与释放进行跟踪 。使用 内存检测工具来检测是否出现 内存丢失。 减小了 内存的浪 费 ;改善 了设计 质量 ,使 系统更易编 写 ;运行时 间分 为减少 内存 丢失 ,可采 用少分 配多使用 的池 式内存分配方 式 ,即 配内存 ,降低 了系统启动 的时 间。 旦分配就可多次使用。 在 动态内存分配 的方式下 ,程 序员编写相关 程序 的时候 可以不需 223 池式 内存分 配。嵌入式 系统 中内存 分配常用手 段一般采用二 级 .. 要 考虑 内存分配 的问题 而专注于程 序本身 的设计 。程序与硬 件平 台的 配置 : 一级利用 操作系统提 供的分 配手段分配好所 需的内存 ;第 二 第 相关性下 降 ,这就方便 了程序的移植 ,不是为嵌 入式系统设计 的程序 级采用池式 内存分 配方式 。 可以很 方便的移植到嵌 入式系统上运行 。比如嵌 入式系统 中使用 的网 在嵌 入式系统 中 ,若有 大量具有相 似性的对象并 经常进行分配 和 络 协议 栈 ,在 特 定 的 平 台 下 ,为 了 比较 灵 活 地 调 整 系 统 的功 能 ,在 系 归还 ,比如 ,以太 网的 MA C地址 表 、路 由表等 ,则可根据各类信息 的 统 中各个功能之间作出权衡 ,就必须支持动态内存分配。 实 际大 小为其 分 配一 个 内存缓 冲池 ,该 内存 池 很像 分 ( 下转 4页
一种VxWorks内存管理方案

电子科技 2 0 0 7年第 2期( 第 29期) 总 0
一
种 V Wok x rs内存 管 理 方 案
刘东栋
( 西北工业大学 软件与微 电子学 院 ,陕西
摘 要
西安
7 07 ) 10 2
探 讨 嵌 入 式 开发 对 内存 管 理 的 基 本 要 求 、 嵌 入 式 开 发 内存 管 理 的 关键 问 题 以 及 给 出一 种 V Wok x rs
统 ,如 Widw 、Lnx no s iu ,使 用 了 虚 拟 存 储 器 的 概 念 。虚 拟 内存 地址 被 送 到 MMU 映射 为 物 理 地 址 , 实 际存储 器 被 分 割 为 相 同大 小 的 页 面 ,采 用 分 页
的方式 载 人进 程 。
与 系统 的 内存 管 理 。从 编 译 内核 开 始 ,开 发 人 员 必 须告 诉 系 统 这 块 开 发 板 到 底 拥 有 多 少 内存 ;在 开 发应 用 程 序 时 ,必 须 考 虑 内存 的 分 配 情 况 并 关
注应 用 程序 需 要 运 行 空 间 的 大 小 。另 外 , 由 于 采
大多 数嵌人 式 系统 针对 没 有 M MU 的处 理 器设
计 ,不能 使用 处 理 器 的虚 拟 内存 管 理 技 术 ,而 采 用实存 储 器 管 理 策 略 。 因而 对 于 内 存 的访 问是 直
接 Байду номын сангаас ,它对 地址 的访 问不 需 要 经 过 MMU,而是 直 接送 到地 址 线 上 输 出 ,所 有 程 序 中 访 问 的地 址 都 是实 际物 理 地 址 ;而 且 ,大 多 数 嵌 人 式 操 作 系统
中 图分 类 号
A a g m e t S he e o W o k e o y M na e n c m fVx r sM m r
一种嵌入式应用的内存分配算法

一种嵌入式应用的内存分配算法作者:程知敬来源:《电子技术与软件工程》2019年第05期摘要;;; 传统嵌入式系统为保障系统的可靠性和实时性,大多采用静态分配内存的方式,导致应用开发的效率低下。
本文提出了一种嵌入式应用的内存分配算法,在经典深度优先搜索算法的基础上,结合自研的内存复用算法——间隔复用法,实现自动化的应用内存分配,且使得内存利用率得以提升。
最后,通过工程实例验证了其正确性及有效性。
【关键词】嵌入式系统内存分配算法1 引言传统嵌入式软件的开发流程是基于嵌入式集成开发环境完成实时处理软件设计、编码、编译,将编译后的可执行文件下载到嵌入式设备上进行调试验证。
该过程涉及软、硬件的资源分配,对软件设计人员提出了较高要求。
为提高软件开发效率,基于模型的设计方法开始受到广泛推崇。
它始于20世纪90年代初的汽车制造和航空航天工业;90年代中期,自动代码生成技术使模型化设计方法有了实用价值;1984年随着MathWorks公司的成立,旗下的Simulink/Stateflow、EmbeddedMatlab等产品融合了建模、仿真和分析工具,将软件开发流程方式彻底转变为在一个可视化的交互开发平台上进行软件设计和开发,并通过直观的系统模型进行可视化处理。
但对于有高性能要求的嵌入式软件,模型仿真不能替代真实的应用场景,因为仿真难以达到实物板卡的运行性能。
因此,在模型化开發生成软件代码之后,仍必须编译下载到硬件板卡上运行。
在嵌入式实时系统中运行应用,其内存分配是一个重点问题。
为给系统提供最好的可靠性与实时性,在以VxWorks为代表的硬实时系统中,一般遵循静态内存分配的原则,比如预先申明变量、数组的内存空间等。
然而传统的人工分配方式必然导致整个系统的开发效率和自动化水平被拉低。
本文提供一种嵌入式应用的内存分配算法,实现软件各应用模块在嵌入式设备内存空间分配的自动化,并确保板卡内存的高利用率和高复用率。
2 嵌入式内存分配的要求嵌入式应用的拓扑结构满足有向无环图(DAG,Directed Acyclic Graph),应用即为图的顶点,应用的执行顺序是有方向的,且应用之间不会形成圈。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一种嵌入式系统的内存分配方案摘要:实时性、可靠性的要求,使得许多嵌入式应用使用自己的内存管理程序。
本文探讨嵌入式系统中对内存管理的要求、存在的问题以及可能的解决策略;介绍一种“一次分配,多次使用”的动态内存分配方法,并给出2个例子。
关键词:嵌入式系统内存管理一次分配多次使用1 嵌入式系统中对内存分配的要求①快速性。
嵌入式系统中对实时性的保证,要求内存分配过程要尽可能地快。
因此在嵌入式系统中,不可能采用通用操作系统中复杂而完善的内存分配策略,一般都采用简单、快速的内存分配方案。
当然,对实性要求的程序不同,分配方案也有所不同。
例如,VxWorks采用简单的最先匹配如立即聚合方法;VRTX中采用多个固定尺寸的binning方案。
②可靠性。
也就是内存分配的请求必须得到满足,如果分配失败可能会带来灾难性的后果。
嵌入式系统应用的环境千变万化,其中有一些是对可靠性要求极高的。
比如,汽车的自动驾驶系统中,系统检测到即将撞车,如果因为内存分配失败而不能相应的操作,就会发生车毁人亡的事故,这是不能容忍的。
③高效性。
内存分配要尽可能地少浪费。
不可能为了保证满足所有的内存分配请求而将内存配置得无限大。
一方面,嵌入式系统对成本的要求使得内存在其中只是一种很有限的资源;另一方面,即使不考虑成本的因素,系统有限的空间和有限的板面积决定了可配置的内存容量是很限的。
静态分配与动态分配究竟应用使用静态分配还是动态分配,一直是嵌入式系统设计中一个争论不休的总是。
当然,最合适的答案是对于不同的系统采用不同的方案。
如果是系统对于实时性和可靠性的要求极高,不能容忍一点延时或者一次分配失败,当然需要采用静态分配方案,也就是在程序编译时所需要的内存都已经分配好了。
例如,火星探测器上面的嵌入式系统就必须采用静态分配的方案。
另外,WindRiver公司的一款专门用于汽车电子和工业自动化领域的实时操作系统OSEKWorks中就不支持内存的动态分配。
在这样的应用场合,成本不支持内存的动态分配。
在这样的应用场合,成本不是优先考虑的对象,实时性和可靠性才是必须保证的。
当然,采用静态分配一个不可避免的总是就是系统失去了灵活性,必须在设计阶段就预先知道所需要的内存并对之作出分配;必须在设计阶段就预先考虑到所有可能的情况,因为一旦出现没有考虑到的情况,系统就无法处理。
这样的分配方案必须导致很大的浪费,因为内存分配必须按照最坏情况进行最大的配置,而实际上在运行中可能使用的只是其中的一小部分;而且在硬件平台不变的情况下,不可能灵活地为系统添加功能,从而使得系统的升级变得困难。
大多数的系统是硬实时系统和软实时系统的综合。
也就是说,系统中的一部分任务有严格的时限要求,而另一部分只是要求完成得越快越好。
按照RMS 理论,这样的系统必须采用抢先式任务调度;而在这样的系统中,就可以采用动态内存分配来满足那一部分可靠性和实时性要求不那么高的任务。
采用动态内存分配的好处就是给设计者很大的灵活性,可以方便地将原来运行于非嵌入式操作系统的程序移植到嵌入式系统中,比如,许多嵌入式系统中使用的网络协议栈。
如果必须采用静态内存分配,移植这样的协议栈就会困难得多。
另外,采用动态内存分配可以使设计者在不改变基本的硬件平台的情况下,比较灵活地调整系统的功能,在系统中各个功能之间作出权衡。
例如,可以在支持的VLAN 数和支持的路由条目数之间作出调整,或者不同的版本支持不同的协议。
说到底,动态内存分配给了嵌入式系统的程序设计者在比较少的限制和较大的自由。
因此,大多数实时操作系统提供了动态内存分配接口,例如malloc和free函数。
RTOS提供的内存分配接口不同的RTOS由于其不同的定位,采用不同的内存分配策略。
例如VRTX中,采用类似于GNU C中由Doug Lea开发的内存分配方案,即Binning算法,系统内存被分成了一些固定尺寸的内存块的算法,系统内存被分成了一些固定尺寸的内存块的集合。
这种方法的优点是查找速度快而且不会产生内存碎片。
但是,它的缺点也很明显,就是容易造成浪费,因为内存块的尺寸只有有限个,分配时只能取较大的内存块来满足一个较小的需求,累积起来,浪费就很大了;而且操作系统管理这样一个内存分配表也是一个很大的负担。
下面详细介绍一下我们常用的RTOS——美国风河公司的VxWorks中采用的内存分配策略。
VxWorks的前身就是VRTX,据说VxWorks的名称来自make vrtx work。
VxWorks的内存管理函数存在于2个库中;memPartLib 和memLib。
前者提供的工具用于从内存分区中分配内存块。
该库包含两类程序,一类是通用工具创建和管理内存分区并从这些分区中分配和管理内存块;另一类是标准的malloc/free程序提供与内存分区的接口。
系统内存分区在内核初始化时由usrRoot调用memInit创建。
其开始地址为RAM中紧接着VxWorks的BSS段之后,大小为所有空闲内存,如图1所示。
当创建其它分区时,一般需要先调用malloc从系统内存分区中分配一段内存才能创建。
内存分区的结构定义为mem_part,包含1个对象标记,1个双向链表管理空闲块,1个信号量保护该分区及一些统计信息,如总尺寸、最大块尺寸、调试选项、已分配的块数、已分配的尺寸等。
其语句如下:typedef struct mem_part {OBJ_CORE objCore; /*对象标志*/DL-LIST freeList;/*空闲链表*/SEMAPHORE sem; /*保护分区的信号量*/Unsigned totalWords;/*分区中字数*/Unsigned minBlockWords; /*以字为单位的最小块尺寸*/ Unsigned options; /*选项,用于调试或统计*//*分配统计*/unsigned curBlocksAllocated; /*当前分配的块数*/unsigned curWorkdAllocated; /*当前分配的字数*/unsigned cumBlockAllocated;/*累积分配的块数*/unsigned cumWordsAllocated;/*累积分配的字数*/}PARTITION;一般系统中只有1个内存分区,即系统分区,所有任务所需要的内存直接调用malloc从其中分配。
分配采用First-Fit 算法,通过free释放的内存将被聚合以形成更大的空闲块。
这就是VxWorks的内存分配机理。
分配时可以要求一定的对齐格式。
注意,不同的CPU架构有不同的对齐要求。
为了优化性能,malloc返回的指针是经过对齐的,为此的开销随构不同而不同。
例如,68K为4字节对齐,开销8字节;SPARC 为8字节对齐,开销12字节;MIPS为16字节对齐,开销12字节;I960为16字节对齐,开销16字节。
MemLib库中提供了增强的内存分区管理工具,并且增加了一些接口,而且可以设置调试选项。
可以检测2类错误:①尝试分配太大的内存;②释放内存时发现坏块。
有4种错误处理选项,当发生错误时记录消息或挂起任务。
但是,使用动态内存分配malloc/free时要注意到以下几方面的限制。
①因为系统内存分区是一种临界资源,由信号量保护,使用malloc会导致当前调用挂起,因此它不能用于中断服务程序;②因为进行内存分配需要执行查找算法,其执行时间与系统当前的内存使用情况相关,是不确定的,因此对于有规定时限的操作它是不适宜的;③由于采用简单的最先匹配算法,容易导致系统中存在大量的内存碎片,降低内存使用效率和系统性能。
针对这种情况,一般在系统设计时采用静态分配与动态分配相结合的方法。
也就是对于重要的应用,在系统初始化时分配好所需要的内存。
在系统运行过程中不再进行内存的分配/释放,这样就避免了因内存的分配释放带来的总是。
而且在系统初始化,因为没有内存碎片,对于大的内存块的需求容易满足。
对于其它的应用,在运行时进行动态内存分配。
尤其是某些应用所要求的大量固定尺寸的小内存块,这时就可以采用一次分配多次使用的内存分配方案。
下面详细介绍这种内存分配方案及其应用场合。
一次分配多次使用的内存分配方案在嵌入式系统设计中,经常有一些类似于内存数据库的应用。
这些应用的特点是在内存中管理一些树,比如以太网交换机中的MAC地址表、VLAN表等,或者路由器中的路由表。
这些树是由许多相同尺寸的节点组成的。
这样,就可以每次分配一个大的缓冲池,比如包含多个内存单元的数组,每个内存单元用于1个节点。
我们用一个空闲链表来管理该数组中的空闲内存单元。
每次程序需要分配内存以创建1个新的节点时,就从空闲链表中取1个单元给调用者。
程序删除节点并释放内存时,将释放的内存单元返还给空闲链表。
如果链表中的空闲内存单元取空了,就再次调用malloc 从系统内存中分配一个大的内存块作为新的缓冲池。
采用这样一种方案主要有如下优点:①减少了malloc/free的调用次数,从而降低了风险,减少了碎片;②因为从缓冲池中取一个内存单元是时间确定的,因此它可以用于严格时限的场合从而保证实时性;③它给用户以自由来添加一些用于内存分配和释放的调试函数以及一些统计功能,更好地监测系统中内存的使用情况。
这种方案必然涉及到一个缓冲池的结构。
一般缓冲池的结构由以下几部分组成:单元尺寸、块尺寸、缓冲池指针、空闲链表、用于统计和调试的参数等。
对缓冲池的操作包括创建缓冲池、释放缓冲池、从缓冲池中分配1个内存单元、释放内存单元回缓冲池等。
下面举2个例子说明一下该方案的具体使用情况。
.1 Intel交换机驱动程序中内存分配在以Intel的交换芯片为基础的交换机方案中,因为采用的是软件地址学习的方式,需要在内存中维护许多数据,如MAC地址表的软拷贝、VLAN表、静态单播地址表、组播地址表等。
这些表都是由一些树组成,每个树由一些固定尺寸的节点组成。
一般每个节点几十个字节,每棵树的节点数是可增长的,少则几十,最多可到16K个节点。
因此,很适合于采用该方案,具体的实现如下:缓冲池结构BlockMemMgrtypedef struct{MemSize data_cell_size; /*数据单元的尺寸*/MemSize block_size; /*块尺寸*//*下面的变量为预定义的每个管理器最多包含的块数,如64MAX_BLOCKS_OF_MEM_SIZE*/Unsigned short blocks_bEing_used;/*已使用的块数*/V oid mem_ptr[PAX_BLOCKS_OF_MEM_SIZE];/*块数组*/SLList free_data_cells_list; /*空闲链表*/}BlockMemMgr;结构中的参数包括:单元尺寸、块尺寸、已用块数、所有块的地址、空闲链表。