Windows CE操作系统内存管理总结

【原创】WindowsCE操作系统内存管理总结

0 概述

Windows CE是一个32位的嵌入式操作系统,因此运行在Windows CE上的应用程序具有32位的寻址能力。

内存管理:


1 物理内存

RAM为操作系统和应用程序提供运行和缓冲空间。

易失性存储器根据工作原理不同分为两种:静态读写存储器SRAM,SRAM基于触发器原理;动态读写寄存器DRAM,DRAM是基于分布电容存储器原理。

DRAM 是动态存储器(Dynamic RAM)的缩写,SDRAM 是英文Synchronous DRAM 的缩写,译成中文就是同步动态存储器。从技术角度上讲,同步动态存储器(SDRAM)是在现有的标准

动态存储器中加入同步控制逻辑(一个状态机),利用一个单一的系统时钟同步所有的地址数

据和控制信号。使用 SDRAM 不但能提高系统表现,还能简化设计、提供高速的数据传输。在功能上,它类似常规的 DRAM,且也需时钟进行刷新。可以说,SDRAM 是一种改善了结构的增强型DRAM。

ROM通常用来存储程序,其内容可断电永久保存,它通常包括操作系统映像本身和组成操作系统的一些其他文件。

ROM,只读存储器。可编程的ROM有:

紫外线可擦除型ROM:EPROM,需要用紫外线擦出已写入的程序,必须脱机固化,不能在线改写

电可擦除型ROM:E2PROM,被广泛使用

Flash与ROM相比最大的优点是可擦写,这样它既可以用来存储操作系统本身,也可以用来存储后来安装的程序。从结构上来说,Flash主要有AND,NAND,NOR及DiNOR等。

NAND与NOR对比:

 

Windows CE最大支持512MB的物理内存。

2 虚拟内存

为什么要使用虚拟内存?

ROM DLL vs RAM DLL?

 

Windows  XP的每个进程独享4GB虚拟地址空间,而Windows  CE中所有的进程共享一个4GB的虚拟地址空间。

Windows CE 操作系统支持两种页大小:1KB和4KB。在Windows CE中,与桌面 Windows一样,虚拟内存的申请分为保留(reserve)和提交(commit)两个过程,虚拟地址空间的保留是以64KB为边界的,也就是说,任何一次虚拟内存申请都会返回一个64KB的整数倍的地址,但是把虚拟内存提交到物理内存是以页为粒度的

管理虚拟内存的硬件是内存管理单元(MMU,Memory  Management Unit)。MMU负责把虚拟地址应为到物理地址,并且提供一定的内存保护。


特点:

(1)每个 Slot 占 32MB,Slot 的编号从 0开始

(2)Slot 0 到 Slot 32 对应的虚拟地址是0x0000 0000到 0x41FF FFFF,它们用于存放进程的虚拟地址空间。Slot 0与Slot 1基本是在一起的。其中Slot 0用于映射当前在处理器上执行的进程。Slot1由 XIP的DLL代码使用。Slot 2到Slot 32对应Windows CE中每个进程的32MB虚拟地址空间。

(3)Slot 33到Slot 63对应的虚拟地址空间是0x42000000到0x7FFF FFFF。这块虚拟内存是由所有进程共享的,由于每个进程只有32MB 的虚拟地址空间,如果应用程序希望使用更多的虚拟内存,就可以在这个范围内申请。这个范围包括对象存储和内存映射文件。此范围内的最后一个Slot从0x7E00 0000到0x 7FFFF FFFF,也就是Slot 63,用来存放纯资源DLL。

(4)虚拟地址0x80000000到0x9FFF FFFF用来静态映射所有的物理地址,也就是说Windows CE会把所有的物理内存一比一的映射到这段虚拟地址上。一共512MB。

(5)虚拟地址 0xA0000000到 0xBFFF FFFF会重复映射所有的物理内存。在驱动程序中我们如果需要直接访问设备I/O或寄存器【即不使用缓存】,通常使用0xA000 0000物理地址。

(6)物理内存被映射到内核空间之后,Windows CE内核中访问物理内存就变得相对简单。如果需要访问某个物理内存地址,只需要把该物理内存地址加上0x8000 0000或者0xA000 0000就可以了。当然这种简便的方式只能由Windows CE内核使用。

(7)Slot97是 Windows CE的核心进程NK.exe专用的。

(8)从0xE000 0000到0xFFFF FFFF这一段最高的地址是内核使用的地址空间。对于不同的处理器体系结构这里保存着不同的东西。通常会放置一些供虚拟内存用的页表、中断向量表等内核使用的数据结构

 

进程申请虚拟内存是从低地址往高地址增长的,DLL 代码和数据的增长是从高地址往低地址增长的。

虚拟内存的申请是以64KB为边界的,这意味着每个DLL都要占用至少64KB虚拟地址空间。也就是说理论上每个进程只能加载512个DLL。

3 逻辑内存

逻辑内存分为堆和栈两种。

堆是进程中一块连续的虚拟内存空间。应用程序可以在堆上动态的进行内存申请和释放。申请堆上的内存每次可以申请4个或者8个字节。在 Windows CE 中堆是通过句柄来访问的。所有的进程都有一个默认的堆,可以用函数GetProcessHeap()来得到默认堆。当进程创建的时候默认堆会被一起创建,并且为之保留192KB大小的虚拟内存。如果进程需要更多的内存,Windows CE会用VirtualAlloc()函数来为默认堆申请更多的内存。

栈是进程中另外一个重要的数据结构,函数调用的时候参数传递、函数中的局部变量都占用栈上的内存,函数中的局部变量会在函数调用结束之后自动释放。栈是从高地址到低地址增长的。Windows CE 为每个线程分配了60KB 的栈,并且把栈顶的2KB拿来作为检测是否栈已经满了,因此每个线程用户可以用的栈为58KB。

4 CRuntime Library

在C Runtime Library函数中,提供给了我们一系列内存管理函数,例如malloc/free,new/delete 等。在Win32的CRT库中,使用CRT库函数申请内存与使用LocalAlloc()在堆上申请固定内存是一样的。CRT库也使用进程默认的堆,这与LocalAlloc()等函数也是一致的。从操作系统角度来看,malloc和new都返回默认堆上的一个指针,堆管理器并不对CRT库函数和 LocalAlloc()函数申请的内存进行区分,而是把他们一视同仁。

5 使用虚拟内存

除了系统启动时MMU被启用之前的一小段代码之外,Windows CE内核和应用程序都是工作在虚拟内存模式下的。Windows CE提供了如下几个内存访问函数来访问虚拟内存:

VirtualAlloc() 申请虚拟内存

VirtualFree() 释放虚拟内存

VirtualProtect() 改变虚拟内存的访问权限

VirtualQuery() 查询虚拟内存页的属性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值