Download presentation
Presentation is loading. Please wait.
1
嵌入式操作系统原理 ——Windows CE 第四章 内存管理
2
内存管理 物理内存 虚拟内存 内存分配方式 管理低内存状态
3
1. 物理内存 ROM RAM
4
1.1 ROM 存储操作系统及与系统绑定的应用程序 ROM中程序的两种执行方式
本地执行(XIP) 非本地执行 config.bib文件的MEMORY部分指出了ROM和RAM在虚拟地址空间中的位置 本地执行是指程序直接在ROM中执行,而不需加载到RAM中。优点:不需加载时间并且节省内存 缺点:执行速度慢,不适合时应用 非本地执行是指程序首先要加载到RAM中然后再执行。
5
BIB文件和ROM MEMORY部分 区域名称 区域字节数 起始地址 区域类型 BIB文件
在Platform Builderd的工作空间的ParemeterView窗口中包含了BIB文件,BIB文件的内容在右侧编辑区域中显示。在memory部分,显示了内存区域的相关信息。 区域名称/起始地址/区域字节数/区域类型(RAMIMAGE(表示ROM)和RAM)
6
1.2 RAM 程序内存 对象存储 文件系统 系统注册表 Windows CE数据库 对象存储的功能: 管理堆栈和内存堆 压缩和解压文件
基于ROM的应用程序和基于RAM的数据间的无缝集成
7
相当于永久存储器,即使在系统关闭后其内容仍然保留
RAM 相当于永久存储器,即使在系统关闭后其内容仍然保留 对象存储 对象存储和程序内存的边界可以移动 用户可使用System Control panel应用程序来移动边界 程序内存 相当于PC上的RAM,用于程序运行
8
2. 虚拟内存 虚拟内存基础 分页内存系统 虚拟内存术语 Windows CE的虚拟地址空间 和Windows XP的比较
内核空间 用户空间 和Windows XP的比较 在Platform Builder中查看关于内存的信息
9
2.1 虚拟内存基础 当MMU (Memory Management Unit)可用时,虚拟地址是CPU引用的任何地址
虚拟地址必须映射到实际的物理地址来识别物理资源,如ROM、RAM、Flash、CPU寄存器、片上系统原件、总线映射原件等 CPU通常不直接存取物理地址,除了MMU尚未使能的情况下
10
2.2 分页虚拟内存系统 微处理器管理的最小内存单元是“页”,当应用程序访问页面时,微处理器把页面的虚拟地址转化成物理资源中的物理地址。
Windows CE.NET实现了一个分页虚拟内存系统,根据微处理器的不同,分页为1KB或4KB的大小
11
2.3 虚拟内存术语 静态映射虚拟地址 虚拟-物理映射从不改变 动态映射虚拟地址 虚拟-物理映射可以改变
12
2.4 虚拟地址空间 虚拟内存管理 Windows CE .NET 提供了一个4GB(32位)的虚拟地址空间 内核地址空间 (2GB)
32位虚拟地址空间 虚拟内存管理 Windows CE .NET 提供了一个4GB(32位)的虚拟地址空间 大多低2GB的虚拟地址都是动态映射,一些高2GB的虚拟地址是动态映射 0xFFFF FFFF 内核地址空间 (2GB) 0x 0x7FFF FFFF 用户地址空间 (2GB) 0x
13
内核地址空间 最大512MB 的物理资源可以映射到主要的静态映射区域 0xFFFF FFFF Kernel Addresses: KPAGE
Trap area,others Statically mapped virtual address: OEM additional addresses: CACHED Slot97:NK.exe(Secure slot) addresses: UNCACHED Unused 0x 0xA 0xC 0xC 0xC 0xE 0xFFFF FFFF
14
物理内存和内核虚拟地址的映射
15
用户地址空间 0x7FFF FFFF Slot63 分成了64个槽 Slot62 Slot32 Slot30 前33个槽对应33个进程
每个槽32MB 0x Slot0 0x
16
Slot63:Resource Mappings
用户地址空间 Slot33-62 对象存储&内存映射文件 Slot1:XIP DLLs Slot0:当前进程 0x 0x7FFF FFFF 0x Slot2-32 进程 Slot63:Resource Mappings 0x 所有线程均可存取DLL资源 对象存储受保护 所有的线程均可存取内存映射文件 同时可运行32个进程 当前进程的拷贝
17
进程槽 被分成512个大小为64KB的块 根据CPU的不同,每个块被分成1KB或4KB的页面,这些页面映射到物理内存 页面的三种状态 空闲
保留 提交
18
应用程序的虚拟地址空间 DLL空间 (对所有应用程序持续可用) 应用程序空间 (拷贝到slot0) COREDELL.DLL
0x03FF FFFF COREDELL.DLL Other XIP DLLs XIP DLL空间 基于RAM的DLLs 可用虚拟地址空间 堆栈(保留空间) 资源 堆(保留空间) 读写数据 只读数据 代码 保留 DLL空间 (对所有应用程序持续可用) 0x 从对象存储区加载的 DLL 从 ROM 解压缩的 DLL 从外部文件系统加载的 DLL 应用程序空间 (拷贝到slot0) 0x 0x
19
2.5 和Windows XP的比较 Windows CE Windows XP 0xFFFF FFFF 0xFFFF FFFF
20
2.6 在Platform Builder中查看关于内存的信息
MI FULL 命令 页面大小 4KB 进程槽的 内存分配 情况
21
在Platform Builder中查看关于内存的信息(续)
Modules and Symbols窗口 显示所有加载模块(DLL文件和EXE文件)的地址范围 对EXE文件数据和代码包含在同一地址范围内 对DLL文件,代码和数据是分开的,所以在Slot0有重定位数据地址
22
在Platform Builder中查看关于内存的信息(续)
进程窗口 进程地址指出了其对应的进程槽
23
在Platform Builder中查看关于内存的信息(续)
ViewBin工具可以列出.BIN文件中包含的模块和文件 ROMHDR部分显示了一些全局值
24
3 内存分配方式 虚拟内存 堆 堆栈 静态数据 字符串资源 选择合适的内存类型
25
3.1 使用虚拟内存 虚拟内存API的形式:Virtualxxxxx() 用于分配大块的内存(通常是整数个页面) 其优点是不产生碎片
用户要确保有效使用虚拟内存 管理内存映射需要轻微的消耗
26
虚拟内存管理函数 函数 功能 VirtualAlloc 保留和提交虚拟内存 VirtualQuery 提供虚拟内存页的状态信息
VirtualProtect 改变提交页面的访问权限 VirtualFree 释放虚拟内存 VirtualCopy 绑定指定的物理内存地址范围到 静态映射虚拟地址
27
虚拟内存分配 VirtualAlloc函数分配内存的过程分为两个步骤 第一步:保留虚拟内存空间的区域 第二步:提交部分或整个区域
不会消耗任何 RAM;只是防止一部分虚拟地址空间被用于其他用途 保留的空间将圆整到64KB 第二步:提交部分或整个区域 指将实际物理内存映射到保留区域
28
虚拟内存分配 LPVOID VirtualAlloc( LPVOID lpAddress, //虚拟地址
DWORD dwSize, //区域大小 DWORD flAllocationType,//分配的类型 DWORD flProtect //访问保护 ); 虚拟地址:当使用此函数来提交之前保留的也内存块时,用虚拟地址来识别内存块。当此参数为null时,系统则决定在何处分配内存区域,并将其圆整到64KB边界。 区域大小:以字节为单位,但系统会圆整到下一个页面的边界。 分配的类型:下页讲
29
在第一次访问块中的每个页面时,该页面仍由系统自动提交
分配的类型 值 说明 MEM_COMMIT 分配程序使用的内存 MEM_RESERVE 保留要随后提交的虚拟地址空间 MEM_AUTO_COMMIT 在第一次访问块中的每个页面时,该页面仍由系统自动提交 MEM_TOP_DOWN 将内存尽可能映射到最高的允许虚拟地址
30
访问保护标志 PAGE_READONLY--------------------区域只读
PAGE_READWRITE 可读写区域 PAGE_EXECUTE 区域包含可执行代码 PAGE_EXECUTE_READ 区域包含可执行代码, 且应用程序可读此区域 PAGE_EXECUTE_READWRITE 区域包含可执行代码, 且应用程序可读写此区域 PAGE_GUARD 首次访问此区域将导致 STATUS_GUARD_PAGE异常 PAGE_NOACCESS 任何访问均将导致访问冲突 PAGE_NOCACHE 微处理器不会高速缓存映射到 这个区域的RAM页面
31
限制因素 应用程序的32 MB 虚拟地址空间 分配时尽管是以字节为单位,但系统会圆整到下一个页面的边界提交
分配时保留的空间将圆整到64KB,而不是在分配函数中指定的大小 举例:假定要分配512个页面(4KB页面系统上) 代码段一:错误的方法 代码段二:正确的方法
32
代码段一 ? INT i; PVOID pMem[512];
for (i = 0; i < 512; i++) { pMem[i] = VirtualAlloc (0, PAGE_SIZE, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); } 第1次 第2次 第3次 在接下来的某一次就占满了32MB的空间而产生错误 ? 保留64KB 保留64KB 保留64KB …… 128KB 192KB
33
代码段二 512×4=64×8×4 …… 第一步:保留32个内存块 第二步:逐页提交 INT i;
PVOID pBase, pMem[512]; pBase = VirtualAlloc (0, 512*PAGE_SIZE, MEM_RESERVE, PAGE_READWRITE); for (i = 0; i < 512; i++) { pMem[i] = VirtualAlloc (pBase + (i * PAGE_SIZE), PAGE_SIZE, MEM_COMMIT, PAGE_READWRITE); } 第一步:保留32个内存块 第二步:逐页提交 512×4=64×8×4 ……
34
释放虚拟内存 BOOL VirtualFree( LPVOID lpAddress, //虚拟内存区域的指针
DWORD dwSize, //以字节为单位的区域大小 DWORD dwFreeType //操作标志 ); 操作标志 意义 MEM_DECOMMIT 区域被回收但保持保留状态 MEM_RELEASE 回收并释放该区域
35
改变访问权限 BOOL VirtualProtect( LPVOID lpAddress, //虚拟内存区域的指针
DWORD dwSize, //以字节为单位的区域大小 DWORD flNewProtect, //新的访问保护权限 PDWORD lpflOldProtect //区域第一页旧的访 //问保护权限 );
36
查询区域的信息 DWORD VirtualQuery( LPCVOID lpAddress, //查询区域的起始地址
PMEMORY_BASIC_INFORMATION lpBuffer, //信息结构 DWORD dwLength //信息结构的大小 );
37
PMEMORY_BASIC_INFORMATION 结构各字段意义
PVOID BaseAddress 传递到函数的地址 PVOID AllocationBase 区域的基地址 DWORD AllocationProtect 分配时区域的保护属性 DWORD RegionSize 从传递到函数的指针到一系列具有相同属性的页面的最后一个页面对字节数 DWORD State 区域中页面的状态 DWORD Protect 区域当前的保护标志 DWORD Type 区域的内存类型
38
区域的内存类型 MEM_PRIVATE MEM_MAPPED MEM_IMAGE 该区域包含应用程序的专用数据
该区域被映射到一个内存映像文件 MEM_IMAGE 该区域被映射到一个EXE或DLL模块
39
查询举例 A4000 假定页面大小1KB 使用指向初始化区域(地址为0x1000)中的4页的地址指针来调用VirtualQuery的返回值
BaseAddress=0xA1000 AllocationBase=0xA0000 AllocationProtect=PAGE_NOACCESS RegionSize= 0x1C00 ( 7页) State=MEM_COMMIT Protect=PAGE_READWRITE Type=MEM_PRIVATE 最初由VirtualAlloc保留的16个页面 A2C00 被提交的9个页面 A1000 A0800 A0000
40
3.2 使用堆 堆是Windows CE.NET为应用程序管理的保留的虚拟内存空间区域 应用程序的第一个堆由系统创建,称之为本地堆
默认情况下,Windows CE最初保留192KB用于本地堆,但仅当他们被分配时才会提交页面 应用程序可以创建一个单独的堆
41
使用本地堆 系统会自动查找未保留的内存,增加堆的大小以满足需求,增加的内存和之前的内存在物理空间上可能不连续
Windows CE只支持堆中固定块的分配,这样随着时间的推移就会产生碎片 当堆中的块被释放时,系统将查看是否整个页都已经被释放,如果是那个页将被回收
42
管理本地堆的函数 LocalAlloc-在本地堆分配指定字节大小的内存块 LocalLock-将内存句柄转换成内存指针
LocalSize-查询当前内存大小 LocalReAlloc-重新分配内存(调整大小或属性) LocalFree-释放堆中的内存
43
在本地堆中分配内存 可以在堆中分配4或8字节的内存单元(由CPU决定) 堆中分配大于192KB的单元仍然调用VirtulAlloc实现
使用完后注意要回收分配的内存
44
LMEM_FIXED和 LMEM_ZEROINIT的组合
LocalAlloc函数 HLOCAL LocalAlloc( UINT uFlags, //块的特征 UINT uBytes //要分配的字节 ); uFlags的值 意义 LMEM_FIXED 在堆中分配固定大小的块 LMEM_ZEROINIT 将内存的内容初始化为0 LPTR LMEM_FIXED和 LMEM_ZEROINIT的组合
45
使用单独的堆 HeapCreate 创建一个单独的堆 HeapAlloc 在堆中分配内存 HeapFree 释放单独的堆中的内存
HeapReAlloc 调整单独的堆中的内存大小 HeapSize 确定块的实际大小 HeapDestroy 破坏一个单独的堆 GetProcesssHeap 返回调用DLL的进程的本地堆的句柄
46
3.3 使用堆栈 堆栈是函数使用的变量的存储区域 每个线程都有一个堆栈,线程开始时由系统创建
线程堆栈的大小默认为64KB,可以通过使用/STACKSIZE链接程序开关来调整 创建线程是可以更改其堆栈的大小 不要在低内存情况下使用大量堆栈
47
3.4 静态数据 Windows CE为应用程序的静态数据分配了两个RAM块 以页面为单位来分配
用于读取/写入数据 用于只读数据 以页面为单位来分配 好的应用程序应该能确保只有很少或根本没有额外的剩余空间
48
3.5 字符串资源 当特定语言的信息被保留在编译代码之外时,字符串资源是减少应用程序所占用内存的一种较好的方法
LoadString函数用于从资源中加载字符串 在Windows CE下,如果LoadString函数中的参数lpBuffer是NULL,则返回一个指向字符串的只读指针作为返回值,将其放入常量统一代码字符串中,而不需要分撇一个缓冲区来保存字符串,并在需要的时候就可以使用
49
3.6 选择正确的内存类型 直接分配内存类型 对于大的内存块,最好是直接分配虚拟内存 是最灵活的内存分配类型
担心页面的粒度并跟踪保留页面和提交页面的情况 本地堆 使用便利,不需要要创建 在必需的时候它会按需求来增大 产生碎片 单独 的堆 在它们的时间到了以后能破坏它们.将内存碎片问题消灭在萌牙状态 必须手工创建和破坏他们 堆栈 易于使用并且随处可用 需些考虑的是堆栈的最大大小和在低内存条件下扩大堆栈的问题 静态 数据 完全自由地移进一个或两个缓冲区,因为该页面总是要分配的 常量数据越多越好,因为不占用RAM
50
4 管理低内存状态 WM_HIBERNATE消息 Windows CE定义的四种内存状态 具体系统处理低内存的策略有所不同
当可用内存很少时以Z轴反方向发送到应用程序 应用程序接到此消息后应该尽可能减少占用的内存 释放高速缓存中的数据 释放任意GDI对象,如字体、位图、画笔等 破环任意窗口控件 Windows CE定义的四种内存状态 正常 受限 低 临界 具体系统处理低内存的策略有所不同 Explorer Shell和Pocket PC处理低内存的策略比较
51
Explorer Shell处理低内存的策略
事件 空闲内存(1024B页面) 空闲内存 (4096B页面) 注释 受限内存状态 128KB 160KB 以z轴反方向顺序将WM_HIBERNATE消息发送到应用程序。必要时释放回收的堆栈空间 低内存状态 64KB 96KB 将虚拟分配限制为16KB。显示低内存对话框 临界内存状态 16KB 48KB 将虚拟分配限制为8KB
52
Pocket PC处理低内存的策略 事件 空闲内存(1024B页面) 空闲内存 注释 休眠 阈值 200KB 224KB
以z轴反方向顺序将WM_HIBERNATE消息发送到应用程序 受限内存状态 128KB 160KB 以z轴反方向顺序关闭应用程序。必要时释放回收的堆栈空间 低内存状态 64KB 96KB 将虚拟分配限制为16KB。显示低内存对话框 临界内存状态 16KB 48KB 将虚拟分配限制为8KB
53
其它 对于简单外壳的Windows CE版本,应用程序应该设计自己的管理低内存状况的策略。 一定要检查从分配内存调用返回的代码
关于Win32内存管理API参考书 Programming Applications for Microsoft Windows By Jeff Richter Microsoft Press,1999
54
总结 物理内存 虚拟内存 内存分配方式 ROM RAM 虚拟内存基础 管理低内存状态 分页内存系统 虚拟内存术语
Windows CE的虚拟地址空间 和Windows XP的比较 在Platform Builder中查看关于内存的信息 内存分配方式 虚拟内存 堆 堆栈 静态数据 字符串资源 选择合适的内存类型 管理低内存状态 WM_HIBERNATE消息 Windows CE定义的四种内存状态 具体系统处理低内存的策略有所不同
55
资源 Programming Microsoft Windowss CE.NET 3rd edition, Douglas Boling,Microsoft Press,2003 《Windows CE.NET系统分析及试验教程》,陈向群 王雷 马洪兵 向勇 等编著,机械工业出版社,2003 Windows CE.NET help MSDN library Microsoft Windows CE.NET train: 2540_Developing Embedded Solutions for Windows CE .NET 《Windows CE.NET内核定制及应用开发》,周毓林 宁杨 陆贵强 付林林 编著,电子工业出版社,2005
Similar presentations