VxWorks内存

合集下载

VxWorks的内存分配机制

VxWorks的内存分配机制

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内核和应用程序对内存的操作是基于内存分区进行的。

内存池是一块连续的内存区域,包含一个或多个内存块。

03_VxWorksMemory

03_VxWorksMemory

内存管理5WDB Memory Pool•在target 上保留给host 工具的内存池–动态加载obj文件–把host shell上以字符串形式输入的参数传给在target 上启动的任务–Host shell和target shell 上临时创建的变量•WDB 管理内存池, 用于保存host 上的数据链等内容•WDB 内存池的大小使用宏WDB_POOL_SIZE来配置–缺省定义为1/16的sysMemTop()-FREE_RAM_ADRS•如果不够, 可以从系统内存池再分配, 加进WDB内存池6System Memory Pool•用于系统中的内存分配–malloc()–创建任务(stack 和TCB)–VxWorks 系统其他的内存需求•系统启动阶段初始化–可以修改USER_RESERVED_MEM在顶端为用户保留一段内存–如果要增加物理内存大小, 需要增加LOCAL_MEM_SIZE •查看BSP相关文档•为内存池增加内存void memAddToPool(pPool, poolSize) pPool是内存起始地址8Allocating/Releasing Memory•动态分配内存void *malloc(nBytes)–分配成功返回内存指针, 分配失败返回NULL.–使用优先匹配算法•释放内存void free (ptr)–邻近block结合–不需要垃圾回收9Examining Memory•内存物理地址与虚拟地址间的映射可以用vmContextShow() 查看11Additional Memory Management Routines•分配内存并清0void *calloc(nElems, size)•修改分配的内存大小void *realloc(ptr, newSize)–内存地址可能会改变–如果newSize比原来的内存大, 内存中的内容不会变–不保证跟原来一样执行对齐操作•返回内存池中最大的一个内存块大小int memFindMax()13Generic Partition Manager•VxWorks提供了底层函数直接创建或操作内存池(内存分区), 内存池的ID作为输入参数以彼此区分–提供给应用层的高层函数malloc() 和free() 通过调用这些底层函数工作, 内存池的ID使用系统内存池(system memory pool)•使用内存分区可以减少内存碎片–使用malloc() 预分配一块内存–在这块内存上创建内存分区–从内存分区上获取(Get)/释放(free) 内存, 不会影响到系统内存池–memPartAlloc()/memPartFree()•内存分区可以具有不同的属性–创建一个板外内存分区, 而不是在板内–创建一个专门服务于指定IO的内存分区14Managing Memory Partitions•内存分区管理函数如下,如果PART_ID 为memSysPartId 则为通常提供给应用层的系统内存操作Generic System Memory PoolmemPartAlloc()malloc()memPartFree()free()memPartShow()memShow()memPartAddToPool()memAddToPool()memPartOptionsSet()memOptionsSet()memPartRealloc()realloc()memPartFindMax()memFindMax()15Creating a Memory PartitionPART_ID memPartCreate(pPool, size)pPool用于创建内存分区的内存起始地址size内存分区的大小•返回内存分区ID(PART_ID), 如果发生错误返回NULL •内存分区的内存(pPool) 可以在:–与系统内存不同的内存区•不在系统内存管理范围内内–从系统内存中分配出来的内存•使用malloc() 分配的内存–内存顶端•参考本章前面的User Reserved Memory Area。

基于VxWorks的一种基于生命周期的内存管理模型

基于VxWorks的一种基于生命周期的内存管理模型

