WinCE5.0 內存管理總結 (store)

引自:http://herbertbt.blog.163.com/blog/static/572665822008111311336447/

這個是星期1組內討論後自己的一點心得和總結。趕緊紀錄下來,不然以後都忘記了。

內存管理

X86:        physical address, linear address, logical address.

地址形式:    XXXX XXXX            XXXX XXXX      CS:XXXX XXXX

 

GDT,LDT.

 

ARM: PA. VA

 

 

4G的虛擬空間:

 WinCE5.0 內存管理總結 (store) - herbertbt - herbertbt的博客

 關於MMU:

       mmu還沒有被enable之前,CPU只好直接訪問物理內存。在mmu起來之後,所有CPU訪問的地址都是虛擬地址(VAWinCEpaging,但沒有page file.

 

Kernel Mode

       CE下的Kernel Mode和桌面版的windows中的內核態意思不同。Kernel Space是指帶有Kmode特權的線程可以訪問的上2g空間。只是給線程一個可以訪問2g的權限而已。特權函數,English name 應該是trust apis,如SetKmode。在OAL層的OEMCertifyModule函數中給予驗證。擁有KMode但還是不能訪問其他進程的內部數據。

 

靜態映射虛擬地址和動態映射虛擬地址

       靜態映射虛擬地址:虛擬地址到物理地址的映射從不改變。

       動態映射虛擬地址:虛擬地址到物理地址的映射發生改變(雖然有時並不需要)。

 

1 2g空間:0x8000 0000----0xFFFF FFFF


靜態映射,對於
arm x86需要由OEM商寫一個OEMAddressTable,來靜態映射物理資源;對於MIPSSHx,映射在mmu中被固定了。

UnCached 512mCached 512m 中的內容是一模一樣的,唯一的區別就在於在讀寫的時候到底經不經過CPUcache。當然對於某些設備,如DMA,需要立即取值的,當然不能通過cached 512來訪問。然後

 

OAL層處理:TRUST,RUM,UN TRUST.

Privilege function: SetKernelMode , SetProPermission, MapPtrToPtr……

 

 

2 2g空間:0x0000 0000----0x7FFF FFFF

WinCE5.0 內存管理總結 (store) - herbertbt - herbertbt的博客 

 64*32m = 0x8000 0000

 WinCE5.0 內存管理總結 (store) - herbertbt - herbertbt的博客

 Slot 0: 正在運行的程序

最多可以運行32個進程。每個進程只有32m的空間,所以最多可以運行32m/64k = 512個線程。但這只是理論值,還有一些其他的因素,不可能運行到512個線程的。

WinCE5.0 內存管理總結 (store) - herbertbt - herbertbt的博客 

 上面就是一張很精彩的圖了。先從下面往上面說:

基本上slot 0slot 1是在一起的。

WinCE64k是個很重要的數字:reserved是以64k爲邊界的(commit1頁,4k);一個stack也是以64k爲邊界的;所有的虛擬地址分配是64k邊界的。所以這裏先有一個64kGuard Section,其中還可以用作一些信息的存儲。這裏是reserved,但沒有commit,即頁表裏佔有一個entry,但實際並沒有佔用物理資源。

然後就是進程exe的數據段,代碼段啦。再往上走就是默認的stackheap。如果再有棧的話就繼續累積在上面。

我們再從頂部往下走:最上面的是ROM裏的DLLS(這裏的dll就是XIP DLL了,所以不需要加載到內存裏)中的一些讀寫數據,是不連續的,零星地。還有一些非xip dll就只能加載到ram裏,所以是ram dll。這些 DLL的代碼和數據就在這邊了。它們是往下走的。

往上走的和往下走的碰在一起就內存用完了。

 

Resources DLLs and Memory-Mapped files可以被所有線程所獲得。

 

XIP的條件是:要能按字節讀取的ROM.PBbib文件中,有modulesfiles2個模式。2者的區別就在於files可以被壓縮。所以dll一但在files裏被壓縮了,那也無法xip了。

 

使用函數VirtualCopy來映射設備的i/o,ram

需要連續分配物理內存時使用AllocPhysMem

 

C--------> .lib ------->.Exe/Dll------>Bin

 BUILD  SYSGEN   1 BUILDREL(TARGET目錄下的東西都複製到_FLATRELEASEDIR下面)

SOURCES Makefile        2 MAKEIMG(*.bib,*.reg,*.dat,*.db)

DIRS

 

SYSGEN –P XXX YYY

C:/WINCE500/PUBLIC/XXX/CESYSGEN/Makefile

                                   /XXX/OAK/TARGET

其中,XXX就是各個小組的名字。SYSGEN2個參數就是一個是小組名,一個傳到Makefile中。

 

 

Type

Description

RAMIMAGE

OS Image(Read + Execute ONLY)

Must start on a 64k boundary!

RAM

RAM for OS to partiton

RESERVED

Reserved region OS won’t use

NANDIMAGE

Used with BINFS to mark memory region for paging files form NAND storage devices

FIXUPVAR

Used to set the value of a variable during image build time

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章