储存管理.docx
- 文档编号:11775819
- 上传时间:2023-04-01
- 格式:DOCX
- 页数:31
- 大小:197.86KB
储存管理.docx
《储存管理.docx》由会员分享,可在线阅读,更多相关《储存管理.docx(31页珍藏版)》请在冰豆网上搜索。
储存管理
第四章儲存管理
嵌入式系統與一般電腦系統中所使用的儲存管理(storagemanagement)有著明顯的差異。
在一般電腦系統中,因為有硬碟的支援,再加上記憶體容量的擴充性相當大,通常都使用硬碟做為儲存系統(storagesystem)中的後備儲存體(backupstorage)來儲存包括作業系統和應用程式在內的檔案,記憶體則用來儲存執行程式及所需資料。
在嵌入式系統中,因其所強調的是輕便性與可攜性,一般沒有硬碟的支援,且記憶體容量的擴充性相對而言相當有限。
因此,如何設計一個高效能的儲存管理,對有限的記憶體資源進行公平有效的管理,在嵌入式系統中就顯得更為重要。
在本章中,我們將對WindowsCE中,儲存管理採用的記憶體分配、回收、虛擬記憶體映射、調頁等機制一一作深入的探討。
4.1實體記憶體結構
在WindowsCE系統中,記憶體的實體結構大致可分為RAM和ROM二種記憶體。
RAM
RAM的全名為RandomAccessMemory。
在一般電腦系統中,所謂記憶體容量即指RAM的大小而言。
如前所述,RAM在一般電腦系統中,專用來儲存執行程式及所需資料。
在程式執行的流程中,作業系統先將程式從硬碟裡載入到RAM中,CPU即執行存放在RAM中的程式,程式執行時所需的heap和stack,也都分別位在RAM中不同的位址上。
在WindowsCE系統中,RAM被分為程式空間(programmemory)和物件空間(objectstore)。
程式空間和一般電腦系統中RAM的使用類似,用來儲存執行程式及所需資料。
物件空間則類似一般電腦系統中的硬碟,用來儲存應用程式及檔案。
物件空間中存放的資料可分為三大類:
(1)檔案系統(filesystem),
(2)註冊資訊(registry),(3)WindowsCE資料庫(WindowsCEdatabase)。
程式空間和物件空間的大小是可以調整的。
若是WindowsCE發現處理程序(process)的記憶體空間不敷使用的情況下,WindowsCE會要求使用者釋放一些物件空間的記憶體來滿足程式空間的需求。
圖4.1是WindowsCE3.0在CompaqiPAQH3850所提供的記憶體空間配置畫面,此系統中可使用之RAM大小為63.14MB,其中34.65MB為程式空間,剩餘的28.49MB則用做物件空間。
程式空間的使用部分為7.27MB,而物件空間的使用部分則為0.52MB。
圖4.1CompaqiPAQH3850記憶體空間配置程式
RAM記憶體既是電子裝置,其所儲存的資料則須靠電力來維持。
換言之,電力來源一但中斷,儲存在RAM中的資料就消失了。
一般電腦系統中電力的供應來自外接電源,一但停電或是關機,電力供應中斷,RAM中儲存的執行程式及資料馬上消失。
至於筆記型電腦,其電力雖靠電池提供,但在關機狀態時,電池的電力供應是完全切斷的,因此儲存在RAM中的程式及資料,也會隨著關機而消失。
在WindowsCE系統中,RAM既被用來當作物件空間使用,電力的來源則靠電池提供,因此有效的使用有限的電力來維持RAM中所儲存的資料,則顯的更為重要。
WindowsCE系統的電源管理機制,即使在關機狀態時,仍舊有少量的電力供應RAM,以保留儲存在其中的資料。
只有在電池電力完全耗盡時,RAM中儲存的資料才會消失,而當系統重新獲得電力時,一切的資料與軟體都必需新載入。
市場上常見的CompaqiPAQ,當電池電力完全耗盡而重獲電力啟動後,使用者都必需重新輸入使用者資料,或是做一些校正的動作,就是一個明顯的例子。
ROM
ROM的全名為ReadOnlyMemory,又稱唯讀記憶體,故名思義,ROM中儲存的內容只能被讀取,而不能有寫入或更改的動作。
因為ROM不需電力的供應,仍然能保有儲存的內容,因此在嵌入式系統中,常被用來儲存作業系統,或是重要且不會更改的資料(如開機時需要的資料)。
在WindowsCE系統中,ROM儲存了包含作業系統在內相關的檔案。
系統程式執行則分為兩種模式:
RAM執行模式和ROM執行模式。
一般的系統程式執行採用RAM執行模式,作業系統會先把程式從ROM中取出,載入RAM中執行。
RAM執行模式因為牽涉到程式拷貝,有執行效率差及佔用RAM記憶體空間等缺點。
為此,WindowsCE提供XIP (ExecuteinPlace),也就是ROM執行模式,使得儲存在ROM中的系統程式,可以在指定的ROM位址中直接執行,而不用載入RAM中。
ROM的唯讀特性,使得更改其中內容這個動作,變的相當複雜。
舉例來說,若CompaqiPAQ只具有ROM作為作業系統的儲存工具,要升級一個CompaqiPAQ的作業系統,必需先有一顆新的ROM,利用特殊的設備將新的作業系統寫入,再用此ROM更換iPAQ中原有的ROM。
因為此特殊的設備甚為昂貴且不易取得,近年來便有FlashROM的產生。
FlashROM不僅保有原本ROM在電源消失後仍保有資料的好處,並且擁有RAM可寫入的特性,因此我們可以用它來保存作業系統,並利用軟體的方式來升級或更換作業系統。
CompaqiPAQH3600系統的PDA中所配有的ROM即是FlashROM。
使用者可以到Compaq或相關網站取得FlashROM寫入程式,並利用此程式來進行作業系統升級或更換(例如WindowsCELinux)的動作,而完全無需更換硬體。
4.2虛擬記憶體管理
WindowsCE系統的記憶體管理是建構在虛擬記憶體機制上。
在本節中,我們將介紹WindowsCE的虛擬記憶體機制、其中所使用的分頁機制、及提供多工作業的slot結構。
虛擬記憶體
電腦程式的運算大多是在迴圈(loop)結構內完成。
迴圈執行時所表現出來的位址侷限性(addresslocality)及空間侷限性(spacelocality),使得執行程式所需的實體記憶體空間遠比程式碼本身小,且同一時段內,只需載入一小部分的資料結構即可。
為了程式設計師撰寫程式方便,作業系統一般都將程式記憶體空間與實體記憶體空間分開。
這裡所稱的程式記憶體即是虛擬記憶體。
實體記憶體內所使用的位址稱為實體位址(physicaladdress),而虛擬記憶體內所使用的位址稱為虛擬位址(virtualaddress)。
虛擬記憶體的大小可以遠大於實體記憶體的大小。
在一般作業系統中,虛擬記憶體的大小決定於所使用的位址位元長度。
舉例而言,在一個32-bit位址長度的作業系統,其虛擬記憶體的大小為4GB(232Bytes),而系統所配備的實體記憶體可能只有32MB或64MB。
虛擬記憶體的設計,使得程式設計師撰寫程式時,不必顧慮到系統的實體記憶體的大小。
另外,虛擬記憶體允許不同程式共用相同的檔案和程式碼。
圖4.2為虛擬記憶體的概述圖,其中說明了虛擬位址和實體位址的轉換。
圖4.2 虛擬記憶體與實體記憶轉換概述圖
分頁機制
WindowsCE系統所使用的位址位元長度為32-bit。
換言之,其虛擬記憶體的大小為4GB(232Bytes)。
WindowsCE將這4GB虛擬位址空間分為低位址2GB及高位址2GB。
應用程式使用的位址空間為低位址2GB,高位址2GB專供WindowsCE核心模組使用。
WindowsCE作業系統使用KDataStruct資料結構來存放低位址2GB內的資料。
程式碼4.1列出KDataStruct整個資料結構。
程式碼4.1KDataStruct資料結構
structKDataStruct{
LPDWORDlpvTls;/*0x000Currentthreadlocalstoragepointer*/
HANDLEahSys[NUM_SYS_HANDLES];/*0x004Ifthismoves,changekapi.h*/
charbResched;/*0x084rescheduleflag*/
charcNest;/*0x085kernelexceptionnesting*/
charbPowerOff;/*0x086TRUEduring"poweroff"processing*/
charbProfileOn;/*0x087TRUEifprofilingenabled*/
ulongptDesc;/*0x088PageTableDescriptor*/
ulongrsvd2;/*0x08cwasDiffMSec*/
PPROCESSpCurPrc;/*0x090ptrtocurrentPROCESSstruct*/
PTHREADpCurThd;/*0x094ptrtocurrentTHREADstruct*/
DWORDdwKCRes;/*0x098*/
ulonghandleBase;/*0x09chandletablebaseaddress*/
PSECTIONaSections[64];/*0x0a0sectiontableforvirutalmemory*/
LPEVENTalpeIntrEvents[SYSINTR_MAX_DEVICES];/*0x1a0*/
LPVOIDalpvIntrData[SYSINTR_MAX_DEVICES];/*0x220*/
ulongpAPIReturn;/*0x2a0directAPIreturnaddressforkernelmode*/
uchar*pMap;/*0x2a4ptrtoMemoryMaparray*/
DWORDdwInDebugger;/*0x2a8!
0whenindebugger*/
PTHREADpCurFPUOwner;/*0x2accurrentFPUowner*/
PPROCESSpCpuASIDPrc;/*0x2b0currentASIDproc*/
longalPad[19];/*0x2b4-padding*/
DWORDaInfo[32];/*0x300-misc.kernelinfo*/
/*0x380-interlockedapicode*/
/*0x400-end*/
};/*KDataStruct*/
在KDataStruct資料結構中,又利用PSECTIONaSections[64]將低位址2GB分割成64個32MB大小的空間,稱之為Section。
一個Section再被分割成512個64KB大小的空間,稱之為MemBlock,如程式碼4.2所示。
一個MemBlock再被分割成數個頁(Page)。
頁的大小(PAGE_SIZE)在不同的系統中略有不同。
ARM4處理器的PAGE_SIZE為4096,ARM920的PAGE_SIZE為1024,MIPS及x86處理器的PAGE_SIZE則為4096。
若以PAGE_SIZE=4096,一個MemBlock可被分割成16個頁。
程式碼4.3列出MemBlock整個資料結構,其中aPages[PAGES_PER_BLOCK]欄位紀錄虛擬記憶體中每一個頁所對應到的實體記憶體位址。
程式碼4.2BLOCK、SECTION資料結構
#defineBLOCK_MASK0x1FF
typedefMEMBLOCK*SECTION[BLOCK_MASK+1];
//每一個SECTION指向512個BLOCK
typedefSECTION*PSECTION;
程式碼4.3MemBlock資料結構
#definePAGE_SIZE4096/*pagesize*/
#definePAGES_PER_BLOCK(0x10000/PAGE_SIZE)
structMemBlock{
ACCESSLOCKalk;/*00:
keycodeforthissetofpages*/
ucharcUses;/*04:
#ofpagetableentriessharingthisleaf*/
ucharflags;/*05:
mappingflags*/
shortixBase;/*06:
firstblockinregion*/
shorthPf;/*08:
handletopager*/
shortcLocks;/*0a:
lockcount*/
ulongaPages[PAGES_PER_BLOCK];
};/*MemBlock*/
我們以CEPC為例子來說明虛擬記憶體到實體記憶體的對映關係。
CEPC是將WindowsCE作業系統在個人電腦上執行。
在這個以x86處理器的平台上,虛擬記憶體到實體記憶體對映,可以用圖4.5及圖4.6來解釋。
應用程式執行時所送出的位址,即虛擬位址,長為32個位元(編號第31-0個位元)。
一個虛擬位址可以如圖4.5所示切割成五大區段:
●第一區段只有一個位元,即第31個位元,因應用程式只能使用低位址2GB,第31個位元一定是0。
●第二區段有六個位元,即第30-25個位元,紀錄此位址所屬的Section號碼。
●第三區段有九個位元,即第24-16個位元,紀錄此位址所屬的MemBlock號碼。
●第四區段有四個位元,即第15-12個位元,紀錄此位址所屬的頁號碼。
●第五區段有十二個位元,即第11-0個位元,紀錄此位址在所對映的實體記憶體頁內的相對位址。
3130 24 15 110
0
Sectionnumber
6位元
Blocknumber
9位元
Pagenumber
4位元
Offset
12位元
圖4.5x86處理器虛擬位址的劃分
WindowsCE作業系統在收到一個虛擬位址後,即根據圖4.5所示將此位址切割,並根據每區段內的值,從程式碼4.1的KDataStruct開始,依Section、MemBlock、頁的順序,來找到此虛擬位址所對映到的實體記憶體位址。
整個對映的流程圖示在圖4.6中。
圖4.6虛擬記憶體與實體記憶體的對映關係
WindowsCE從低位址的2GB起始位址開始的連續位址,劃分出33個32MB的記憶體空間,稱之為”slot”,等同於前述的前33個SECTION,當處理程序要執行前,WindowsCE將處理程序載入至slot中執行,特別需要注意的是,slot0保留給目前正在執行的處理程序使用,其餘的slot則留給非正在執行的處理程序使用。
因此,WindowsCE系統中,最多只能有32個處理程序同時進行。
圖4.3是記憶體的配置情形,稍後將介紹memorymapping的細節及其它的記憶體空間。
2GB
slot0
slot1
slot2
…
slot32
ForMemoryMapping
為作業系統保留的記憶體空間
圖4.3
於WindowsCEPlatformBuilder使用mi指令可獲得CEPC記憶體資訊,圖4.4為mi指令的使用方式及結果。
圖4.4mi指令的使用方式及結果
程式碼4.4為mi指令執行後的片段結果:
程式碼4.4CEPC記憶體資訊
WindowsCEKernelMemoryUsageTool0.2
Pagesize=4096,4958totalpages,4544freepages.4517MinFreepages(1806336MaxUsedbytes)
90pagesusedbykernel,0pagesheldbykernel,414pagesconsumed.
MemoryusageforProcess81791560:
'NK.EXE'pid0
SECURESECTION:
Slotbasec2000000Sectionptr81749d00//為系統保留的
Pagesummary:
code=0(0)datar/o=0r/w=2stack=3reserved=315//SECURESECTION
ROMDLLCODESECTION:
Slotbase02000000Sectionptr83ffc000//Slot1的使用情形
Pagesummary:
code=508(0)datar/o=68r/w=1stack=0reserved=2672
MemoryusageforProcess81791614:
'filesys.exe'pid1//Slot2被filesys.exe
Slotbase04000000Sectionptr83ff1000//使用情形
Pagesummary:
code=31(0)datar/o=1r/w=20stack=5reserved=334
MemoryusageforProcess817916c8:
'shell.exe'pid2//Slot3被shell.exe
Slotbase06000000Sectionptr83fcf000//使用情形
Pagesummary:
code=10(0)datar/o=0r/w=7stack=2reserved=330
MemoryusageforProcess8179177c:
'device.exe'pid3//Slot4被
Slotbase08000000Sectionptr83fc9000//device.exe使用
Pagesummary:
code=6
(1)datar/o=0r/w=113stack=40reserved=958//情形
SLOT0
由於在WindowsCE系統中,許多處理程序都會擁有相同的DLLs(dynamiclinklibraries)檔,若是每一個處理程序都在實體記憶體找出一塊空間放置相同的DLLs檔,由於DLLs的程式碼是唯讀性且不可變更的,若是重覆放置將會是實體記憶體的一大浪費,因此WindowsCE系統將不同處理程序的相同DLLs對應到同樣的實體記憶體位址,如此減少了記憶體的浪費,雖然DLLs檔是相同的,每個處理程序仍舊必需擁有一些自己的DLLs變數資料,因為DLLs變數資料並不是相同的。
此時,產生了一個問題,DLLs檔如何知道目前是哪一個處理程序在呼叫它?
WindowsCE為了解決這個問題,規定DLLs檔只能對slot0的變數做變動,也就是目前正在執行的處理程序,這也是slot0存在的原因。
CurrentProcess
圖4.5DLL檔對應關係圖:
slo1和slot2相同的DLLs檔,對應至相同的實體記憶體
DoVirtualAlloc()函式
WindowsCE系統配置記憶體有兩種方式:
保留(MEM_RESERVE)和提交(MEM_COMMIT)。
這兩種方式的差別在於保留只會保留虛擬頁給處理程序,而提交不僅給予處理程序虛擬頁,更會於實體記憶體取得對應頁。
DoVirtualAlloc()函式可以根據使用者對記憶體的要求,如保留、提交,執行保留虛擬記憶體或是抓取實體頁並填入頁表(pagetable),由於原始碼非常複雜,本章節提供流程圖(圖4.6)供讀者參考,其原始碼的位置在於:
WINCEROOT\PRIVATE\WINCEOS\COREOS\NK\KERNEL\virtmem.c有興趣的讀者可以查閱。
合法性檢查
報錯
不通過
在系統堆疊中分配頁表
(MEMBLOCK)空間
通過
進入臨界區
將當前處理程序的存取
控制訊息填入頁表
地址?
否
已在分配段
是否為安全地址?
頁面是否需要映射到實體地址?
是
分配系統保留段
是
否,在堆疊增長時
自動提交
是
是否需要提交?
將頁表項
標記為保留
合法性檢查
抓取足夠的實體頁
否
按給定的方式掃描可用記憶體區尋找滿足條件的可用記憶體塊
地址是否已經保留?
否
成功?
是
報錯退出
是否找到
是
是
對齊地址到64K邊界
否
將得到的實體
頁框填入頁表
檢查所有塊都已保留
回傳錯誤退出
圖4.6虛擬位址分配流程
4.3實體記憶體管理
可用記憶體鏈結串列
可用記憶體串列用以記錄目前系統中尚可使用的記憶體,可由LogPtr->pKList找到串列。
可用記憶體串列採用簡單的雙向鏈結串列形式。
所以鏈結串列的管理極為簡單。
程式碼4.5是插入可用記憶體鏈結串列的程式碼:
程式碼4.5插入可用記憶體鏈結串列程式碼
void
LinkPhysPage(
LPBYTEpMem
)
{
KCALLPROFON(32);
*(LPBYTE*)((DWORD)pMem+0x20000000)=LogPtr->pKList;
*(LPBYTE*)((DWORD)pMem+0x20000004)=0;
if(LogPtr->pKList)
*(LPBYTE*)((DWORD)LogPtr->pKList+0x20000004)=pMem;
LogPtr->pKList=pMem;
PageFreeCount++;
LogPhysicalPages(PageFreeCount);
KCALLPROFOFF(32);
}
其中KCALLPROFON()和KCALLPROFOFF()分別是開啟、關閉與加入可用記憶體串列相關的系統記錄。
取得實體記憶體
圖4.6中,取得實體記憶體是利用GetHeldPage函式呼叫GrabFirstPhysPage函式取得實體頁,程式碼4.6是GetHeldPage函式,程式碼4.7是GrabFirstPhysPage()函式部分程式碼。
程式碼4.6GetHeldPage函式
PHYSICAL_ADDRESSGetHeldPage(void)
{
PHYSICAL_ADDRESSpaRet;
LPBYTEpMem;
if(pMem=(LPBYTE)KCall((PKFN)GrabFirstPhysPage,1)){//GrabFirstPhysPage取得
PageFreeCount++;//sincewealreadyreservedit//實體頁回傳
LogPhysicalPages(PageFreeCount);
paRet=GetPFN(pMem);
}else
paRet=0;
DEBUGMSG(ZONE_PHYSMEM,(TEXT("GetHeldPage:
Returning%8.8lx\r\n"),paRet));
retur
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 储存 管理