如 会 函数 、 码 。 以 此 对 内 存使 用进 行跟 踪 、 试 , 代 调 达到 避免 内存 泄 用 的 内存 块 : 果 有 . 再继 续 检 查 是 否 有其 它 的指 针 在 占用这 个 可 用 的 内 存 块 : 果 有 。 通 过 asr 函 数 把 指 针 的 ” 如 则 sel 0 内存 上 漏、 内存 越 界 的 目的 。 输 0 g文 件 , 以便 及 时 调 试 ; 果 没 有 , 把 这个 内存 如 则 基 于 V W(k x s的 内 存 管 理 . 般 说 来 . 果 只 使 用 操 作 系 下 文 ” 出 到 l r 一 如 同 “ 统 为 我 们 提 供 的 i lc 和 f e ( 语 言 1 数对 内存 进 行 操 作 。 块 分 配 给 当前 指 针 . 时更 新 内存 管 理表 中表 示 该 内存 块 的 b n l 0 r 0C ao e 函
而 不进 行 额 外 的 管理 .总 是 不 可避 免 地 甚 至 大 量 出现 内存 泄 漏 的信 息 。 7 户 自定 义 的释 放 内 存 的 A I . 用 P 函数 会 首 先 根 据 当 前 指 针 和 内存 越界 的问 题 而仪 仅 依 靠 操作 系统 对 内 存 的管 理 远 远 不 内存 上 下 文 ” 更 新 相 应 内 存 块 在 内存 管 理 表 中 的 bt 0 , i为 ; 够 让 我 们及 时 发 现 并 解决 问 题 。 外 。 往 由 于本 身 提供 的内 存 的 ” 此 往 较 小 . 件 要求 的实 时 性 较高 . 就要 求 必 须对 内存 进 行 妥 善 的 然后 把 当前 指 针 置 为 N L 。 软 这 U L 这 种 内存 管理 模 型 的 优 点是 :减 少 了 频繁 使 用 mao 和 Uc0 管理。

基于VxWorks的软件开发平台内存管理模块的设计与实现

基于VxWorks的软件开发平台内存管理模块的设计与实现
第 2 1卷 第 3 期 20 0 8年 9月
海 南师 范 大 学 学报 ( 然 科 学版 ) 自
Jun f H ia om l nv r t( aua Sin e ora o an nN r a i sy N trl c c ) l U ei e
Vo . No. 121 3
选用 的嵌 入式 操 作 系统进 行 再封 装成 为必 要 . 所谓 嵌入 式 操 作 系统 的封 装 是指 为 了能 缩 短特 定 领域 的嵌 入式 系统软 件 的开发 周期 . 强嵌入 式操 作 系统功 能 和实现 嵌人 式 程序 的 可移植 性 、 增 可维 护 性 和代码 继 承
性而 对所使 用 的特定 嵌入 式操 作 系统 的再 “ 加工 ” . 入式 操作 系统 封装 层 的 目的之 一是 对上 层 应用屏 嵌
Sp 2 0 e. 0 8
基于 V Wok 的软件开发平台 x rs 内存管理模块的集美 大学 计算机 工 程学 院 , 福建 厦 f 6 0 1 -3 12 ) j

要 : v w ok 因 x rs自身提供 的 内存 管理 函数 采 用 fs f 算 法 , 能 满足 通信 应 用领域 i ti r- t 不
蔽底 层硬 件 、 S 网络 的差 别 , O 、 给上层 应用 软件 提供 统一 规范 的调 用接 口, 大 降低 了应用 软件 开发 人员 的 大
开发 难度 . 也使 开发 出 的应用 软件 有较好 的跨 平 台性 、 可移 植性 、 可维 护性 和代 码继 承性 . 而本 文提 到 的软 件 开发平 台完 成 了对嵌 入式 操作 系统 的封 装 ,封 装层 位于 嵌入 式操 作 系统 与应 用程 序之 间 , 装层 一般会 对 进程 调度 、 封 内存 分配 等核 心功 能进 行重 新定 义 和优 化 以适应 特定 应 用领 域 的开发

内存池在Vxworks系统内存管理中应用

内存池在Vxworks系统内存管理中应用
3小结
面对在嵌入式系统中广泛存在的数据库类型的 内存需求,即分配多个固定尺寸的内存单元的需求 时,Vxorks系统提供的传统malloc/free带来的内存 碎片、时间不确定等不足,影响了系统的效率,使用 基于内存池技术的内存分配方案无疑是一种很好的 解决之道。
参考文献
1 River W,王金刚,等译.Vxworks程序员指南,北京:清华大学出版 社.2003
图2内存池的结构
万方数据
10期
邹寅伟:内存池在Vxworks系统内存管理中应用
2401
1)内存池控制块结构T_MemPoolCtrl:
typedef struct tag_MemPoolCtrl{
BOOL bIsUsed; SEM—ID smMemPoolSem; WORD32 dwBlockSize; WORD32 dwBlockNum; WORD32 dwFreeBlock;
BYTE 4 pucBlock;
/}指向Block体的指针}/
}T BlockCtrl;
/}Block控制块结构女/
2.2 内存池的操作函数
对内存池的操作包括创建内存池、释放内存池、 从内存池中分配1个内存单元、释放内存单元回内
存池等。由于内存是共享资源所有内存操作时必须
处理信号量问题。 1)Mere—CreatMemPool:创建块内存管理器,参数包
括内存指针(如为NULL,表示自己分配)、块尺寸、
单元尺寸、返回管理器指针。算法如下:
①检验参数合法性。
②初始化结构T—MemPoolCtrl,包括单元尺寸
和块尺寸。设置第1个内存块的指针。如果内存是
外来的,设置块已用标志(已用为0),表示不能增加
块;否则,已用块数设为1。

VxWorks环境下内存数据解析器的设计方法

