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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值