<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 電源與新能源 > 設計應用 > Nucleus操作系統內存池模塊移植的研究與應用

Nucleus操作系統內存池模塊移植的研究與應用

作者: 時(shí)間:2013-01-20 來(lái)源:網(wǎng)絡(luò ) 收藏
內存池方式的內存管理是一種可計量、高效的內存管理方式,它具有減少內存碎片、提高分配速度、防止內存泄漏等優(yōu)勢[1]。目前在國內基于內核的內存池大多基于Linux內核[2]。本文主要基于內核來(lái)介紹內存池靜態(tài)與動(dòng)態(tài)分配在TD-LTE無(wú)線(xiàn)綜合測試儀移植中的研究與應用,闡述了在不同分配方式中的內存池結構、分配算法以及適用環(huán)境。
1 靜態(tài)方式分配內存池
靜態(tài)內存池管理方式中內存池分為池(pool)和塊(partition)。之所以稱(chēng)之為靜態(tài)管理方式,是因為在使用過(guò)程中塊的大小是固定的(即在創(chuàng )建過(guò)程中塊大小是確定的)。靜態(tài)內存池的整體結構如圖1所示,池和塊都有自己的頭,池是由雙向循環(huán)鏈表鏈接而成,塊是由單向鏈表鏈接而成,每一塊的頭中還包含了自己屬于哪一個(gè)池的屬性??捎脡K的信息以單向鏈表的形式存儲于池頭中,并且可用塊與已經(jīng)分配的塊的個(gè)數都在池頭中有記錄。

Nucleus操作系統內存池模塊移植的研究與應用

1.1 靜態(tài)內存池的創(chuàng )建
池頭中的主要參數包括內存池控制塊指針、內存池名(只取8個(gè)字符)、起始地址、內存池總大?。ㄗ止潪閱挝唬?、內存池分塊大?。ㄗ止潪閱挝唬?、掛起方式(先進(jìn)先出或按優(yōu)先級)等,圖2是仿真器上運行過(guò)程中靜態(tài)內存池結構體截圖。
對圖2中兩個(gè)結構體鏈表參數說(shuō)明如下:(1)pm_created:當前已經(jīng)創(chuàng )建的內存池,采用雙向循環(huán)鏈表連接,插入方式是在最后一個(gè)節點(diǎn)和首節點(diǎn)間填充;(2)pm_available_list:存儲當前還可用partition的鏈表,結構與塊的頭部結構header_ptr相同(PM_OVERHEAD=8 B小塊的頭header_ptr:?jiǎn)蜗蜴湵?,內部有指向下一小塊的指針和所屬大塊的控制塊地址)。

Nucleus操作系統內存池模塊移植的研究與應用

內核中,內存池的創(chuàng )建主要由函數PMC_Create_Partition_Pool負責,創(chuàng )建流程如下:調用過(guò)程中首先進(jìn)行參數合法性檢測;然后在池頭(控制塊)中寫(xiě)入各個(gè)參數,創(chuàng )建鏈表;之后是一個(gè)重要的循環(huán)體,負責初始化partition鏈表,分配所有的partition,每個(gè)partition的大小在分配時(shí)需要在函數傳入參數值的基礎上加8 B,用來(lái)存儲header_ptr;最后在內存池線(xiàn)程保護后將新的內存池插入內存池鏈表并計數。
1.2 靜態(tài)內存池的分配
在TD-LTE無(wú)線(xiàn)綜合測試儀中分配前由協(xié)議棧提供所需要分配的大小,這里主要是放置協(xié)議內部配置信息與層間交互原語(yǔ)。由于這些信息的大小固定,只是有幾種不同大小的固定模式,所以很適合采用靜態(tài)分配的方式來(lái)分配內存,只需要根據數據大小選擇密度合適的內存池即可。移植過(guò)程中使用了不同大小的partition構建不同密度的內存池,因此,可根據申請partition的大小來(lái)判定用那種密度的內存池,以減少內部碎片的大小。這種方法可以有效避免空間浪費[3],同時(shí)又可提高分配效率。
內核中靜態(tài)內存池的分配主要由函數PMC_Allocate_Partition負責,其主要參數為內存池指針(指向調用的內存指針,不能為NULL,設置為可用內存地址即可)、分配大小和掛起標志位。函數中主要判斷內存池指針是否合法、內存池與partition是否匹配、指向調用的內存指針是否合法、任務(wù)掛起標志位是否有效。其分配流程如圖3所示。過(guò)程如下:調用內核函數TCT_System_Protect(TCT_Protect)保護內存池同步互斥通道。判斷是否還有可用partition,若有,則將可用數量減1、分配數量加1并更新pm_available_list以及將指向調用內存指針賦值為當前分配的partition地址(partition地址要+8 B刪去頭);若沒(méi)有,則將任務(wù)掛起直至有可用Partition才恢復。最后解保護并返回。

Nucleus操作系統內存池模塊移植的研究與應用