VxWorks环境下内存数据解析器的设计方法

察 内存 数 据 结 构 , 且 不 需 要 在 可 执 行 文 件 中 添 加 调 试 而 信息 。
斯 范 式 进 行 规 范 。跳 过 函 数 定 义 、 量 定 义 , 对 类 型 定 变 只 义 进 行 语 法 分 析 。用 状 态 机 方 法 识 别 类 型 定 义 的 种 类 包
要 观察 某 个 内存 区 的 数 据 结 构 , 须 具 备 两 个 条 件 : 先 , 必 首 目标 可 执 行 文件 在 编 译 时 需 要 附 加 调 试 信 息 ; 次 , 须 其 必 运 行 T r a o调 试 工 具 或 GDB涮 试 工 具 。在 可 执 行 文 件 on d
希 望 打 印 的 嵌 套 层 级 、 望 打 印 的 数 组 元 素 个 数 、 量 名 希 变
Vx o k 环 境 下 内存 数 据 解 析 器 的 设 计 方 法 W rs
陶 沽 , 权 德 迟
( 兵 学 院 基 础 部 基 础 实 验 中心 , 肥 2 0 3 ) 炮 合 3 0 1
解 析 器 的 C文 件 , 把 它 加 人 到 目标 工 程 中 , 目标 C原 并 和
1 概 述

括 结 构 、 合 、 举 等 。语 法 分 析 要 能 够 识 别 嵌 套 类 型 定 联 枚
义 。每 识 别 出一 个 类 型 定 义 , 要 针 对 这 些 定 义 生 成 解 析 就
器 C代 码 。
3 3 生 成 解 析 器 代 码 .
首 先 要 确 定 各 种 数 据 类 型 展 现 的格 式 , 就 是 希 望 以 也 怎样 的格 式 打 印 各 种 数 据 类 型 的 内 容 。解 析 器 C代 码 由
中附 加 涮 试 信 息 会 使 得 可 执 行 文 件 的规 模 变 { } ( ) [ ] ; + 、 、*、 等 , 识 数 字 和 字 符 如 、、、、 、、、 一 / 辨 串 。词 法 分 析 的结 果 是 一 系 列 条 目 , 就 是 一 系 列 条 目组 也 成 的 流 将 作 为 语 法 分 析 的 输 入 。 上 述 各 种 关 键 字 、 隔 分 符 、 字 、 符 串都 表 示 为 一 个 条 目 , 别 有 不 同 的 名 称 。 数 字 分 数 字 、 符 串条 目还 会 带 参 数 , 示 数 字 或 字 符 串 的 内容 。 字 表

vxworks内存管理_哈尔滨工业大学


嵌入式操作系统
• 用户也可以从USER_RESERVED_MEM划出一 块专用内存分区供某些用户应用程序使用—动态 分配的对象
– 可以自拟内存管理方法,如 • 将该内存区分为若干个内存池 • 每个内存池中的内存块大小固定 • 以固定大小分配各申请者
嵌入式操作系统
3.2 内存管理方式
• 需要对空闲内存块进行合适的管理
嵌入式操作系统
– 用户可以在flash中以文件的形式保存配置信息和日志 信息,存放运行是需要动态加载的应用程序模块,通 过文件传输协议方便的在线升级BootImage、VxWorks 映像和应用程序模块 – 由于大部分嵌入式系统没有类似计算机的硬盘,因 此,flash的存在就显得尤为重要
嵌入式操作系统
– 系统在经过多次内存分配和释放操作之后,可能存在 多个空闲的内存块,后续的内存操作必须能够检测到 这块内存,从而根据一定的算法选择一个合适的内存 块
• 空闲块通常有可用表和自用链两种方法管理
– VxWorks采用自由链管理内存空闲块
嵌入式操作系统
自由链
• 自由链是利用每个空闲内存块的开始几个单元 存放本空闲块的大小及下个空闲块的开始地址 • 管理程序可以通过链首指针可以检索到所有的 空闲块 • 采用自由链管理空闲块,空闲内存块的查询工 作量较大,但由于自由链指针利用的是空闲块 自身的单元,所以不必占用额外的内存块 • 自由链没有大小的限制,容易添加和删除节点 • VxWorks采用自由链管理内存空闲块
– Partition是定长的内存区 – 用户可以从其中分配内存块(buffer或block) – 也可以在某个内存分区再创建一个内存分区
嵌入式操作系统
• VxWorks中主要涉及到的内存单元概念有

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上OSS系统内存管理的设计与实现的开题报告

