一種VxWorks記憶體管理方案
阿新 • • 發佈:2019-02-15
3 對VxWorks記憶體管理的改進
改進的緩衝區管理模組的作用在於加強VxWorks實時作業系統對記憶體的管理,併為上層應用程式提供所需記憶體申請和釋放工作。因此本改進模組位於VxWorks實時作業系統模組和應用程式模組之間。
CPU實際實體記憶體在bootRoom啟動時劃分為兩部分:VxWorks核心作業系統記憶體和保留給使用者管理的記憶體。為了便於管理,對為使用者保留記憶體作進一步劃分,使用memPartCreate函式建立兩個記憶體分割槽:一個分割槽用來生成預先申請好固定大小緩衝池;另一分割槽以堆方式向上層提供的緩衝池。這樣就把實體記憶體劃分成3個部分:
(1)Paal:VxWorks系統記憶體,在物理低端;
(2)Part2:預先申請好的固定大小的緩衝池,每種固定長度的記憶體緩衝區形成一個佇列;
(3)Pan3:以堆方式提供給上層應用程式的緩衝池;
記憶體劃分如圖2所示。
3.1 不同大小固定長度緩衝區管理
為了避免記憶體碎片,我們採用預先分配記憶體塊的方式實現對堆記憶體分割槽進行管理:分割槽內的所有記憶體佇列,每個佇列管理一定數量大小相同且已經申請好的記憶體塊,這些記憶體塊永久佔用。然後對每個記憶體佇列管理資料結構進行維護。上層應用程式呼叫模組介面函式從緩衝池中
申請和釋放。每塊緩衝區的使用者區填充預設內容。
3.2 堆方式記憶體的管理
對於堆記憶體的使用,我們對VxWorks的兩個核心函式memPartAlloc()和memPartFree()進行了封裝,並在除錯版本中加入資訊,如圖3所示。
圖中:BLOCK- HDR表示記憶體塊頭,OAHEAD表示塊附加資訊頭,pbuf指向實際的堆空間,size為堆的大小。
3.3 快速記憶體分配管理
對於協議等存在大量、快速地申請/釋放記憶體的操作而言,在系統執行一段時間後記憶體都變成了碎片,再申請大塊記憶體時容易失敗。提供一種快速的記憶體申請/釋放的方式,並且最大程度地減少系統的記憶體碎片。提供64/128/……/524 288大小的記憶體使用快速記憶體分配管理機制,則在一個大的記憶體塊內部進行記憶體使用,申請/釋放時不涉及到系統對記憶體的拆鏈/建鏈過程,比較快速,並且對釋放的記憶體進行合併,保證系統有儘可能多的大塊記憶體。如圖4所示。
4 小結
許多嵌入式應用開發在實時作業系統提供的malloc()和free()函式的基礎上編寫自己的記憶體管理方案。編寫這樣的記憶體管理方案,一方面可以減少對malloc()和free()函式的依賴,統一記憶體應用介面,從而避免此之帶來的記憶體碎片、時間不確定等缺點,另一方面可以增強程式的查錯能力,減少記憶體使用錯誤。對於在嵌入式系統中廣泛存在的資料庫型別的記憶體需求,把由使用者管理的記憶體分為固定大小的緩衝區、以堆方式分配的緩衝區和不同固定大小記憶體佇列的分配方式,體現了記憶體管理的優越性
改進的緩衝區管理模組的作用在於加強VxWorks實時作業系統對記憶體的管理,併為上層應用程式提供所需記憶體申請和釋放工作。因此本改進模組位於VxWorks實時作業系統模組和應用程式模組之間。
CPU實際實體記憶體在bootRoom啟動時劃分為兩部分:VxWorks核心作業系統記憶體和保留給使用者管理的記憶體。為了便於管理,對為使用者保留記憶體作進一步劃分,使用memPartCreate函式建立兩個記憶體分割槽:一個分割槽用來生成預先申請好固定大小緩衝池;另一分割槽以堆方式向上層提供的緩衝池。這樣就把實體記憶體劃分成3個部分:
(1)Paal:VxWorks系統記憶體,在物理低端;
(2)Part2:預先申請好的固定大小的緩衝池,每種固定長度的記憶體緩衝區形成一個佇列;
(3)Pan3:以堆方式提供給上層應用程式的緩衝池;
記憶體劃分如圖2所示。
3.1 不同大小固定長度緩衝區管理
為了避免記憶體碎片,我們採用預先分配記憶體塊的方式實現對堆記憶體分割槽進行管理:分割槽內的所有記憶體佇列,每個佇列管理一定數量大小相同且已經申請好的記憶體塊,這些記憶體塊永久佔用。然後對每個記憶體佇列管理資料結構進行維護。上層應用程式呼叫模組介面函式從緩衝池中
申請和釋放。每塊緩衝區的使用者區填充預設內容。
3.2 堆方式記憶體的管理
對於堆記憶體的使用,我們對VxWorks的兩個核心函式memPartAlloc()和memPartFree()進行了封裝,並在除錯版本中加入資訊,如圖3所示。
圖中:BLOCK- HDR表示記憶體塊頭,OAHEAD表示塊附加資訊頭,pbuf指向實際的堆空間,size為堆的大小。
3.3 快速記憶體分配管理
對於協議等存在大量、快速地申請/釋放記憶體的操作而言,在系統執行一段時間後記憶體都變成了碎片,再申請大塊記憶體時容易失敗。提供一種快速的記憶體申請/釋放的方式,並且最大程度地減少系統的記憶體碎片。提供64/128/……/524 288大小的記憶體使用快速記憶體分配管理機制,則在一個大的記憶體塊內部進行記憶體使用,申請/釋放時不涉及到系統對記憶體的拆鏈/建鏈過程,比較快速,並且對釋放的記憶體進行合併,保證系統有儘可能多的大塊記憶體。如圖4所示。
4 小結
許多嵌入式應用開發在實時作業系統提供的malloc()和free()函式的基礎上編寫自己的記憶體管理方案。編寫這樣的記憶體管理方案,一方面可以減少對malloc()和free()函式的依賴,統一記憶體應用介面,從而避免此之帶來的記憶體碎片、時間不確定等缺點,另一方面可以增強程式的查錯能力,減少記憶體使用錯誤。對於在嵌入式系統中廣泛存在的資料庫型別的記憶體需求,把由使用者管理的記憶體分為固定大小的緩衝區、以堆方式分配的緩衝區和不同固定大小記憶體佇列的分配方式,體現了記憶體管理的優越性