引自: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的虛擬空間:
關於MMU:
在mmu還沒有被enable之前,CPU只好直接訪問物理內存。在mmu起來之後,所有CPU訪問的地址都是虛擬地址(VA)。WinCE有paging,但沒有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,來靜態映射物理資源;對於MIPS和SHx,映射在mmu中被固定了。
UnCached 512m和Cached 512m 中的內容是一模一樣的,唯一的區別就在於在讀寫的時候到底經不經過CPU的cache。當然對於某些設備,如DMA,需要立即取值的,當然不能通過cached 512來訪問。然後
OAL層處理:TRUST,RUM,UN TRUST.
Privilege function: SetKernelMode , SetProPermission, MapPtrToPtr……
2 下2g空間:0x0000 0000----0x7FFF FFFF
64*32m = 0x8000 0000
Slot 0: 正在運行的程序
最多可以運行32個進程。每個進程只有32m的空間,所以最多可以運行32m/64k = 512個線程。但這只是理論值,還有一些其他的因素,不可能運行到512個線程的。
上面就是一張很精彩的圖了。先從下面往上面說:
基本上slot 0和slot 1是在一起的。
WinCE下64k是個很重要的數字:reserved是以64k爲邊界的(commit是1頁,4k);一個stack也是以64k爲邊界的;所有的虛擬地址分配是64k邊界的。所以這裏先有一個64k的Guard Section,其中還可以用作一些信息的存儲。這裏是reserved,但沒有commit,即頁表裏佔有一個entry,但實際並沒有佔用物理資源。
然後就是進程exe的數據段,代碼段啦。再往上走就是默認的stack和heap。如果再有棧的話就繼續累積在上面。
我們再從頂部往下走:最上面的是ROM裏的DLLS(這裏的dll就是XIP DLL了,所以不需要加載到內存裏)中的一些讀寫數據,是不連續的,零星地。還有一些非xip dll就只能加載到ram裏,所以是ram dll。這些 DLL的代碼和數據就在這邊了。它們是往下走的。
往上走的和往下走的碰在一起就內存用完了。
Resources DLLs and Memory-Mapped files可以被所有線程所獲得。
XIP的條件是:要能按字節讀取的ROM.在PB的bib文件中,有modules和files2個模式。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就是各個小組的名字。SYSGEN的2個參數就是一個是小組名,一個傳到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 |