《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 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網站原創,未經授權禁止轉載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
久久成人精品一区二区三区| 女仆av观看一区| 欧美一区二区三区免费观看 | 欧美国产日韩一区二区在线观看| 亚洲私人影院在线观看| 久久精品国产99国产精品| 宅男精品视频| 亚洲欧洲精品一区二区三区不卡 | 欧美激情无毛| 久久久久久久综合日本| 亚洲综合精品| 一本到高清视频免费精品| 亚洲经典视频在线观看| 欧美一区二区在线免费观看| 亚洲视频精品在线| 亚洲成人在线网站| 激情欧美丁香| 国产亚洲欧美日韩美女| 国产精品日韩一区二区三区| 欧美日韩亚洲不卡| 欧美人妖另类| 欧美—级高清免费播放| 免费短视频成人日韩| 性欧美1819性猛交| 亚洲一品av免费观看| 一区二区日韩| av成人手机在线| 亚洲精品资源| 亚洲精品久久视频| 最新国产拍偷乱拍精品| 亚洲激情在线观看视频免费| 亚洲第一精品久久忘忧草社区| 午夜亚洲福利在线老司机| 亚洲免费人成在线视频观看| 亚洲日本aⅴ片在线观看香蕉| 亚洲激情视频在线播放| 在线观看亚洲视频| 亚洲国产精品成人综合| 日韩午夜免费视频| 亚洲在线一区| 亚洲国产第一页| 99re这里只有精品6| 亚洲女性裸体视频| 久久五月激情| 欧美精品激情blacked18| 国产精品嫩草影院av蜜臀| 国产日韩亚洲欧美精品| 亚洲第一页自拍| 一区二区三区精品国产| 欧美一二三区在线观看| 亚洲人成免费| 亚洲一区二区三区高清 | 欧美视频一区在线| 国产亚洲精久久久久久| 亚洲国产精品成人综合色在线婷婷 | 正在播放欧美视频| 久久er精品视频| 久热精品视频在线观看| 欧美三日本三级少妇三2023| 国产曰批免费观看久久久| 亚洲精品在线观看视频| 亚洲欧美中文日韩v在线观看| 亚洲黄网站在线观看| 亚洲一区久久久| 裸体素人女欧美日韩| 欧美视频在线免费| 一区精品久久| 亚洲综合久久久久| 亚洲精品男同| 欧美一区二区三区在线观看视频 | 国产精品一区二区三区久久| 在线观看日韩www视频免费| 在线中文字幕不卡| 亚洲欧洲在线一区| 欧美一区视频| 欧美日韩和欧美的一区二区| 国产在线视频不卡二| 在线亚洲电影| 亚洲经典在线| 久久精品日韩一区二区三区| 欧美喷水视频| 激情成人亚洲| 亚洲在线观看免费| 一本色道久久综合亚洲91| 玖玖国产精品视频| 国产精品麻豆成人av电影艾秋| 在线免费观看成人网| 午夜精品在线视频| 亚洲一区二区三区四区五区黄| 欧美阿v一级看视频| 国产午夜精品视频免费不卡69堂| 一本色道久久综合狠狠躁篇的优点| 亚洲国产精品精华液2区45| 性欧美xxxx大乳国产app| 欧美日韩精品是欧美日韩精品| 狠狠色综合播放一区二区| 亚洲欧美精品中文字幕在线| 亚洲一区二区免费| 欧美日韩高清在线观看| 亚洲高清资源| 欧美在线观看一区二区| 性高湖久久久久久久久| 欧美精品一区二区在线播放| 一区在线观看| 国产精品丝袜xxxxxxx| 亚洲精品一区中文| 亚洲三级性片| 久久综合色播五月| 国产一区二区三区电影在线观看| av成人天堂| 日韩亚洲精品视频| 你懂的亚洲视频| 影音先锋日韩有码| 欧美在线日韩精品| 久久精品99国产精品| 国产欧美日韩伦理| 亚洲女爱视频在线| 性做久久久久久免费观看欧美| 国产精品www色诱视频| 一区二区三区日韩精品| 亚洲午夜在线观看| 欧美日韩精品一区二区天天拍小说| 亚洲欧洲日本mm| 亚洲精品中文字| 欧美日韩 国产精品| 亚洲精品乱码久久久久久蜜桃91 | 亚洲第一在线综合网站| 久久天天狠狠| 影音先锋中文字幕一区二区| 亚洲国产日韩欧美| 欧美国产精品专区| 91久久在线观看| 一区二区激情| 国产精品草莓在线免费观看| 亚洲一卡二卡三卡四卡五卡| 亚洲欧美日韩中文视频| 国产精品久在线观看| 午夜精品久久久久久久| 久久国内精品视频| 国产一区二区三区不卡在线观看| 久久av二区| 男人天堂欧美日韩| 日韩亚洲欧美高清| 午夜精品国产更新| 国产日产欧产精品推荐色 | 亚洲在线视频| 久久精品中文字幕一区| 好看的av在线不卡观看| 91久久久久久| 欧美日韩八区| 亚洲一区精品视频| 久久国产一区二区| 狠狠干狠狠久久| 99精品国产在热久久婷婷| 国产精品剧情在线亚洲| 欧美一级大片在线观看| 欧美成人网在线| 99国产精品99久久久久久| 午夜精品一区二区三区在线| 国内精品久久久久影院 日本资源| 亚洲精品国产精品乱码不99按摩| 欧美日韩另类一区| 欧美一区二区三区免费看 | 亚洲国产精品一区二区久| 中日韩午夜理伦电影免费| 国产精品亚洲视频| 亚洲国产精品t66y| 欧美日韩免费一区二区三区| 午夜精品久久久久久久久久久久| 免费在线看成人av| 99热免费精品| 久久精品国产欧美亚洲人人爽| 亚洲高清网站| 欧美一区二区三区的| 亚洲大片在线| 亚洲欧美日韩国产成人| 有码中文亚洲精品| 亚洲一区国产| 亚洲第一成人在线| 欧美一级日韩一级| 亚洲国产精品久久久久久女王| 亚洲男同1069视频| 影音先锋欧美精品| 午夜精品一区二区三区四区| 1024亚洲| 性做久久久久久久免费看| 亚洲国产精品成人综合色在线婷婷| 亚洲午夜免费福利视频| 激情视频一区| 午夜精品剧场| 亚洲精品免费一区二区三区| 久久精品视频在线播放| 亚洲免费播放| 另类图片综合电影| 亚洲你懂的在线视频| 欧美日韩第一页| 亚洲国产一区二区三区a毛片| 国产精品免费看片| 日韩一级不卡| 在线观看中文字幕不卡|