这个是星期1组内讨论后自己的一点心得和总结。赶紧纪录下来,不然以后都忘记了。
内存管理
X86: physical address, linear address, logical address.
地址形式: XXXX XXXX XXXX XXXX CS:XXXX XXXX
GDT,LDT.
ARM: PA. VA
4G的虚拟空间:
在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
最多可以运行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 |