




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、平板式內(nèi)存管理謝國經(jīng)1+1(廣東海洋大學(xué) 電子信息工程1071班,湛江市 524088)Flat memory managementXie Guo Jing1+1(Department of Electronic Engineering of Guangdong Ocean University, ZhanJiang 524000, ChinaAbstract:* Memory management There are many ways, of this paper is not a simple chip MMU memory management. This planar main me
2、mory management system with a simple multi-tasking. Although the memory management there are a lack of flexibility, but achieving very simple, and portability is very strong. Therefore, there is no memory management unit MMU chips are widely used. This article gives concrete realization of the sourc
3、e code.Key words:* Memory management; operating system摘 要:*內(nèi)存管理的方法有很多種,本文論述的是沒有MMU芯片上的一種簡單的內(nèi)存管理方式。這種平面式的內(nèi)存管理方式主要用簡單的多任務(wù)系統(tǒng)。這種內(nèi)存管理方式雖然在靈活性上有欠缺,但實現(xiàn)十分簡單,而且移植性非常的強。因此在沒有內(nèi)存管理單元MMU的芯片中得到廣泛的應(yīng)用。本文將給出具體實現(xiàn)的源代碼。關(guān)鍵詞:*內(nèi)存管理;操作系統(tǒng);1 為什么需要平板式的內(nèi)存管理方式內(nèi)存管理是操作系統(tǒng)的重要組成部分,內(nèi)存管理是否高效直接影響到任務(wù)運行的效率。但可惜的是內(nèi)存管理的方式很多情況受到硬件的限制,一些高級芯片或
4、系統(tǒng)有MMU硬件單元,可以容易的實現(xiàn)分段、分頁的內(nèi)存管理方式,可以跑多進程的操作系統(tǒng),像我們的PC機就是一個很好的例子。具有MMU的片上系統(tǒng)不少,但在很多場合并不需要那么高級的芯片。比如以ARM7為內(nèi)核的很多芯片(如LPC213X)足可以做很多的嵌入式產(chǎn)品,不僅降低了開發(fā)成本,而且還使得開發(fā)難度降低,開發(fā)周期變短。在這樣的實際需求下,針對沒有MMU片上系統(tǒng)的平板式內(nèi)存管理方式應(yīng)運而生。2 平板式內(nèi)存管理方式基本思想操作系統(tǒng)用一個鏈表管理著系統(tǒng)空閑的內(nèi)存塊。當任務(wù)向系統(tǒng)申請內(nèi)存塊的時候,任務(wù)就會調(diào)用相應(yīng)的系統(tǒng)函數(shù),并以要申請的內(nèi)存塊大小作為參數(shù),系統(tǒng)函數(shù)會在這個空閑的內(nèi)存鏈表中查找對應(yīng)大小的內(nèi)存
5、塊,如果成功的查找到對應(yīng)大小的內(nèi)塊,函數(shù)就會返回這個內(nèi)存塊的地址,并把這個內(nèi)存塊從系統(tǒng)內(nèi)存空閑鏈表中取下來。如果查找不到符合要求的內(nèi)存塊,函數(shù)就會返回空指針,表示申請不到內(nèi)存塊。再分細一點又可以分為兩種方式,一種是分配內(nèi)存塊的大小由函數(shù)參數(shù)傳過來,系統(tǒng)根據(jù)這個參數(shù)在鏈表中找;另外一種是同一個鏈表中的內(nèi)存塊大小是相等的,需要不同大小的內(nèi)存塊要在不同的鏈表中申請。下面分別對這兩種方式做詳細介紹。2.1 任意大小分配方式圖1 任意大小分配方式這種可以分配任意大小的內(nèi)存管理方式,系統(tǒng)用一個指針指向這塊很大的內(nèi)存塊,如果有任務(wù)需要向系統(tǒng)申請內(nèi)存塊的時候,就會在這塊大的內(nèi)存塊中查找,如果查找不到對應(yīng)大小的
6、內(nèi)存塊就會嘗試去把大塊的內(nèi)存塊分成兩塊,然后取合適的那塊返還給用戶,剩下的放到空閑鏈表中,等待別的任務(wù)申請。當任務(wù)把以前申請到的內(nèi)存塊歸還給系統(tǒng)的時候,系統(tǒng)會嘗試把這塊內(nèi)存和鏈表中某塊空閑的內(nèi)存塊組成一塊連續(xù)的內(nèi)存塊,如果不能合并就會把這塊內(nèi)存塊當作一個獨立的節(jié)點放到內(nèi)存空閑鏈表中。以上這樣的分配和釋放方式會很容易產(chǎn)生一個問題,系統(tǒng)在經(jīng)過多次分配和釋放內(nèi)存后會形成很多細小的內(nèi)存塊,這樣的內(nèi)存塊即不能組成連續(xù)的內(nèi)存塊,也不能滿足任務(wù)的需要,因此會導(dǎo)致內(nèi)存的泄漏。內(nèi)存的泄漏使得本來已經(jīng)捉襟見肘的內(nèi)存資源變得更加的緊張了。在圖1中有A、B、C三個指針,他們指向系統(tǒng)空閑的內(nèi)存塊,實際上他們是同一個,只
7、是在不同的時間他們的表現(xiàn)形態(tài)不一樣。A表示在系統(tǒng)開始時,管理的內(nèi)存塊;B表示經(jīng)過幾次分配后的空閑內(nèi)存鏈表;C就是經(jīng)過很多次分配回收后的系統(tǒng)空閑內(nèi)存示意圖。這樣的內(nèi)存管理方式,申請和回收都要經(jīng)過很長時間的運算,而且運算時間不是常數(shù),因此不適合硬實時的嵌入式系統(tǒng)。這樣的內(nèi)存管理方式雖然比較靈活,但由于存在這樣的問題,本文不給出這種內(nèi)存管理方式的實現(xiàn)代碼。下面介紹另外一種更加適合硬實時系統(tǒng)的平板式內(nèi)存管理方式。2.2 固定大小分配方式圖2固定大小分配方式固定大小分配方式,不僅實現(xiàn)起來容易,而且實時性十分的高。這樣的內(nèi)存管理是預(yù)先把一大塊的內(nèi)存分配成固定大小的內(nèi)存塊,然后把他們連接成一個鏈表。這樣當任
8、務(wù)向系統(tǒng)申請內(nèi)存塊的時候,任務(wù)要把這個空閑內(nèi)存的頭指針作為參數(shù)傳給系統(tǒng),系統(tǒng)就會在這個鏈表中查找一塊內(nèi)存塊返回給用戶,如果鏈表是空的就返回NULL表示申請失敗。當任務(wù)釋放內(nèi)存塊的時候,就要確定兩個參數(shù),第一個是要歸還系統(tǒng)內(nèi)存塊的首地址,第二個是內(nèi)存空閑鏈表的首地址。這樣看起來真的會有點抽象,在看完下面的代碼后再回過頭來看這個文字相信你會有更加深刻的理解。3 平板式內(nèi)存管理方式具體實現(xiàn)固定大小分配方式主要用三個函數(shù)來實現(xiàn),OSMemCreate()是把一大塊內(nèi)存分成固定大小的塊,并把他們組成一個鏈表,返回頭指針。OSMemApply()向系統(tǒng)申請一個內(nèi)存塊函數(shù)。OSMemRelease()釋放申
9、請到的內(nèi)存塊。下面分別給出具體實現(xiàn)。3.1 切割內(nèi)存塊void *OSMemCreate(void * Addr,uint32 NumCake,uint32 CakeSize)int i;void *TempLink1;uint8 *TempLink2;if(Addr = NULL) return NULL;if(NumCake = 1) return Addr;TempLink1 = (void*)Addr;/指向數(shù)組首地址TempLink2 = (uint8*)Addr + CakeSize;/移動CakeSizefor( i = 0; i < NumCake - 1 ; i+)*T
10、empLink1 =(void *)TempLink2;/保存下一個內(nèi)存塊到前一個內(nèi)存塊開頭 TempLink1 = (void*)TempLink2;/移動指針指向下一個內(nèi)存塊TempLink2 = TempLink2+ CakeSize;/移動CakeSize*TempLink1 = (void *)0;return Addr;這個函數(shù)有三個參數(shù),void * Addr是將要進行切割的內(nèi)存塊首地址,在執(zhí)行這個函數(shù)后者塊內(nèi)存就會按照后面兩個參數(shù)的要求切割成若干塊。uint32 NumCake是鏈表中內(nèi)存塊的數(shù)量,執(zhí)行函數(shù)后鏈表中將會有NumCake 塊空閑內(nèi)存塊。uint32 CakeSiz
11、e 是每一塊內(nèi)存的大小。3.2 申請內(nèi)存塊void *OSMemApply(void *MemPtr)void *TempLink;if(MemPtr = NULL) return NULL;/TempLink = MemPtr;/獲得第一塊MemPtr = *(void*)TempLink;/移動指針,從鏈表中刪除已經(jīng)申請了的內(nèi)存塊return TempLink;申請內(nèi)存塊實際上就是進行一個鏈表的刪除操作。3.3 釋放內(nèi)存塊int8 OSMemRelease(void *MemPtr,void *CakePtr)*(void*)CakePtr = MemPtr;MemPtr = CakePt
12、r;return OS_OK;把內(nèi)存塊歸還系統(tǒng),時間上就是進行鏈表的一個插入操作。4 應(yīng)用4.1 圖文說明在多任務(wù)系統(tǒng)中常常需要進行任務(wù)之間的通信,承載信息需要內(nèi)存,因此在這樣的情況下可以向系統(tǒng)申請一塊內(nèi)存,然后寫入要發(fā)送的信息,并把這這塊消息發(fā)送到別的任務(wù),任務(wù)收到消息并處理完后就可以把這塊內(nèi)存塊歸還系統(tǒng)。等待別的任務(wù)使用。以上文字描述的過程用圖來表達就是圖3所示。圖3動態(tài)內(nèi)存分配應(yīng)用舉例4.2 代碼實現(xiàn)全局變量的定義:#include "config.h"#define Message 22OS_STK UsrStk3100;/任務(wù)堆棧void *UsrMemPtr;/
13、系統(tǒng)空閑內(nèi)存塊頭指針int UsrMem10032;/系統(tǒng)總的內(nèi)存塊大小OS_TASK *UsrTaskPtr2;/保存任務(wù)ID消息處理函數(shù):void UsrHandleMsg(void *Msg)/處理消息函數(shù)任務(wù)1,申請內(nèi)存塊并向任務(wù)2發(fā)送消息:void TaskMem1(void*Pd)int *TaskMemPtr;/while(1) if(TaskMemPtr = OSMemApply(UsrMemPtr) != NULL)/申請內(nèi)存塊 *TaskMemPtr = Message;/申請成功就寫進要發(fā)送的消息 OSTaskMsgPost(UsrTaskPtr1,TaskMemPtr
14、,0);/發(fā)送消息到任務(wù)2 任務(wù)2,接收任務(wù)1發(fā)來的消息處理并釋放內(nèi)存塊:void TaskMem2(void*Pd)int *TaskMemPtr;/while(1)if(TaskMemPtr = OSTaskMsgPend() != NULL)/取任務(wù)1發(fā)送過來的消息UsrHandleMsg(TaskMemPtr);/取到消息就處理消息 OSMemRelease(UsrMemPtr,TaskMemPtr);/歸還內(nèi)存塊到系統(tǒng) 主函數(shù),啟動系統(tǒng)并創(chuàng)建任務(wù),創(chuàng)建空閑內(nèi)存鏈表。int main (void) OSSystemInit(); /系統(tǒng)初始化 UsrMemPtr = OSMemCreate(UsrMem,100,32);/切割大塊的內(nèi)存為100塊,每塊為32字節(jié) UsrTaskPtr0 = OSTaskCreate(TaskMem1, NULL, &UsrStk299, 2);/創(chuàng)建任務(wù)1 UsrTaskPtr1 = OSTaskCreate(TaskMem2, NULL, &UsrStk199, 2);/創(chuàng)建任務(wù)2 OSStart();/進入多任務(wù)環(huán)境 while(1);
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 機器人智能搬運與集成系統(tǒng)行業(yè)深度調(diào)研及發(fā)展戰(zhàn)略咨詢報告
- 面包車批發(fā)企業(yè)縣域市場拓展與下沉戰(zhàn)略研究報告
- 硝酸鈷企業(yè)縣域市場拓展與下沉戰(zhàn)略研究報告
- 男女單鞋企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略研究報告
- 郵票批發(fā)企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略研究報告
- 野營用織物制品企業(yè)ESG實踐與創(chuàng)新戰(zhàn)略研究報告
- 廣播設(shè)備配件和附件批發(fā)企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略研究報告
- 農(nóng)林牧漁初級產(chǎn)品批發(fā)企業(yè)ESG實踐與創(chuàng)新戰(zhàn)略研究報告
- 珍珠手鏈企業(yè)ESG實踐與創(chuàng)新戰(zhàn)略研究報告
- 輸送膠輥企業(yè)數(shù)字化轉(zhuǎn)型與智慧升級戰(zhàn)略研究報告
- 零星工程(零星用工)簽認單
- 數(shù)字邏輯-第四章-組合邏輯電路
- 菜品成本卡模版
- 最新2022年護理院基本標準
- 5G手機無線通訊濾波芯片產(chǎn)業(yè)化項目環(huán)境影響報告表
- 工會野炊活動方案
- 《對外援援助成套項目勘察設(shè)計取費標準內(nèi)部暫行規(guī)定(稿)》
- 通用反應(yīng)單元工藝
- 空冷塔施工方案
- Inplan 操作手冊初稿
- 實用的尺寸公差等級一覽表
評論
0/150
提交評論