VxWorks上OSS系统内存管理的设计与实现的开题报告一、研究背景嵌入式操作系统(Embedded Operating System,EOS)在嵌入式系统中发挥着重要的作用,它不但提供了系统的基础功能,如任务管理、进程间通信、文件系统管理等,还具有很高的实时性、可移植性和可扩展性。

近年来,EOS的应用领域越来越广泛,涵盖了网络、通信、移动设备、医疗、工业等领域。

其中,实时操作系统(Real-time Operating System,RTOS)是最被广泛应用的一种EOS。

VxWorks是一种实时操作系统(RTOS),由美国Wind River公司开发,并在全球范围内广泛使用。

VxWorks有许多先进的特性,例如快速、小、可裁剪、安全、可靠以及灵活的定制化选项。

它不仅在工业控制、医疗、航空航天等领域得到广泛应用,还在互联网、电信、金融等领域得到广泛应用。

内存管理是VxWorks操作系统的一个核心模块,它主要负责分配、回收和管理系统内存。

内存管理的设计和实现对系统的性能、可靠性和安全性都有着至关重要的影响。

二、研究目的和意义为了更好地了解VxWorks内存管理模块的设计和实现,本文将围绕内存管理模块的设计思路、算法和实现细节进行深入研究,并借助实验验证,进一步探索如何通过改进内存管理模块来提升VxWorks操作系统的性能、可靠性和安全性。

三、研究内容1. VxWorks内存管理的基本原理和设计思路2. VxWorks内存管理算法及优化策略研究3. VxWorks内存管理实现细节的分析4. 基于VxWorks内存管理的性能优化实验设计与实现四、研究方法1. 文献资料研究法:对VxWorks内存管理模块的相关文献进行阅读和研究,掌握内存管理模块的基本原理、设计思路、算法和实现细节。

2. 实验研究法:基于VxWorks操作系统,进行内存管理相关的性能优化实验设计和实现,通过对实验结果的分析,评估系统性能的提升情况。

一种VxWorks内存管理方案

一种VxWorks内存管理方案摘要:探讨嵌入式开发对内存管理的基本要求、嵌入式开发内存管理的关键问题以及给出一种VxWorks内存管理方案,即把除VxWorks系统保留内存以外的内存分为三种类型进行管理:固定大小的缓冲池、动态可变的堆以及由各种固定大小的缓冲区组成的队列。

目前,针对有内存管理单元MMU(Memory Management Unit)的处理器设计的一些桌面操作系统,如Windows、Linux,使用了虚拟存储器的概念。

虚拟内存地址被送到MMU映射为物理地址,实际存储器被分割为相同大小的页面,采用分页的方式载人进程。

大多数嵌人式系统针对没有MMU的处理器设计,不能使用处理器的虚拟内存管理技术,而采用实存储器管理策略。

因而对于内存的访问是直接的,它对地址的访问不需要经过MMU,而是直接送到地址线上输出,所有程序中访问的地址都是实际物理地址;而且,大多数嵌人式操作系统对内存空间没有保护,各个进程实际上共享一个运行空间。

一个进程在执行前,系统必须为它分配足够的连续地址空间,然后全部载人主存储器的连续空间。

由此可见,嵌人式系统的开发人员不得不参与系统的内存管理。

从编译内核开始,开发人员必须告诉系统这块开发板到底拥有多少内存;在开发应用程序时,必须考虑内存的分配情况并关注应用程序需要运行空间的大小。

另外,由于采用实存储器管理策略,用户程序同内核以及其他用户程序在一个地址空间,程序开发时要保证不侵犯其它程序的地址空间,以使得程序不至于破坏系统的正常工作,或导致其他程序的运行异常;因而,嵌人式系统的开发人员对软件中的一些内存操作要格外小心。

1 嵌入式系统中对内存分配的要求嵌人式系统开发对内存分配有很高的要求:① 内存能快速申请和释放,即快速性。

嵌人式系统中对实时性的保证,要求内存分配过程要尽可能地快;② 内存分配保持原子性,即可靠性。

也就是内存分配的请求必须得到满足,如果分配失败可能会带来灾难性的后果;③ 内存应该各尽其用,即高效性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

管理内存分区

系统分区管理函数列举如下
创建内存分区
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应用设计
中科信软培训中心
七、VxWorks内存
VxWorks内存的布局 VxWorks内存的操作 查看VxWorks内存

1. vxWorks典型内存布局
内存布局说明
LOCAL_MEM_LOCAL_ADRS –板卡RAM的起始地址,通常等于0 RAM_LOW_ADRS –加载VxWorks的起始地址 FREE_RAM_ADRS –VxWorks系统映像的结束地址 sysPhysMemTop() –物理RAM的最高地址 sysMemTop() –系统内存的最高地址
相关文档
最新文档