VxWorks的内存分配机制
VxWorks内存
管理内存分区
系统分区管理函数列举如下
创建内存分区
PART_ID memPartCreate(pPool, size) –pPool:指向该分区的内存指针 –size:按字节的内存分区大小 返回值为分区ID(PART_ID)或NULL 该分区内存可以取自: –独立的内存条 –系统内存分区分配的块 –CPU板的RAM
查看内存
附加的内存管理函数
void *calloc(nElems, size) –分配清零内存 void *realloc(ptr, newSize) –重新定义分配块的大小 int memFindMax() –返回系统内存中最大空闲块的大小
内存调整
为了快速,确定的分配固定大小的缓冲区,可以 使用消息队列
Target Server内存池
目标机上保留了一段内存池,用于Tornado工具 –动态加载目标模块 –为目标板上运行的任务传递字符串参数 –为WindSh创建变量 Target Server内存池的初始大小通过 WDB_POOL_SIZE定义。 –默认值为1/16的(sysMemTop()-FREE_RAM_ADRS) 在configAll.h中定义
创建内存分区实例
系统内存池
用于动态内存分配 –malloc() –创建任务(堆栈和TCB) –VxWorks内存请求 系统启动时初始化 –可以修改USER_RESERVED_MEM来保存专用存储器 –向板卡上添加内存需要修改LOCAL_MEM_SIZE的值
分配/释放内存
动态分配内存 –void *malloc(nBytes) –返回值为指向该内存的指针或者NULL 释放分配的内存 –void free(ptr)
vxworks使用过程中的100个疑问与解答
vxworks使用过程中的100个疑问与解答1. VxWorks是什么?VxWorks是一种实时操作系统(RTOS),由美国Wind River公司开发,适用于嵌入式系统。
2. VxWorks有哪些特点?VxWorks具有高度可靠性、实时性、可移植性和可扩展性等特点。
3.如何安装VxWorks?安装VxWorks需要下载安装包,然后按照安装指南进行安装。
4.如何创建VxWorks任务?可以使用taskSpawn函数来创建任务,指定任务的入口函数、优先级等参数。
5. VxWorks如何进行任务间通信?任务间可以使用消息队列、信号量、共享内存等机制进行通信。
6.如何调试VxWorks程序?可以使用Wind River公司的调试工具Wind River Workbench进行调试。
7. VxWorks支持哪些开发语言?VxWorks主要支持C和C++开发,也可以使用汇编语言和Java等。
8.如何加载和运行VxWorks程序?VxWorks程序可以通过TFTP、FTP等网络协议加载到目标设备上,然后使用命令运行。
9. VxWorks是否支持多任务?是的,VxWorks支持多个任务的同时运行,并通过任务调度器进行任务切换。
10.如何实现任务间的同步?可以使用信号量、事件标志等机制实现任务间的同步。
11. VxWorks中如何实现中断处理?VxWorks提供了中断服务例程(ISR)和处理器驱动程序(DPC)来处理中断。
12.如何列出VxWorks系统中的任务?可使用taskShow命令列出系统中所有任务的详细信息。
13.如何获取任务的优先级?可以使用taskPriorityGet命令获取任务的优先级。
14.如何设置任务的优先级?可以使用taskPrioritySet命令设置任务的优先级。
15.如何控制任务的时间片轮转?可以使用taskDelay命令来控制任务的时间片轮转。
16.如何查看VxWorks系统的中断信息?可以使用intShow命令来查看系统中的中断信息。
VxWorks下的内存管理
中 分 号 T3 圈 类 : P6
V W0k x r s下 的 内存 管 理
陈 洋 ,胡 向宇 ,杨 坚华
( 兰州物理研究所 ,兰州 7 0 0 ) 3 0 0
摘
要 :探讨了 V Wok x r s中内存分配策略 的实现 。对 8 3 6 0 8 0 8 / 4 6的段页 式管理机制进行 了介 绍,对 V Wo s 8 x r 下的内存管理机制进行 了 k
1 Wo k 简 介 Vx r s
V Wok x rs操作系统是美国 Wid Rv r公司推出的一种 n ie
这也是 8 3 68 4 6在实地址模式下的物理地址 形成 方 0 8/0 8 式 。 是因为在实地址模式下 , 这 控制寄存器 C 0的 P R G位( 页
式管理使能位) 0页式管理机构不工作) 为 ( ,所以线性地址 就
Th mp e n ai t o f me u l c t n i a ay e .Th s p p r i to u e e me t a d pa e me r n g me ton 8 8 / 0 8 , e i l me t t on meh d o mo a l ai s n l z d o o i a e n r d c s s g n n g mo y ma a e n 03 6 8 4 6
维普资讯
第3 3卷 第 8 期
V L3 o 3
・
计
ห้องสมุดไป่ตู้
算
机
工
程
20 07年 4月
Aprl2 0 i 0 7
N o8 .
Co mp t rEn i e rn u e gn e i g
软件技术 与数据库 ・
vxWorks memory
/*当前分配的块数*/ /*当前分配的字数*/ /*累计申请的块数*/ /*累计申请的字数*/
} PARTITION; 对于内存分区中的块,也有两个结构体在管理。包括分配内存时使用的 BLOCK_HDR 和 释放内存时使用的 FREE_BLOCK。
typedef struct blockHdr /* BLOCK_HDR */
int
lockOutLevel /* 中断屏蔽级*/
)
所以,系统内存的起始和结束地址在这里已经确定。
2 系统内存分区的创建
在 kernelInit()里启动的函数 usrRoot()里,根据输入的参数调用系统内存初始化函数 memInit (pMemPoolStart, memPoolSize);函数调用关系如图二。
块在以前的空闲块中间,意味着其后还有一小块未使用的空间,则增加一个空闲块结构管理
并将它加入到系统分区的freeList中。 调整curBlocksAllocated、cumBlocksAllocated、curWordsAllocated和cumWordsAllocated
/*指向对象管理结构*/ /*空闲链表*/ /*内存分区信号量*/ /*分区中的 Words 数。Bytes = Words X 2 */ /*分区中最小块大小,以 Word 为单位*/
2
unsigned options;
/*分区的内存选项,如错误是否上报*/
/* 分配统计 */ unsigned curBlocksAllocated; unsigned curWordsAllocated; unsigned cumBlocksAllocated; unsigned cumWordsAllocated;
如果找不到会按内存选项的设置options决定是否打印失败消息和挂起任务,并设置 error为S_memLib_NOT_ENOUGH_MEMORY,返回空指针。
VxWorks之认识(转)
VxWorks之认识(转)Tornado是WindRiver公司开发的用于嵌入式开发的一组产品,它包括32位实时操作系统VxWorks,集成开发环境(IDE,包括编译器等)。
下面是我阅读完VxWorks相关文档后的一些个人认识。
一.VxWorks操作系统VxWorks时实时多任务的嵌入式操作系统,它主要包括任务调度、I/O功能、文件系统、中断管理、内存管理、网络功能、内存管理、BSP(系统启动模块)等。
它的多任务的实现是由中断驱动的,即在每个系统时钟中断中,实现任务的调度。
VxWorks中的任务有优先级的概念。
与其它嵌入式操作系统相比,它有如下优点:1.任务之间的切换快,任务间通信手段多样;2.中断响应的延时短;3.内存管理安全:VxWorks把内存分成很多区域,包括内核区、用户区,并且采用虚拟内存管理的方法,这样大大提高了系统的安全性,并且增加了堆栈溢出的判断;4. I/O功能丰富,硬件驱动全面;5.文件系统强大;6.网络功能全面;7.对任务的实时监控;8. BSP(启动模块)的支持;9.多CPU的支持;10.系统各模块是单独的库,可以根据需要加载。
下面就详细讲述各部分内容。
1.多任务功能:VxWorks的任务有优先级的概念,其任务调度也是基于优先级考虑的,是抢占式的,VxWorks的任务有256个等级,0—255,数目越小表示优先级越高。
高优先级的任务可以打断低优先级的任务而抢先执行,只有在高优先级的任务执行完后,低优先级的任务才可以执行。
其调度算法有两种:完全抢占式的和循环分配式的。
完全抢占式的是除了高优先级任务可以打断低优先级任务外,在相同优先级的任务之间,不可以相互打断,并且同优先级任务不是同时执行的,只有等该任务执行完后,与其相同优先级的任务才可以执行;循环分配式除了具有抢占功能之外,相同优先级的任务是可以同时执行的,即系统时间片是在它们之间平均分配的,这样,相同优先级的任务可以同时执行。
vxworks内核笔记
*
* Process delay list. Make tasks at the end of their delay, ready.
* Perform round robin scheduling if selected.
FAST WDOG *wdId;/* pointer to a watchdog */
FUNCPTRwdRtn;/* watch dog routine to invoke */
intwdArg;/* watch dog argument to pass with wdRtn */
intstatus;/* status return by Q_REMOVE */
/* set up system timer */
sysClkConnect ((FUNCPTR) usrClock, 0);/* connect clock interrupt routine */
sysClkRateSet (SYS_CLK_RATE);/* set system clock rate */
sysClkEnable ();
}
/*******************************************************************************
** sysClkConnect - connect a routine to the system clock interrupt
taskRtnValueSet (pTcb, OK);
break;
}
case ERROR:
内存池在Vxworks系统内存管理中应用
S iT c n l g n g n ei g c e e h oo y a d En i e r n
内存池在 V w rs x ok 系统 内存管理 中应用
邹 寅伟
( 西北工业大学软件学院 , 西安 70 6 ) 10 5
摘
要
实时性、 可靠性是嵌入式应用使 用 自己的 内存 管理 程序 的要求。概 要地分析 了嵌入 式操作 内存管理的实现原理 ,在 V w rs x ok 内存管理 内存池
存分配策略 , 一般都采用 简单 、 快速 的内存分 配方 案 。当然 , 对实 性要求 的程 序不 同 , 配方 案也有 所 分
不 同 。例 如 ,x rs V Wok 采用 简单 的最先 匹 配 , 如立 即 聚合 方法 ; R X中采用 多个 固定 尺寸 的 。 VT 2 )可靠性 。也 就 是 内存 分 配 的请 求 必 须 得 到 满足, 如果 分配 失 败可 能 会 带来 灾 难 性 的后 果 。嵌 入 式系 统应用 的环 境千 变 万 化 , 中 有一 些 是 对 可 其
此基础上详细阐述 内存 池的算法 , 并描述 了它的实现 方法。
关键 词
中图法分类号
T 3 3 文献标识码 : P4 ; B
嵌 入式 系统 中对 内存 分 配有 以下 要求 :
1 )快速 性 。嵌 入式 系统 中对实 时 l 生的保 证 , 要
的内存需求时, 频繁的动态申请、 释放 内存是必然会 使 系统 的 内存 管理 链 表变 得 凌 乱 , 可 能产 生 大量 并
统检 测到 即将撞 车 , 如果 因为 内存分 配失 败 而不 能 相应 的操 作 , 发生 车毁 人亡 的事故 , 就会 这是 不能 容
忍 的。
VxWorks操作系统简介
通信机制——消息队列和管道
单处理器中任务间消息的传送采用消息队列 管道是一个虚拟的IO设备,是建立在消息队列上的,采用 标准的IO接口,能调用标准的I/O函数,进行管道打开、读 入和写入等操作。 消息队列和管道都会提供先入先出的缓冲(FIFO)以及同 步和互斥机制。 用于单个处理器中任务间的通讯,也可用于ISR与任务间的 通讯
Slip / PPP
内存管理
平坦模式(Flat Mode)
为什么不是段页式的管理? 页式管理要有程序-内存的映射, 严重影响实时性
VxWorks系统支持静态分配和 动态分配相合的内存分配
低端内存区和VxWorks区采用静态 分配,而保证VxWorks的实时性和 稳定性。
内存分配采用first-fit算法 当增加硬件内存时,需要修改 sysPhysMemTop( ) (或调整 LOCAL_MEM_SIZE)
任务结构——任务控制块(TCB)
任务控制块用来描述一个任务,每一任务都与一 个TCB关联。
任务控制块里面包含了:当前状态、优先级、要等 待的事件或资源、任务程序码的起始地址、初始堆 栈指针
任务的“上下文”(context)。任务的上下文就 是当一个执行中的任务被停止时,所要保存的所 有信息。通常,上下文就是计算机当前的状态, 也即各个寄存器的内容。
VxWorks的内存分配算法
出现的。
)
改进的内存分配算法 在 &’()*+, 现有内存管理库的基础上, 结合实际系统的需
要, 本文提出两方面改进。一是优化内存块分配算法, 另一方面 是优化的动态内存分配算法。 两者结合使用, 能很大程度上提高 系统的性能。
!H$ 优化内存块分配算法
实 际 中 通 常 利 用 标 准 的 I 语 言 的 .166)7 8 9*// 8 */166)7 来 进行内存的分配和释放。 &’()*+, 提供 ./.645 , ./.01*2345 提 供此类库函数的使用,但是直接使用这些库函数分配的内存块 会造成各种隐患。 例如: 分配一个内存块并使用其中未经初始化 的内容; 释放一个内存块但继续引用其中的内容; 调 用 */166)7 对一个内存块进行扩展,因此原来的内容发生了存储位置的变 化, 但程序引用的仍是原来存储位置的内容; 分配一个内存块后 即 “失去” 了它, 因为没有保存指向所分配内存块的指针; 读写操 作越过了所分配内存块的边界; 没有对错误情况进行检查。
?$4< J \F93++$,B ,$5’; 45; /’2%84Q2] ,$5’; 45; +3H2% E G ... ... C J 检测输入参数 J C 4D B WRR/’2%84Q2 ^^ @MNF8(_‘ a /’2%84Q2 E G 5$;4DF2%%$%B...EI %2;/%5 Bbc11EI U C J 计算累计分配内存大小 J C X84Q2 R /’2%84Q2 S ’4Q2$DB*+$,&F(5D$E S ’4Q2$DB*+$,&FK34+E C J 分配完整内存块大小 J C 4D B bc11 RR BX6;% R 93++$,BX84Q2 EE E G 5$;4DHF2%%$%B...E %2;/%5 Bbc11EI U C J 填充内存块相关信息在内存块头中 J C BB*+$,&F(5D$JEX6;%Ede+3H2% R +3H2%I BB*+$,&F(5D$JEX6;%Ede;4< R ;3’&(<82+DBEI BB*+$,&F(5D$JEX6;%Ede4’P%22< R PM18‘I BB*+$,&F(5D$JEX6;%Ede’4Q2 R X84Q2I ...... C J 填充内存块尾信息 J C JB/5’4052<JEBX6;%SX6;%de’4Q2d’4Q2$DB*+$,&FK34+EE R *+$,&FK34+I C J 返回内存块中用户部分地址 J C %2;/%5 BX6;% S ’42Q2$DB*+$,&F(5D$EEI U
vxWorks内核解读-5
vxWorks内核解读-5本篇博⽂,我们该谈到Wind内核的内存管理模块了,嵌⼊式操作系统中, 内存的管理及分配占据着极为重要的位置, 因为在嵌⼊式系统中, 存储容量极为有限, ⽽且还受到体积、成本的限制, 更重要的是其对系统的性能、可靠性的要求极⾼, 所以深⼊剖析嵌⼊式操作系统的内存管理, 对其进⾏优化及有效管理, 具有⼗分重要的意义。
在嵌⼊式系统开发中, 对内存的管理有很⾼的要求。
概括地说, 它必须满⾜以下三点要求:实时性, 即在内存分配过程中要尽可能快地满⾜要求。
因此, 嵌⼊式操作系统中不可能采取通⽤操作系统中的⼀些复杂⽽完备的内存分配策略, ⽽是要采⽤简单、快速的分配策略, ⽐如我们现在讨论的VxWorks 操作系统中就采⽤了“ ⾸次适应”的分配策略。
当然了具体的分配也因具体的实时性要求⽽各异。
可靠性, 即在内存分配过程中要尽可能地满⾜内存需求。
嵌⼊式系统应⽤千变万化, 对系统的可靠性要求很⾼, 内存分配的请求必须得到满⾜, 如果分配失败, 则会带来灾难性的后果。
⾼效性, 即在内存分配过程中要尽可能地减少浪费。
在嵌⼊式系统中, 对体积成本的要求较⾼, 所以在有限的内存空间内, 如何合理的配置及管理, 提⾼使⽤效率显的尤为重要实时嵌⼊式系统开发者通常需要根据系统的要求在RTOS提供的内存管理之上实现特定的内存管理,本章研究 VxWorks的Wind内核内存管理机制。
5.1 VxWorks内存管理概述5.1.1 VxWorks内存布局VxWorks5.5 版本提供两种虚拟内存⽀持(Virtual MemorySupport):基本级(Basic Level)和完整级(Full Level)。
基本级虚拟内存以Cache 功能为基础。
当DMA 读取内存前必须确保数据以更新到内存中⽽不是仍缓存在Catch 中。
对于完整级需要购买可选组件VxVMI,其功能为:提供对CPU 的内存管理单元的编程接⼝,同时提供内存保护,它在功能上覆盖了基本级虚存。
VxWorks内存管理
VxWorks内存管理一、嵌入式系统对内存管理的要求(1)快速性嵌入式操作系统的实时性要求内存分配过程要尽可能快。
因此不宜采用通用操作系统中完善但复杂的内存分配策略,一般没有段页式虚存管理机制,而是采用简单、快速的内存分配方案。
根据对实时性要求程度的不同,分配方案也有所不同。
VxWorks系统采用简单的“首次适应,立即聚合”方法。
(2)可靠性为保证嵌入式操作系统可靠性,内存分配的请求必须得满足,分配失败可能会导致灾难性后果。
嵌入式操作系统应用于各种各样的场合中,在有些情况下,对可靠性要求极高。
在一些可靠性要求很高的嵌入式操作系统中,甚至不支持动态内存分配,只支持静态内存分配,所有的内存在系统启动时已分配好。
(3)高效性内存分配要尽可能地减少浪费,并且要降低内存管理的开销。
不可能为了保证满足所有的内存分配请求而将内存配置得无限大。
一方面,潜入式系统对成本的要求使得内存在其中只是一种很有限的资源;另一方面,即使不考虑成本的因素,系统有限的空间和有限的板面积决定了可配置的内存容量是有限的。
实时嵌入式系统开发者通常需要根据系统的要求在RTOS提供的内存管理之上实现特定的内存管理。
二、静态分配与动态分配静态分配是指在编译或链接时将程序所需的内存空间分配好,采用这种分配方案的程序段,其大小一般在编译时就能确定;而动态分配是指系统运行时根据需要动态地分配内存。
一般的嵌入式系统都支持静态分配,因为像中断向量表、操作系统映像这类的程序段,其程序大小在编译和链接时是可以确定的。
而是否支持动态分配主要基于两个方面的考虑:首先是实时性和可靠性的要求,其次是成本的要求。
对于实时性和可靠性要求极高的系统(硬实时系统),不允许延时或者分配失败,必须采用静态分配方案,也就是在程序编译时所需要的内存都已经分配好了。
例如火星探测器上的嵌入式系统就必须采用静态分配的方案,在这样的应用场合,成本不是优先考虑的对象,实时性和可靠性才是必须保证的。
VxWorks的内存配置和管理
舰 船 电 子 对 抗
SH I PB0 ARD ELECT R0N I C0 U N TERM EASU R E C
J n 2 1 u .02
Vo . 5 No 3 13 .
第 3 5卷第 3 期
Vx r s的 内存 配 置和 管 理 W0k
殷 战宁 , 刘 琳
内存 管理 硬件 初始 化 、 映像 文 件 的地 址定 位 、 内存 的 静态 和 动态 占用 、 内存 碎 片对 系 统稳 定 性 的 影 响等
诸 多 内容都 由设计 人 员 来 规 划 和控 制 , 以涉 及 内 所 容 广泛 , 需要 有一 个 较好 的通 篇 认识 才 能 解 决 好 与 内存有 关 的问题 。
0 引 言
对 于一 般编 程 人 员 尤 其 是 Wid ws 通 用 平 no 等
台 的编 程人 员来 说 , 内存 配置 基 本 上 只要 考 虑 全 局
器 、 步 动 态 随 机 存 储 ( D AM ) 制 器 , P 8 0 同 S R 控 P C 6 通过 用 户 可 编 程 机 制 ( M ) 控 制 随 机 存 储 器 UP 来 ( M) ¥ c 4 0带 S AM 控 制 器 等 ; 些 C U RA 、32 1 DR 有 P
o y c nfgu a i n a d ma ge e t d fom hr e a pe t : o t r — a d r on i ur to , r o i r to n na m nt me ho r t e s c s s f wa e h r wa e c fg a i ns i t r a e f nc i n a d a lc to p i z to n e f c u to n pp ia i n o tmi a i n. Ke r : y wo ds VxW o ks o r tng s t m ; mo y c ntole ; mo y ma g m e r pe a i ys e me r o r l r me r na e nt
一种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
实时操作系统VxWorks内存管理分析
可 随着 嵌 入 式 系 统 在 近 年 来 的 飞 速 发 展 , 入 式 操 作 系 实 时 性 、 靠 性 要 求 极 高 的 领 域 中 。 嵌
2 1 嵌 入 式 系统 一 般 的 内存 分 配 方 案 .
一
般 的嵌 人 式 系统 中最 基 本 的 内存 分 配 方 案 有 两 种 :
的分 配 策 略 。具 体 的分 配也 应 具 体 的 实 时 性 要 求 而 各 异 。 2 2 Vx o k 内存 管理 机 制 . W rs Vx ok 操 作 系 统 采 用 用 户 程 序 、 W rs 内核 处 于 同一 地 址
在 必 () 靠 性 , 2可 即在 内存 分 配 过 程 中要 尽 可 能 地 满 足 内存 空 间 的 内存 管 理 策 略 , 做 应 用 程 序 开 发 时 , 须 对 系 统 内 核的地址有一个完整的把握 , 以避 免 破 坏 系 统 的 正 常 工 作 需 求 。嵌 人 式 系统 应 用 千 变 万 化 , 系 统 的 可 靠 性 要 求 很 对 P 高, 内存 分 配 的 请 求 必 须 得 到 满 足 , 果 分 配 失 败 , 会 带 或 导 致 其 它 应 用 程 序 的 错 误 运 行 。 C U 的 实 际 内 存 在 如 则
3 ] 到人 们 的 重视 。 而 在 嵌 人 式 操 作 系 统 中 , 存 的 管 理 及 分 静 态 分 配 和 动 态 分 配 [ 。静 态分 配是 指 在 编译 或 链 接 时 将 内 配 占 据着 极 为 重要 的 位 置 , 因为 在嵌 入式 系统 中 , 储 容 量 程 序 所 需 要 的 内存 空 间分 配 好 采 用 这 种 分 配 方 案 的程 序 存 其 极 为 有 限 , 且 还 受 到体 积 、 本 的 限 制 , 重 要 的是 其 对 段 , 大 小 一 般 在 编 译 时 就 能 确 定 。而 动 态 分 配 是 指 系 统 而 成 更 系统 的性 能 、 靠 性 的要 求 极 高 , 以深 入 剖 析 嵌 入 式 操 作 可 所 运 行 时 根 据 需 要 , 态 地 分 配 内存 空 间 。这 两 种 分 配 策 略 动 系 但 系统 的 内存 管 理 , 其 进 行 优 化 及有 效 管 理 , 有 十 分 重 要 各 有 利 弊 。静 态 分 配 内存 , 统 的 可 靠 性 高 , 失 去 了灵 活 对 具 性, 而且 浪 费 也 较 多 ; 态 分 配具 有 灵 活 、 用 率 高 等优 点 , 动 利 的意义。 在嵌 入 式 系 统 开 发 中 , 内存 的 管 理 有 很 高 的 要 求 。 但 会 导 致 响 应 时 间 的不 确定 及 容 易产 生碎 片等 问题 。如 何 对 在 这 两 种 分 配 策 略 中权 衡 , 一 件 十 分 困难 的 事 。 是 概括 地说 , 必 须 满 足 以下 三 点 要求 0 : 它 ] ( ) 时 性 , 在 内存 分 配 过 程 中要 尽 可 能 快 地 满 足要 1实 即
vxworks内存管理_哈尔滨工业大学
嵌入式操作系统
• 用户也可以从USER_RESERVED_MEM划出一 块专用内存分区供某些用户应用程序使用—动态 分配的对象
– 可以自拟内存管理方法,如 • 将该内存区分为若干个内存池 • 每个内存池中的内存块大小固定 • 以固定大小分配各申请者
嵌入式操作系统
3.2 内存管理方式
• 需要对空闲内存块进行合适的管理
嵌入式操作系统
– 用户可以在flash中以文件的形式保存配置信息和日志 信息,存放运行是需要动态加载的应用程序模块,通 过文件传输协议方便的在线升级BootImage、VxWorks 映像和应用程序模块 – 由于大部分嵌入式系统没有类似计算机的硬盘,因 此,flash的存在就显得尤为重要
嵌入式操作系统
– 系统在经过多次内存分配和释放操作之后,可能存在 多个空闲的内存块,后续的内存操作必须能够检测到 这块内存,从而根据一定的算法选择一个合适的内存 块
• 空闲块通常有可用表和自用链两种方法管理
– VxWorks采用自由链管理内存空闲块
嵌入式操作系统
自由链
• 自由链是利用每个空闲内存块的开始几个单元 存放本空闲块的大小及下个空闲块的开始地址 • 管理程序可以通过链首指针可以检索到所有的 空闲块 • 采用自由链管理空闲块,空闲内存块的查询工 作量较大,但由于自由链指针利用的是空闲块 自身的单元,所以不必占用额外的内存块 • 自由链没有大小的限制,容易添加和删除节点 • VxWorks采用自由链管理内存空闲块
– Partition是定长的内存区 – 用户可以从其中分配内存块(buffer或block) – 也可以在某个内存分区再创建一个内存分区
嵌入式操作系统
• VxWorks中主要涉及到的内存单元概念有
一种VxWorks内存管理方案
一种VxWorks内存管理方案摘要:探讨嵌入式开发对内存管理的基本要求、嵌入式开发内存管理的关键问题以及给出一种VxWorks内存管理方案,即把除VxWorks系统保留内存以外的内存分为三种类型进行管理:固定大小的缓冲池、动态可变的堆以及由各种固定大小的缓冲区组成的队列。
目前,针对有内存管理单元MMU(Memory Management Unit)的处理器设计的一些桌面操作系统,如Windows、Linux,使用了虚拟存储器的概念。
虚拟内存地址被送到MMU映射为物理地址,实际存储器被分割为相同大小的页面,采用分页的方式载人进程。
大多数嵌人式系统针对没有MMU的处理器设计,不能使用处理器的虚拟内存管理技术,而采用实存储器管理策略。
因而对于内存的访问是直接的,它对地址的访问不需要经过MMU,而是直接送到地址线上输出,所有程序中访问的地址都是实际物理地址;而且,大多数嵌人式操作系统对内存空间没有保护,各个进程实际上共享一个运行空间。
一个进程在执行前,系统必须为它分配足够的连续地址空间,然后全部载人主存储器的连续空间。
由此可见,嵌人式系统的开发人员不得不参与系统的内存管理。
从编译内核开始,开发人员必须告诉系统这块开发板到底拥有多少内存;在开发应用程序时,必须考虑内存的分配情况并关注应用程序需要运行空间的大小。
另外,由于采用实存储器管理策略,用户程序同内核以及其他用户程序在一个地址空间,程序开发时要保证不侵犯其它程序的地址空间,以使得程序不至于破坏系统的正常工作,或导致其他程序的运行异常;因而,嵌人式系统的开发人员对软件中的一些内存操作要格外小心。
1 嵌入式系统中对内存分配的要求嵌人式系统开发对内存分配有很高的要求:① 内存能快速申请和释放,即快速性。
嵌人式系统中对实时性的保证,要求内存分配过程要尽可能地快;② 内存分配保持原子性,即可靠性。
也就是内存分配的请求必须得到满足,如果分配失败可能会带来灾难性的后果;③ 内存应该各尽其用,即高效性。
移动_黄烨明_基于VxWorks的内存管理和一个内存泄漏查找实例
基于VxWorks的内存管理和一个内存泄漏查找实例本文主要分三部分,第一章介绍基于VxWorks的内存管理的主要内容,第二章介绍应用在ZXWR NB01产品软件设计中OSS的内存管理方法,第三章介绍实际应用中一个内存泄漏查找的实例。
Chapter 1 基于VxWorks的内存管理一、综述对于一个采用了VxWorks操作系统的主处理器构成的系统,主内存的管理机制主要由BSP 来实现,包括内存的初始化和内存的访问接口;主内存的初始化由romInit()实现,总线访问(对设备而言)在sysHwInit()中初始化;BSP对内存访问的支持和管理策略:●主内存的配置●对MMU的虚拟映射●Cache策略●内存探针BSP的硬件寄存器在sysHwInit中初始化,通常的设备(串口除外)寄存器当设备初始化时被初始化;为调示方便,在BSP开发期间禁止cache和MMU直到以下的情况实现:●内核被成功的激活●驱动器经过测试二、内存配置BSP负责配置主内存来实现快速的内核操作●一些关键地址必须被定义●如果使用MMU,必须定义内存映射●提供支撑程序内存地址的定义在以下的文件中:-----config.h-用户可配置的-----<bsp>.h-由目标板配置,非用户使用BSP提供的内存函数:sysMemTop()、sysNvRamSet()、sysNvRamGet()上图代表了下载的镜像被重定位后的RAM的分区;一个WDB代理内存池仅仅当与VxWorks 镜像一起的Tornado工具被使用时才需要;用户保留内存是不被VxWorks的程序所访问的。
char * sysMemTop(void)●函数返回系统内存的首地址,代码在sysLib.c中;●宏USER_RESERVED_MEM定义了不被VxWorks程序访问的用户保留内存的大小●如果BSP不支持可选函数sysPhyMemTop(),由LOCAL_MEM_LOCAL_ADRS+ LOCAL_MEM_SIZE替代。
一种基于VxWorks的内存分配算法
一种基于VxWorks的内存分配算法
朱筱菲;黄凤岗
【期刊名称】《工业控制计算机》
【年(卷),期】2006(19)2
【摘要】研究了VxWorks系统内存分配算法,指出了常用内存管理算法的局限性,在此基础上,提出了一种改进的内存分配算法.改进的内存分配算法包括优化的内存块分配算法和快速高效的动态内存分配算法,两者结合使用将会有效提高嵌入式系统的性能.对改进内存算法的实现作了详细的介绍.
【总页数】3页(P17-18,20)
【作者】朱筱菲;黄凤岗
【作者单位】哈尔滨工程大学计算机科学与技术学院,黑龙江,哈尔滨,150001;哈尔滨工程大学计算机科学与技术学院,黑龙江,哈尔滨,150001
【正文语种】中文
【中图分类】TP3
【相关文献】
1.一种VxWorks内存管理方案 [J], 刘东栋
2.VxWorks实时操作系统内存分配算法优化 [J], 李彦峰;李丽颖;韩广志;徐尚喻
3.基于VxWorks的一种基于生命周期的内存管理模型 [J], 邓小培
4.一种基于VMIC网的内存分配算法 [J], 李雨江
5.一种基于VxWorks的内存管理封装层的设计与实现 [J], 何先波
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VxWorks的内存分配机制VxWorksVxWorks的内存管理函数存在于2个库中:memPartLib(紧凑的内存分区管理器)和memLib(完整功能的内存分区管理器)。
memPartLib提供的工具用于从内存分区中分配内存块。
该库包含两类程序,一类是通用工具memPart…(),包含创建和管理内存分区并从这些分区中分配和管理内存块;另一类是标准的malloc/free程序提供给内存分区的接口。
memLib是memPartLib的扩展,提供内存管理功能,包括错误处理,按对齐分配和ANSl分配函数。
在Vxworks中内存分区只能创建,不能删除。
主要的操作函数有memPartCreate、memPartAddToPool、memPartAlignedAlloe、memPartAlloe、memPartFree、memAddToPool、malloc、free、calloc、cfree等。
分配时可以要求一定的对齐格式,不同的CPU架构有不同的对齐要求。
为了优化性能,malloc返回的指针是经过对齐的,为此的开销随架构不同而不同。
例如,68k为4字节对齐,开销8字节;SPARC为8字节对齐,开销12字节;MIPS为16字节对齐,开销12字节;1960为16字节对齐,开销16字节。
内核负责为程序分配内存、动态分配内存和回收内存。
VxWorks为用户提供两种内存区域:内存域region和内存分区partition,region是可变长的内存区,可以从创建的region中在分配段segment,region的特点是容易产生碎片,但灵活、不浪费,partition是定长的内存区,用户可以从创建的partition中分配内存块,或在某个内存分区中再创建一个内存分区。
partition的特点是无碎片、效率高,但浪费。
通常,VxWorks内核和应用程序对内存的操作是基于内存分区进行的。
内存池是一块连续的内存区域,包含一个或多个内存块。
内存分区包含分区自身的描述信息(一个结构体)和一个或多个内存池,描述信息保存在系统内存分区中,内存池是该分区实际拥有的内存空间。
内存分区刚创建完毕时,只有一个内存池,以后用户程序可往该分区中添加内存池。
内存池之间的地址不一定连续,VxWorks 在启动过程中会创建一个包含系统内存池的系统内存分区。
系统内存分区(其中ID为memSysPartId)是一个全局变量,关于它的定义在memLib.h中)在内核初始化kernelInit() 时由usrRoot()(包含在usrConfig.c 中)调用memInit创建。
其开始地址为RAM中紧接着VxWorks的BSS段之后,大小为所有空闲内存。
VxWorks运行时的内存布局如图1所示,LOCAL_MEM_LOCAL_ADRS 为嵌入式系统内存的起点,一般为0,宏RAM_LOW_ADRS是VxWorks系统镜像的起点,而FREE_RAM_ADES为系统镜像的终点。
Initial Stack这部分空间在加载VxWorks映像时由sysInit初始化,由usrInit使用。
Initial Stack和RESERVED之间的内存区域通常用于存放中断向量表。
WDB内存池用于VxWorks调试代理任务运行模块的动态加载。
系统内存池是VxWorks和应用程序运行时可操作、使用的内存空间。
应用程序可以根据需要、调用函数memPartCreate 从系统内存池中创建新的内存分区。
多数BSP都定义sysPhysMemTop()为物理RAM的结束地址,而sysMemTop()为系统内存池的结束地址,两者之差则为可配置的常数USER_RESERVED_MEM。
这些宏都在板级支持包(BSP)中定义。
图1 VxWorks运行时内存布局嵌入式系统中为任务分配内存空间有两种方式,静态分配和动态分配。
静态分配为系统提供了最好的可靠性与实时性,如可以通过修改USER_RESERVED_MEM分配内存给应用程序的特殊请求用。
对于那些对实时性和可靠性要求极高的需求,只能采用静态分配方式[4]。
但采用静态分配必然会使系统失去灵活性,因此必须在设计阶段考虑所有可能的情况,并对所有的需求做出相应的空间分配,一旦出现没有考虑到的情况,系统就无法处理。
此外静态分配方式也必然导致很大的浪费,因为必须按照最坏情况进行最大的配置,而在实际运行中可能只用到其中的一小部分。
VxWorks 的内存管理采用自由链管理内存空闲块,采用首先适配算法动态分配内存。
内存释放时,采用上下空闲区融合的方法,即把相邻的空闲内存块合并,没有清理碎片的功能。
一般系统中只有1个内存分区,即系统分区,所有任务所需要的内存直接调用malloc从其中分配。
分配采用First-Fit算法(空闲内存块按地址大小递增排列,对于要求分配的分区容量size,从头开始比较,直至找到满足大小?size的块为止,并从链表相应块中分配出相应size大小的块指针),通过free释放的内存将被聚合以形成更大的空闲块。
这就是VxWorks的动态内存分配机理。
最先适应法具有搜索速度快,利于内存碎片合并的特点。
另外,最先适应法尽可能利用低地址空间,从而保证高地址空间有较大的空闲区来放置内存要求较多的进程或作业。
但是,使用动态内存分配malloc/free时要注意到以下几个方面的限制:(1)因为系统内存分区是一种临界资源,由信号量保护,使用malloc会导致当前调用挂起,所以它不能用于中断服务程序;(2)因为进行内存分配需要执行查找算法,其执行时间与系统当前的内存使用情况相关,是不确定的,所以对于有规定时限的操作它是不适宜的;(3)采用简单的最先匹配算法,容易导致系统中存在大量的内存碎片,降低内存使用效率和系统性能。
一般在系统设计时采用静态分配与动态分配相结合的方法。
也就是说,系统中的一部分任务有严格的时限要求,而另一部分只是要求完成得越快越好。
按照RMS(Rate Monotonic Scheduling)理论,所有硬实时任务总的CPU时间应小于70%,这样的系统必须采用抢先式任务调度;而在这样的系统中,就可以采用动态内存分配来满足那一部分可靠性和实时性要求不那么高的任务。
在VxWorks中,内存管理单元(MMU)的功能主要是由一些库函数来控制和实现的,这些库函数根据CPU的体系不同而不同。
虚拟地址和物理地址之间的映射关系通过一个类型为PHYS—MEM_DESC(定义于vmLib.h文件中)的结构体来实现: typedef struct phys_mem_desc{Void* virtualAddr;Void* physicalAddr;UINT len;UINT initialStateMask;/*mask parameter to vmStateSet*/ UINT initialState;/*state parameter to vmStateSet*/ }PHY_MEM_DESC;其中,virtualAddr表示映射后的虚拟内存空间的起始地址;physicalAddr表示被映射的物理内存空间的起始地址;initialState表示内存页面的状态;len表示映射内存的长度。
由于内存映射是基于页面的,所以virtualAddr、physicalAddr、len 必须是页面大小的偶数倍。
下面是一个MMU配置示例:{(void*)Ox2000000,(void*)0x2000000,0x20000,/*initial state mask*/MMU_ATTR_VALID_MSK | MMU_ATTR_PROT_MSK,/*initial state*/MMU_ATTR_VALID | MMU_ATTR_PRO_SUP_WRITE}上面表示这一段内存起始于Ox2000000,可写。
在VxWorks中,虚拟内存地址和物理地址是一一对应的关系,所以如果不考虑对特定内存区域设置写保护或高速缓存机制,则完全可以不使用虚拟内存。
4 VxWorks的内存保护4.1 内存保护初始化内存保护初始化主要包括3个步骤:(1)初始化MMU。
建立虚拟内存和实际内存页面对应关系的转化表,此时MMU功能还是关闭的,此后应用程序访问的内存均为虚拟内存;(2)初始化虚拟内存模块。
该过程包括初始化页状态及页状态掩码转换表,设置虚拟内存库函数;(3)全局页面映射的初始化。
该步骤创建系统全局的页面映射以及内核代码所需要的页面映射。
内存保护初始化的流程如图3所示。
4.2修改页状态每一个虚拟内存页都有一个或多个状态,分为有效/无效、可写、可读、缓存/不缓存等。
页状态可以用函数vmStateSet()实现。
在程序中,一个任务执行的所有数据都放在一个全局区域里。
为了防止其他任务破坏该区域的数据,可以用钩子函数在任务切换之间设置页的状态,从而实现数据的保护。
比如在进入任务时,把内存页面设置成MMU_ATTR_VALID,使该内存页有效,然后在离开任务时,把它设置为MMU_ATTR_VALID_NOT,从而使别的任务不能访问该页面。
4.3锁定页表条目CPU执行机构在收到应用程序发来的虚拟地址后,首先到页表缓冲(TLB)中查找相应的页表条目,如果TLB中正好存放着所需要的页表条目,则称为TLB命中(TLB Hit),接下来CPU再看物理内存地址中的数据是不是已经在缓存里了,若没有则到内存中取相应地址所存放的数据。
如果TLB中没有所需的页表,则成为TLB失败(TLB Miss),接下来就必须访问物理内存中存放的页表,同时更新TLB的页表条目。
由此可见,TLB命中率越高,则CPU访问内存的速度就越快,系统性能也就越高。
因此,在vxworks系统中,用函数vmPageLock()锁定用户频繁使用的页表条目,这样TLB的命中率显然会大大提高,但由于TLB的容量收到一定的限制,所有锁定太多的页表条目会导致剩下的页表条目的动态使用率降低。
检测缓冲越界内存保护也能用于检测代码编写中的缓冲越界错误。
通过在一个缓冲区的两端申请“卫兵”页面,能使系统检测到这类错误。
生成“卫兵”页面的方法是,首先,申请所要使用的缓冲区,该缓冲区应该是按页对齐的;然后,把申请到的缓冲区增大额外的相当于两页的大小,实际使用的缓冲区位于中间,其高端和低端各一页用来做“卫兵”页面;最后,把这两页“卫兵”页面用宏VM STATE SET和VMSTATE VALID NOT设成不可访问页。
这样,任何对该缓冲两端的页的访问都会被在调试过程中产生一个TLB错误。
4.4保护代码区和异常向量表当系统配置了INCLUDE_PROTECT_TEXT组件,VxWorks队所有的代码段都实行写保护功能,包括系统内核代码以及应用模块。