1.3 靜態(tài)內存池的釋放
系統采用PMC_Deallocate_Partition函數來(lái)完成釋放。流程如下:調用內核函數保護內存池同步互斥通道。判斷是否有等待任務(wù),若有,則分配給這個(gè)任務(wù)當前partition,再判斷當前任務(wù)是否允許被搶占,允許就調用TCT_Control_To_System搶占當前任務(wù)、激活等待內存的任務(wù);若沒(méi)有,則等待任務(wù),將當前partition重新接入到可用partition列表的頭部。最后調用TCT_Unprotect解保護。
2 動(dòng)態(tài)方式分配內存池
動(dòng)態(tài)內存池也分為池和塊兩個(gè)部分,動(dòng)態(tài)池直接由雙向循環(huán)鏈表實(shí)現連接。內部塊是動(dòng)態(tài)分配的,由最小可分配空間來(lái)限制塊的最小值。與靜態(tài)分配不同,動(dòng)態(tài)分配塊也由雙向循環(huán)鏈表來(lái)鏈接。創(chuàng )建時(shí)的初始結構為兩個(gè)塊,在申請時(shí)動(dòng)態(tài)分割。圖4是仿真器上運行過(guò)程中動(dòng)態(tài)內存池與塊的結構體截圖。

Nucleus操作系統內存池模塊移植的研究與應用

池控制塊結構中dm_memory_list與塊頭結構體相同,池通過(guò)dm_memory_list來(lái)完成塊搜索;塊頭結構中dm_memory_pool與大塊頭結構相同,通過(guò)它來(lái)比配大塊。
2.1 動(dòng)態(tài)內存池的創(chuàng )建
初始化完成時(shí)的內存結構:初始化創(chuàng )建完成時(shí)內存池中有2個(gè)塊,1個(gè)大小為總大小減去32 B,包含自己的頭DM_OVERHEAD=16 B,設置為可以狀態(tài)free=‘0x01’;1個(gè)大小為16 B,只有自己的頭,沒(méi)有空間,設置為不可以狀態(tài)free=‘0x00’。因此,此時(shí)的可用空間為除去池的控制塊外的總大小減去32 B。初始化結構如圖5所示(沒(méi)有將池控制塊表示出來(lái))。

Nucleus操作系統內存池模塊移植的研究與應用

創(chuàng )建時(shí),首先為控制塊指針賦值,內存池大小與最小分區大小進(jìn)行字對齊校正;判斷控制塊指針、起始地址、最小分配空間、掛起標志是否合法。創(chuàng )建過(guò)程如下:初始化控制塊中的各個(gè)參數,并按圖5初始化小塊、創(chuàng )建小塊雙向循環(huán)鏈表,與靜態(tài)分配相同需要先進(jìn)行線(xiàn)程保護再加入到池動(dòng)態(tài)內存池鏈表。
2.2 動(dòng)態(tài)內存池的申請
動(dòng)態(tài)申請主要用于內模塊(如任務(wù)、隊列等)的堆棧分配與模塊占用空間的分配。由于在TD-LTE無(wú)線(xiàn)綜合測試儀中這些分配的空間大小浮動(dòng)不定,因此需要使用動(dòng)態(tài)分配內存。Nucleus中動(dòng)態(tài)分配采用首次匹配原則,每一次申請內存時(shí)動(dòng)態(tài)分配申請大小加16 B(這個(gè)16 B的頭對應剩下的可用空間)的內存池空間,并把分配過(guò)的部分設置為不可用狀態(tài)free=‘0x00’。
負責實(shí)現的函數是DMC_Allocate_Memory。首先進(jìn)行各種參數的合法性檢測,然后將分配空間size小于最小分配空間的分配空間大小賦值為最小空間,對size進(jìn)行字對齊處理,調用線(xiàn)程保護后采用首先匹配法來(lái)找適用空間,即:在循環(huán)體中先判斷free標志,是空閑塊(free=‘0x01’),則算出減去本次分配的頭后所剩的空間,當此空間大于本次請求size時(shí)進(jìn)行分配,小于時(shí)則移動(dòng)到下一個(gè)塊;若不是空閑塊,則直接把剩余空間設置為0進(jìn)行后面小于size時(shí)移動(dòng)到下一個(gè)塊的判斷。注意:這里用到了控制塊中的dm_search_ptr屬性(結構與小塊的頭相同),該屬性用于記錄開(kāi)始匹配的起始位置,作為判斷循環(huán)體結束的條件之一,如果循環(huán)到此處,就表示沒(méi)有找到可分配空間。圖6是動(dòng)態(tài)分配的流程圖。

Nucleus操作系統內存池模塊移植的研究與應用

循環(huán)結束后判斷是否找到可用于分配的塊,若找到則進(jìn)行是否需要分割該可用塊的判斷。條件是這個(gè)可用塊的大小大于或等于本次所需空間size+頭大小+最小分配空間的值,若滿(mǎn)足此條件則分割出一個(gè)新塊并對其加頭初始化,再計算出剩余可用空間;不滿(mǎn)足此條件則直接計算剩余可用空間。分配的空間標志為非空閑后,把所分配空間的地址賦給指向調用的內存指針(注意去頭)。為提高效率,還需要進(jìn)行一個(gè)簡(jiǎn)單處理,即判斷如果在搜索塊時(shí)一次性匹配成功,則將dm_search_ptr移向下一個(gè)塊。
如果沒(méi)有找到可用塊則將任務(wù)掛起等待,沒(méi)有采用掛起模式則直接返回NULL給指向調用的內存指針,最后調用TCT_Unprotect解保護。圖7是分配第一塊內存后動(dòng)態(tài)內存池的結構。

Nucleus操作系統內存池模塊移植的研究與應用

2.3 動(dòng)態(tài)內存池的釋放
釋放過(guò)

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: Nucleus 操作系統 模塊移植

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>