vxworks中内存分配采用最先适配法,提供2种虚拟内存接口。
5.1 基本概念
嵌入式系统的存储器,主要有内部/外部2种。
内部存储器(内存):随机存储器(RAM)
RAM分动态存储(DRAM)、静态存储器(SRAM),SRAM主要用作高速缓存,DRAM是主内存。
外部存储器:只读存储器(ROM)、非易失存储器(Flash/NVRAM),在系统掉电后内容仍然存在。
ROM用于存放vxworks的引导映像BootImage,其中代码调试不便,已很少使用。
Flash(闪存)也可以存放引导映像,且访问快、可反复修改内容,故已广泛使用。且vxworks中提供了Flash文件系统(TrueFFS)的驱动。
NVRAM由电池供电,价格贵,故即使使用也是小容量的。主要用于存放系统引导参数、配置信息(如MAC地址、IP地址)、实时时钟(RTC)等。
嵌入式系统的内存管理策略,用户程序、内核、其他用户程序处于同一个地址空间,开发程序不能侵犯其他程序或内核的地址。
实时系统应尽量避免动态分配、释放内存。
vxworks 提供2种内存区域:内存域(region)、内存分区(partition)
region可变长内存区,可分段(segment,如数据段、代码段、未赋值初始值数据段)。灵活不浪费,但易产生碎片。
partition定长内存区,可分配内存块(buffer/block)。无碎片、效率高,但浪费。
通常vxworks内核和应用程序对内存的操作都是基于内存分区进行的。
vxworks对内存的初始化在 romInit.s 文件的romInit 函数中,主要根据启动类型(冷启动/热启动),对内存进行不同的初始化,并定义 DRAM的刷新表。这部分代码由 BSP 开发者完成。
5.2 vxworks中的内存布局
内存分区、内存池、内存块
内存池:一块连续的内存区域,含一或多个内存块
内存分区:含自身的描述信息(一个结构体)和一个或多个内存池。描述信息保存于系统系统内存分区中(malloc分配)。初始创建时,只有一个内存池,用户可添加内存池,池之间地址不一定连续。
vxworks系统启动时,创建一个系统内存分区,包含系统内存池。操作系统和通常的应用程序对内存操作都是在系统内存池中。
5.2.1 BootRom运行时的内存布局