微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > WinCE线程和内存管理之内存管理

WinCE线程和内存管理之内存管理

时间:02-24 来源:互联网 点击:
内存管理

  同其它Windows操作系统一样,Windows CE.NET也支持32位虚拟内存机制、按需分配内存和内存映射文件等。但是与其它Windows操作系统又有明显的不同。
图1 Windows CE.NET内存结构

进入讨论组讨论。


  3、进程地址空间结构

  进程地址空间结构如图2所示。这个图源至MSDN。

WinCE线程和内存管理之内存管理图片2 WinCE线程和内存管理之内存管理图片1 WinCE线程和内存管理之内存管理图片2

WinCE线程和内存管理之内存管理图片2 WinCE线程和内存管理之内存管理图片1 WinCE线程和内存管理之内存管理图片2Windows CE.NET同以前版本的Windows CE操作系统在进程地址空间上有所不同,以前的Windows CE把XIP DLL也加载到进程的32MB地址空间中,而Windows CE.NET把XIP DLL单独加载到Slot 1中,这样对于每个进程来说,它总的地址空间就大了一倍,也就是64MB。这个问题我在讲解进程的时候提到过。

  当一个应用程序启动时,内核为这个程序选择一个空闲的槽(Slot),并且加载所有的代码、资源,并分配堆栈,加载DLL等。当这个进程得到CPU使用权时,它的整个地址空间被内核映射到Slot 0,也就是当前进程使用的地址空间,然后开始运行。图中给出的地址实际上是经过映射到Slot 0之后的结构。从图中可以看出,进程首先加载代码段,因为每个进程最低部64KB作为保留区域,所以代码段从0x0001 0000开始,内核为代码段分配足够的虚拟地址空间后,接着分配空间为只读数据和可读/可写数据,接着分配空间为资源数据,之后分配空间为默认堆和栈。非XIP DLL从进程最高地址向下开始加载。非XIP DLL的加载按如下规则:内核先检查要加载的DLL是否被其它进程加载过,如果加载过,就做一个地址的重定位。这样就避免了整个系统内多次加载相同DLL。如果没有加载过,就按照从槽的高地址到槽的低地址的顺序查找空闲的地址空间。然后分配足够的地址空间用于加载DLL。因为每个进程在执行前都要映射到Slot 0,而且进程使用的所有DLL可能来自不同的槽(Slot),为避免所有使用的DLL在映射到Slot 0中出现地址空间冲突的现象,内核的加载器(Loader)在加载DLL时会查找所有槽中加载的DLL的地址,保证在映射到Slot 0时不会发生地址冲突现象。假如系统内有两个进程,进程A只加载了DLL A,进程B

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top