平板式內(nèi)存管理_第1頁(yè)
平板式內(nèi)存管理_第2頁(yè)
平板式內(nèi)存管理_第3頁(yè)
平板式內(nèi)存管理_第4頁(yè)
平板式內(nèi)存管理_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、平板式內(nèi)存管理謝國(guó)經(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)存管理的方法有很多種,本文論述的是沒(méi)有MMU芯片上的一種簡(jiǎn)單的內(nèi)存管理方式。這種平面式的內(nèi)存管理方式主要用簡(jiǎn)單的多任務(wù)系統(tǒng)。這種內(nèi)存管理方式雖然在靈活性上有欠缺,但實(shí)現(xiàn)十分簡(jiǎn)單,而且移植性非常的強(qiáng)。因此在沒(méi)有內(nèi)存管理單元MMU的芯片中得到廣泛的應(yīng)用。本文將給出具體實(shí)現(xiàn)的源代碼。關(guān)鍵詞:*內(nèi)存管理;操作系統(tǒng);1 為什么需要平板式的內(nèi)存管理方式內(nèi)存管理是操作系統(tǒng)的重要組成部分,內(nèi)存管理是否高效直接影響到任務(wù)運(yùn)行的效率。但可惜的是內(nèi)存管理的方式很多情況受到硬件的限制,一些高級(jí)芯片或

4、系統(tǒng)有MMU硬件單元,可以容易的實(shí)現(xiàn)分段、分頁(yè)的內(nèi)存管理方式,可以跑多進(jìn)程的操作系統(tǒng),像我們的PC機(jī)就是一個(gè)很好的例子。具有MMU的片上系統(tǒng)不少,但在很多場(chǎng)合并不需要那么高級(jí)的芯片。比如以ARM7為內(nèi)核的很多芯片(如LPC213X)足可以做很多的嵌入式產(chǎn)品,不僅降低了開(kāi)發(fā)成本,而且還使得開(kāi)發(fā)難度降低,開(kāi)發(fā)周期變短。在這樣的實(shí)際需求下,針對(duì)沒(méi)有MMU片上系統(tǒng)的平板式內(nèi)存管理方式應(yīng)運(yùn)而生。2 平板式內(nèi)存管理方式基本思想操作系統(tǒng)用一個(gè)鏈表管理著系統(tǒng)空閑的內(nèi)存塊。當(dāng)任務(wù)向系統(tǒng)申請(qǐng)內(nèi)存塊的時(shí)候,任務(wù)就會(huì)調(diào)用相應(yīng)的系統(tǒng)函數(shù),并以要申請(qǐng)的內(nèi)存塊大小作為參數(shù),系統(tǒng)函數(shù)會(huì)在這個(gè)空閑的內(nèi)存鏈表中查找對(duì)應(yīng)大小的內(nèi)存

5、塊,如果成功的查找到對(duì)應(yīng)大小的內(nèi)塊,函數(shù)就會(huì)返回這個(gè)內(nèi)存塊的地址,并把這個(gè)內(nèi)存塊從系統(tǒng)內(nèi)存空閑鏈表中取下來(lái)。如果查找不到符合要求的內(nèi)存塊,函數(shù)就會(huì)返回空指針,表示申請(qǐng)不到內(nèi)存塊。再分細(xì)一點(diǎn)又可以分為兩種方式,一種是分配內(nèi)存塊的大小由函數(shù)參數(shù)傳過(guò)來(lái),系統(tǒng)根據(jù)這個(gè)參數(shù)在鏈表中找;另外一種是同一個(gè)鏈表中的內(nèi)存塊大小是相等的,需要不同大小的內(nèi)存塊要在不同的鏈表中申請(qǐng)。下面分別對(duì)這兩種方式做詳細(xì)介紹。2.1 任意大小分配方式圖1 任意大小分配方式這種可以分配任意大小的內(nèi)存管理方式,系統(tǒng)用一個(gè)指針指向這塊很大的內(nèi)存塊,如果有任務(wù)需要向系統(tǒng)申請(qǐng)內(nèi)存塊的時(shí)候,就會(huì)在這塊大的內(nèi)存塊中查找,如果查找不到對(duì)應(yīng)大小的

