《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > Nucleus操作系統內存池模塊移植的研究與應用
Nucleus操作系統內存池模塊移植的研究與應用
來源:電子技術應用2012年第11期
陳安地,李小文
重慶郵電大學 計算機科學與技術學院,重慶400065
摘要: 基于對Nucleus操作系統內核的研究與分析,在三星ARM1176JZF芯片S3C6410上將Nucleus內存池模塊移植并合理應用。根據TD-LTE無線綜合測試儀中的設計要求,介紹了Nucleus內存池的靜態分配和動態分配方式,并根據不同應用環境采用對應的內存池分配優化措施,在實現操作系統基本內存管理功能的同時,滿足了TD-LTE無線綜合測試儀對系統內存資源分配和調度時間的設計要求。
中圖分類號: TP319
文獻標識碼: A
文章編號: 0258-7998(2012)11-0034-03
Research and application of the memory pool module of Nucleus in transplant process
Chen Andi,Li Xiaowen
Academe of Computer Science and Technique, Chongqing University of Posts and Telecommunications,Chongqing 400065,China
Abstract: Based on the research and analysis of kernel of Nucleus operating system, this paper transplants and applies the module of memory pool of Nucleus operating system effectively on S3C6410. According to the requirements of TD-LTE wireless comprehensive tester, the static allocation and dynamic allocation of memory pool are detailed and optimized on the basis of specific environment. The base function of memory management of operating system are realized as well as the requirements of TD-LTE wireless comprehensive tester in resource allocation of memory and scheduling of time are satisfied.
Key words : Nucleus operating system;memory pool;static allocation;dynamic allocation

    內存池方式的內存管理是一種可計量、高效的內存管理方式,它具有減少內存碎片、提高分配速度、防止內存泄漏等優勢[1]。目前在國內基于內核的內存池大多基于Linux內核[2]。本文主要基于Nucleus操作系統內核來介紹內存池靜態與動態分配在TD-LTE無線綜合測試儀移植中的研究與應用,闡述了在不同分配方式中的內存池結構、分配算法以及適用環境。

1 靜態方式分配內存池
    靜態內存池管理方式中內存池分為池(pool)和塊(partition)。之所以稱之為靜態管理方式,是因為在使用過程中塊的大小是固定的(即在創建過程中塊大小是確定的)。靜態內存池的整體結構如圖1所示,池和塊都有自己的頭,池是由雙向循環鏈表鏈接而成,塊是由單向鏈表鏈接而成,每一塊的頭中還包含了自己屬于哪一個池的屬性。可用塊的信息以單向鏈表的形式存儲于池頭中,并且可用塊與已經分配的塊的個數都在池頭中有記錄。

1.1 靜態內存池的創建
    池頭中的主要參數包括內存池控制塊指針、內存池名(只取8個字符)、起始地址、內存池總大小(字節為單位)、內存池分塊大小(字節為單位)、掛起方式(先進先出或按優先級)等,圖2是仿真器上運行過程中靜態內存池結構體截圖。
    對圖2中兩個結構體鏈表參數說明如下:(1)pm_created:當前已經創建的內存池,采用雙向循環鏈表連接,插入方式是在最后一個節點和首節點間填充;(2)pm_available_list:存儲當前還可用partition的鏈表,結構與塊的頭部結構header_ptr相同(PM_OVERHEAD=8 B小塊的頭header_ptr:單向鏈表,內部有指向下一小塊的指針和所屬大塊的控制塊地址)。

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

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

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

 

 

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

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

2.3 動態內存池的釋放
    釋放過程與靜態類似,需要注意的是,如果相鄰塊有空閑塊需要合并,則合并后把dm_search_ptr指向當前合并的空閑塊。
    動態分配內存的算法復雜度要高于靜態分配,從時間復雜度來看,靜態分配是O(1)、動態是O(n)。但是動態分配的內存利用率要高于靜態分配內存[5],在實際應用中要結合具體情況決定采用何種分配方式。在本設計中合理使用了兩種分配方式:在靜態分配中進行密度的動態判斷,在動態分配中進行靜態的最小分配大小匹配。動、靜相結合,使操作系統在分配中盡可能地節約內存的同時,有效減少了內存碎片。本分配方式已經運用于TD-LTE無線綜合測試儀中,在實現操作系統基本內存管理功能的同時,滿足了TD-LTE無線綜合測試儀對系統內存資源和調度時間的設計要求。
參考文獻
[1] 馮寶祥,王桂棠.嵌入式實時操作系統Nucleus PLUS在S3C2410A上移植的實現[J].電子設計應用,2007(5):104-106.
[2] 王小銀,陳莉君.Linux內核中內存池的實現及應用[J]. 西安郵電學院學報,2001,16(4):40-43.
[3] 張磊,王忠仁.嵌入式系統中一種池式內存管理中應用 [J].實驗科學與技術,2007,5(2):150-152
[4] LMAS S H.An application-level memory management service[C].ICTTA 2008.3rd International Conference on.7-11 April 2008:1-4.
[5] MUTSCHLER D W.Enhancement of memory pools toward a  multi-threaded implementation of the Joint integrated mission  model(JIMM)[C].WSC 06.Proceedings of the Winter.3-6 Dec.2006:856-862.

此內容為AET網站原創,未經授權禁止轉載。
主站蜘蛛池模板: 成人激情黄色 | 韩日一级毛片 | 成人国产在线视频 | 最近2019好看的中文字幕免费 | 国产精品免费看 | 国产亚洲精品精品国产亚洲综合 | dy888午夜国产午夜精品 | 午夜影视在线视频观看免费 | 国产桃色在线成免费视频 | 极品美女a∨片在线看 | 日韩欧美一区二区三区不卡 | 无遮挡在线观看 | 国产黄色高清视频 | 日本欧美大码aⅴ在线播放 日本欧美成人免费观看 | 欧洲男女啪啪免费观看 | 一区二区三区视频在线观看 | 亚洲欧美视频一区二区三区 | 综合自拍亚洲综合图不卡区 | 色哒哒影院 | 久久天天躁狠狠躁夜夜中文字幕 | 中文字幕禁忌乱偷在线 | 国内最真实的xxxx人伦 | 一级免费黄色大片 | ww久久 | 欧美日韩在线成人看片a | 欧美视频第一页 | 国产黄色免费 | 久久天天躁狠狠躁夜夜中文字幕 | 日本不卡视频一区二区 | 福利毛片 | 日本一区高清 | 亚洲精品午夜国产va久久成人 | 最近中文字幕版免费 | 日本a级特黄三级三级三级 日本a一级片 | 制服 丝袜 亚洲 中文 综合 | 男人操女人免费网站 | 欧美日韩中文字幕 | 91桃色视频在线观看 | 精品欧美一区二区在线看片 | 九九精品在线播放 | 大胆国模一区二区三区伊人 |