vxworks中內存分配采用最先適配法,提供2種虛擬內存接口。
5.1 基本概念
嵌入式系統(tǒng)的存儲器,主要有內部/外部2種。
內部存儲器(內存):隨機存儲器(RAM)
RAM分動態(tài)存儲(DRAM)、靜態(tài)存儲器(SRAM),SRAM主要用作高速緩存,DRAM是主內存。
外部存儲器:只讀存儲器(ROM)、非易失存儲器(Flash/NVRAM),在系統(tǒng)掉電后內容仍然存在。
ROM用于存放vxworks的引導映像BootImage,其中代碼調試不便,已很少使用。
Flash(閃存)也可以存放引導映像,且訪問快、可反復修改內容,故已廣泛使用。且vxworks中提供了Flash文件系統(tǒng)(TrueFFS)的驅動。
NVRAM由電池供電,價格貴,故即使使用也是小容量的。主要用于存放系統(tǒng)引導參數(shù)、配置信息(如MAC地址、IP地址)、實時時鐘(RTC)等。
嵌入式系統(tǒng)的內存管理策略,用戶程序、內核、其他用戶程序處于同一個地址空間,開發(fā)程序不能侵犯其他程序或內核的地址。
實時系統(tǒng)應盡量避免動態(tài)分配、釋放內存。
vxworks 提供2種內存區(qū)域:內存域(region)、內存分區(qū)(partition)
region可變長內存區(qū),可分段(segment,如數(shù)據段、代碼段、未賦值初始值數(shù)據段)。靈活不浪費,但易產生碎片。
partition定長內存區(qū),可分配內存塊(buffer/block)。無碎片、效率高,但浪費。
通常vxworks內核和應用程序對內存的操作都是基于內存分區(qū)進行的。
vxworks對內存的初始化在 romInit.s 文件的romInit 函數(shù)中,主要根據啟動類型(冷啟動/熱啟動),對內存進行不同的初始化,并定義 DRAM的刷新表。這部分代碼由 BSP 開發(fā)者完成。
5.2 vxworks中的內存布局
內存分區(qū)、內存池、內存塊
內存池:一塊連續(xù)的內存區(qū)域,含一或多個內存塊
內存分區(qū):含自身的描述信息(一個結構體)和一個或多個內存池。描述信息保存于系統(tǒng)系統(tǒng)內存分區(qū)中(malloc分配)。初始創(chuàng)建時,只有一個內存池,用戶可添加內存池,池之間地址不一定連續(xù)。
vxworks系統(tǒng)啟動時,創(chuàng)建一個系統(tǒng)內存分區(qū),包含系統(tǒng)內存池。操作系統(tǒng)和通常的應用程序對內存操作都是在系統(tǒng)內存池中。
5.2.1 BootRom運行時的內存布局