6、內(nèi)存塊就會(huì)嘗試去把大塊的內(nèi)存塊分成兩塊,然后取合適的那塊返還給用戶(hù),剩下的放到空閑鏈表中,等待別的任務(wù)申請(qǐng)。當(dāng)任務(wù)把以前申請(qǐng)到的內(nèi)存塊歸還給系統(tǒng)的時(shí)候,系統(tǒng)會(huì)嘗試把這塊內(nèi)存和鏈表中某塊空閑的內(nèi)存塊組成一塊連續(xù)的內(nèi)存塊,如果不能合并就會(huì)把這塊內(nèi)存塊當(dāng)作一個(gè)獨(dú)立的節(jié)點(diǎn)放到內(nèi)存空閑鏈表中。以上這樣的分配和釋放方式會(huì)很容易產(chǎn)生一個(gè)問(wèn)題,系統(tǒng)在經(jīng)過(guò)多次分配和釋放內(nèi)存后會(huì)形成很多細(xì)小的內(nèi)存塊,這樣的內(nèi)存塊即不能組成連續(xù)的內(nèi)存塊,也不能滿(mǎn)足任務(wù)的需要,因此會(huì)導(dǎo)致內(nèi)存的泄漏。內(nèi)存的泄漏使得本來(lái)已經(jīng)捉襟見(jiàn)肘的內(nèi)存資源變得更加的緊張了。在圖1中有A、B、C三個(gè)指針,他們指向系統(tǒng)空閑的內(nèi)存塊,實(shí)際上他們是同一個(gè),只

7、是在不同的時(shí)間他們的表現(xiàn)形態(tài)不一樣。A表示在系統(tǒng)開(kāi)始時(shí),管理的內(nèi)存塊;B表示經(jīng)過(guò)幾次分配后的空閑內(nèi)存鏈表;C就是經(jīng)過(guò)很多次分配回收后的系統(tǒng)空閑內(nèi)存示意圖。這樣的內(nèi)存管理方式,申請(qǐng)和回收都要經(jīng)過(guò)很長(zhǎng)時(shí)間的運(yùn)算,而且運(yùn)算時(shí)間不是常數(shù),因此不適合硬實(shí)時(shí)的嵌入式系統(tǒng)。這樣的內(nèi)存管理方式雖然比較靈活,但由于存在這樣的問(wèn)題,本文不給出這種內(nèi)存管理方式的實(shí)現(xiàn)代碼。下面介紹另外一種更加適合硬實(shí)時(shí)系統(tǒng)的平板式內(nèi)存管理方式。2.2 固定大小分配方式圖2固定大小分配方式固定大小分配方式,不僅實(shí)現(xiàn)起來(lái)容易,而且實(shí)時(shí)性十分的高。這樣的內(nèi)存管理是預(yù)先把一大塊的內(nèi)存分配成固定大小的內(nèi)存塊,然后把他們連接成一個(gè)鏈表。這樣當(dāng)任

8、務(wù)向系統(tǒng)申請(qǐng)內(nèi)存塊的時(shí)候,任務(wù)要把這個(gè)空閑內(nèi)存的頭指針作為參數(shù)傳給系統(tǒng),系統(tǒng)就會(huì)在這個(gè)鏈表中查找一塊內(nèi)存塊返回給用戶(hù),如果鏈表是空的就返回NULL表示申請(qǐng)失敗。當(dāng)任務(wù)釋放內(nèi)存塊的時(shí)候,就要確定兩個(gè)參數(shù),第一個(gè)是要?dú)w還系統(tǒng)內(nèi)存塊的首地址,第二個(gè)是內(nèi)存空閑鏈表的首地址。這樣看起來(lái)真的會(huì)有點(diǎn)抽象,在看完下面的代碼后再回過(guò)頭來(lái)看這個(gè)文字相信你會(huì)有更加深刻的理解。3 平板式內(nèi)存管理方式具體實(shí)現(xiàn)固定大小分配方式主要用三個(gè)函數(shù)來(lái)實(shí)現(xiàn),OSMemCreate()是把一大塊內(nèi)存分成固定大小的塊,并把他們組成一個(gè)鏈表,返回頭指針。OSMemApply()向系統(tǒng)申請(qǐng)一個(gè)內(nèi)存塊函數(shù)。OSMemRelease()釋放申

9、請(qǐng)到的內(nèi)存塊。下面分別給出具體實(shí)現(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;/移動(dòng)CakeSizefor( i = 0; i < NumCake - 1 ; i+)*T

10、empLink1 =(void *)TempLink2;/保存下一個(gè)內(nèi)存塊到前一個(gè)內(nèi)存塊開(kāi)頭 TempLink1 = (void*)TempLink2;/移動(dòng)指針指向下一個(gè)內(nèi)存塊TempLink2 = TempLink2+ CakeSize;/移動(dòng)CakeSize*TempLink1 = (void *)0;return Addr;這個(gè)函數(shù)有三個(gè)參數(shù),void * Addr是將要進(jìn)行切割的內(nèi)存塊首地址,在執(zhí)行這個(gè)函數(shù)后者塊內(nèi)存就會(huì)按照后面兩個(gè)參數(shù)的要求切割成若干塊。uint32 NumCake是鏈表中內(nèi)存塊的數(shù)量,執(zhí)行函數(shù)后鏈表中將會(huì)有NumCake 塊空閑內(nèi)存塊。uint32 CakeSiz

11、e 是每一塊內(nèi)存的大小。3.2 申請(qǐng)內(nèi)存塊void *OSMemApply(void *MemPtr)void *TempLink;if(MemPtr = NULL) return NULL;/TempLink = MemPtr;/獲得第一塊MemPtr = *(void*)TempLink;/移動(dòng)指針,從鏈表中刪除已經(jīng)申請(qǐng)了的內(nèi)存塊return TempLink;申請(qǐng)內(nèi)存塊實(shí)際上就是進(jìn)行一個(gè)鏈表的刪除操作。3.3 釋放內(nèi)存塊int8 OSMemRelease(void *MemPtr,void *CakePtr)*(void*)CakePtr = MemPtr;MemPtr = CakePt

12、r;return OS_OK;把內(nèi)存塊歸還系統(tǒng),時(shí)間上就是進(jìn)行鏈表的一個(gè)插入操作。4 應(yīng)用4.1 圖文說(shuō)明在多任務(wù)系統(tǒng)中常常需要進(jìn)行任務(wù)之間的通信,承載信息需要內(nèi)存,因此在這樣的情況下可以向系統(tǒng)申請(qǐng)一塊內(nèi)存,然后寫(xiě)入要發(fā)送的信息,并把這這塊消息發(fā)送到別的任務(wù),任務(wù)收到消息并處理完后就可以把這塊內(nèi)存塊歸還系統(tǒng)。等待別的任務(wù)使用。以上文字描述的過(guò)程用圖來(lái)表達(dá)就是圖3所示。圖3動(dòng)態(tài)內(nèi)存分配應(yīng)用舉例4.2 代碼實(shí)現(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,申請(qǐng)內(nèi)存塊并向任務(wù)2發(fā)送消息:void TaskMem1(void*Pd)int *TaskMemPtr;/while(1) if(TaskMemPtr = OSMemApply(UsrMemPtr) != NULL)/申請(qǐng)內(nèi)存塊 *TaskMemPtr = Message;/申請(qǐng)成功就寫(xiě)進(jìn)要發(fā)送的消息 OSTaskMsgPost(UsrTaskPtr1,TaskMemPtr

14、,0);/發(fā)送消息到任務(wù)2 任務(wù)2,接收任務(wù)1發(fā)來(lái)的消息處理并釋放內(nèi)存塊:void TaskMem2(void*Pd)int *TaskMemPtr;/while(1)if(TaskMemPtr = OSTaskMsgPend() != NULL)/取任務(wù)1發(fā)送過(guò)來(lái)的消息UsrHandleMsg(TaskMemPtr);/取到消息就處理消息 OSMemRelease(UsrMemPtr,TaskMemPtr);/歸還內(nèi)存塊到系統(tǒng) 主函數(shù),啟動(dòng)系統(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();/進(jìn)入多任務(wù)環(huán)境 while(1);

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論