WINCE驱动开发中几个内存分配函数比较
- 格式:doc
- 大小:32.50 KB
- 文档页数:3
2.对物理内存的直接读写在PC环境下,Windows是不允许用户态进程直接访问内存的,任何对内存的访问都会引起程序的异常。
而在嵌入式设备中,需要直接对内存进行读写,以此来提高处理速度,此外,在ARM体系中,I/O被映射到高端的地址进行访问,只有读写物理地址,I/O的驱动才能高效地运行。
Windows CE中有一些API提供了对物理内存的“直接”访问。
不过,在访问之前,必须把物理内存映射到虚拟地址中,通过虚拟地址才能读写物理内存。
PHYSICAL_ADDRESS描述了Windows CE的物理内存结构体,Windows CE在ceddk.h中定义了PHYSICAL_ADDRESS,其定义如下:n 在ceddk.h中typedef LARGE_INTEGER PHYSICAL_ADDRESS, *PPHYSICAL_ADDRESS;n 在winnt.h中typedef union _LARGE_INTEGER{struct{DWORD LowPart;LONG HighPart;};LONGLONG QuadPart;} LARGE_INTEGER;可见,Windows CE中用64位来代表物理地址,对于大多数32位的CPU而言,只需要把它的HighPart设置为0就可以了。
VirtualAlloc()函数是Windows CE中分配连续虚拟地址的API,VirtualCopy()函数将一段物理内存映射到虚拟地址。
因此,在进程中访问物理地址,就像访问虚拟地址一样方便,当然,如何选择虚拟地址是需要研究的。
// 申请虚拟内存LPVOID VirtualAlloc(LPVOID lpAddress, // 希望的虚拟内存起始地址DWORD dwSize, // 以字节为单位的大小DWORD flAllocationType, // 申请类型,分为Reserve和Commit DWORD flProtect // 访问权限);// 把物理内存绑定到虚拟地址空间BOOL VirtualCopy(LPVOID lpvDest, // 虚拟内存的目标地址LPVOID lpvSrc, // 物理内存地址DWORD cbSize, // 要绑定的大小DWORD fdwProtect // 访问权限);VirtualAlloc对虚拟内存的申请分为两步,保留MEM_RESERVE和提交MEM_COMMIT。
c内存比较函数C语言中内存比较函数是非常重要的一类函数,在一些需要进行字节级别比较的应用中必不可少。
这类函数主要用于比较两个块内存的内容是否相同。
所以,本文将重点讨论C语言中内存比较函数的相关知识。
一、C语言中的内存比较函数C语言中提供了memcmp、memchr、memmove、memcpy等一系列内存操作函数。
其中,内存比较函数主要包括memcmp()和memchr()函数。
1.memcmp()函数该函数原型如下:```int memcmp(const void *ptr1, const void *ptr2, size_t num);```其中,参数ptr1和ptr2是要比较的内存地址,而参数num指定了需要比较的字节数。
该函数的返回值如下:- 当ptr1和ptr2指向的内存区域中的num个字节都相等时,返回0;- 当ptr1所指向的内存区域中第一个比ptr2指向的内存区域对应字节大时,返回大于0的值;- 当ptr1所指向的内存区域中第一个比ptr2指向的内存区域对应字节小时,返回小于0的值。
下面是该函数的示例代码:```#include <stdio.h>#include <string.h>result = memcmp(s1, s2, 5);if(result < 0)printf("s1 is less than s2.\n");else if(result > 0)printf("s1 is greater than s2.\n");elseprintf("s1 is equal to s2.\n");return 0;}```输出结果如下:```s1 is less than s2.```该程序在比较字符串s1和s2时使用了memcmp()函数,并指定了需要比较的字节数为5(因为两个字符串长度都为5)。
virtualallocex 用法VirtualAllocEx 是 Windows 操作系统提供的一个函数,用于在指定进程的虚拟地址空间中分配内存。
它的用法非常灵活,可以满足各种不同的内存分配需求。
使用 VirtualAllocEx 函数需要引入 windows.h 头文件,并调用相关的参数。
以下是 VirtualAllocEx 函数的一般用法:1. 首先,需要获取目标进程的句柄。
可以使用 OpenProcess 函数通过进程 ID 或进程名来获取目标进程的句柄。
2. 通过调用 VirtualAllocEx 函数来在目标进程中分配内存。
函数的几个重要参数如下:- hProcess:目标进程的句柄。
- lpAddress:分配内存的起始地址,可以传入 NULL 表示由系统自动选择合适的地址。
- dwSize:欲分配的内存大小。
- flAllocationType:内存分配类型,常见的有 MEM_COMMIT(提交内存)和 MEM_RESERVE(保留内存)。
可以根据实际需求传入适当的值。
- flProtect:内存保护属性,用于指定内存页的访问权限。
常见的属性包括PAGE_READWRITE(可读可写)、PAGE_EXECUTE_READ(可执行可读)等。
3. 分配内存成功后,可以使用 WriteProcessMemory 函数将数据写入目标进程的内存空间。
4. 最后,可以使用 VirtualFreeEx 函数释放已分配的内存。
需要注意的是,使用 VirtualAllocEx 函数需要以管理员权限运行程序,否则可能会受到安全限制导致分配内存失败。
此外,还需小心避免内存泄漏和访问非法内存等问题,以确保程序的稳定和安全性。
总结:VirtualAllocEx 是用于在指定进程的虚拟地址空间中分配内存的函数。
通过传递进程句柄、内存地址、大小等参数,可以实现内存的分配和释放操作。
使用时需要引入相应的头文件,并注意权限和安全性的考虑。
操作系统的内存分配算法操作系统的内存管理是计算机系统中一个重要的组成部分。
内存分配算法决定了如何合理地利用系统的内存资源,以达到高效、安全、稳定的运行。
本文将介绍几种常见的内存分配算法,包括首次适应算法、循环首次适应算法、最佳适应算法以及快速适应算法。
首次适应算法(First Fit Algorithm)首次适应算法是一种简单而常见的内存分配算法。
它从内存空闲列表的头部开始寻找第一个适合分配的内存块。
当找到满足要求的内存块后,将该块划分为两部分,一部分用于分配给请求的程序,另一部分保留为剩余空闲块。
这种算法的优点是分配速度较快,缺点是可能会导致内存碎片的产生。
循环首次适应算法(Next Fit Algorithm)循环首次适应算法是首次适应算法的一种改进版本。
与首次适应算法不同的是,循环首次适应算法从上一次分配的位置开始搜索空闲块,直到找到一个满足要求的内存块为止。
这样可以避免每次都从头开始搜索,提高了查找的效率。
同样,这种算法也可能导致内存碎片的产生。
最佳适应算法(Best Fit Algorithm)最佳适应算法是为了解决内存碎片问题而提出的一种分配算法。
该算法会在内存空闲列表中查找最小且能满足要求的空闲块,并将该块分配给请求的程序。
这样可以尽量充分利用内存资源,减少内存碎片的产生。
但是,最佳适应算法的缺点是分配速度相对较慢,因为需要遍历整个内存空闲列表。
快速适应算法(Quick Fit Algorithm)快速适应算法是一种综合了首次适应算法和最佳适应算法的策略。
它将内存空闲列表分成了多个不同大小的链表,每个链表分别存储相应大小的空闲块。
当有程序请求内存时,快速适应算法会直接从对应大小的链表中查找可用的空闲块进行分配,以提高分配的速度。
这个算法在时间效率和空间效率上都较为出色,但是需要付出额外的存储开销。
总结不同的内存分配算法各有优缺点,选择合适的算法取决于具体的应用场景和系统需求。
首次适应算法和循环首次适应算法适用于内存分配需求频繁变化的场景。
在WinCE中使用的一个重要的文件就是BIB文件,全称Binary Image Builder File。
在WinCE的编译过程中会用到BIB文件,应该是在最后的Makeimg阶段。
所有的BIB文件会被合并成CE.bib文件,然后Romimage.exe会根据BIB文件中的描述来决定哪些文件最终被包含到WinCE image中。
当然,BIB文件还决定了WinCE设备内存的分配,其中定义了WinCE image占用哪块内存,Framebuffer占用哪块内存等。
在BIB文件中分为4大项:MEMORY项,CONFIG项,MODULES项和FILES项。
下面分别作个解释:MEMORY:定义了内存分配的相关设置,一般在BSP中的config.bib文件中。
CONFIG:在最后的Makeimg阶段,为Romimage.exe提供一些生成WinCE image的配置属性。
该项是可选的,一般也在BSP中的config.bib文件中定义。
MODULES:定义了一些会被打包到WinCE image中的模块或者文件,比如dll,exe等。
这些文件会被Romimage.exe标记为加载到RAM中或者XIP。
我们可以在这里添加自己的WinCE应用程序或者模块,但是不要添加Managed Binaries,一般指.NET的程序。
FILES:定义了一些操作系统会用到的其他的文件,比如字体文件,图片等。
这些文件也会在WinCE运行的时候被加载到RAM中。
下面会详细介绍上面的4大项:1. MEMORY项一般都在config.bib文件中定义,开头会有MEMORY的字样。
这里定义了为WinCE image 以及其他模块预留的RAM,同时也定义了WinCE可以使用的RAM。
具体格式如下:MEMORYNAME Start Address Memory Size TypeNAME:该内存区域的名字,必须是唯一的。
Start Address:该内存区域的起始地址,用十六进制表示。
c中内存分配与释放(malloc,realloc,calloc,free)函数内容的整理malloc:原型:extern void *malloc(unsigned int num_bytes); 头文件:在TC2.0中可以用malloc.h 或alloc.h (注意:alloc.h 与malloc.h 的内容是完全一致的),而在V isual C++6.0中可以用malloc.h或者stdlib.h。
功能:分配长度为num_bytes字节的内存块返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。
函数返回的指针一定要适当对齐,使其可以用于任何数据对象。
说明:关于该函数的原型,在旧的版本中malloc 返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。
名称解释:malloc的全称是memory allocation,中文叫动态内存分配。
函数声明void *malloc(size_t size); 说明:malloc 向系统申请分配指定size个字节的内存空间。
返回类型是void* 类型。
void* 表示未确定类型的指针。
C,C++规定,void* 类型可以强制转换为任何其它类型的指针。
备注:void* 表示未确定类型的指针,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者...)从函数声明上可以看出。
malloc 和new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小。
比如:int *p; p = new int; //返回类型为int* 类型(整数型指针),分配大小为sizeof(int); 或:int* parr; parr = new int [100]; //返回类型为int* 类型(整数型指针),分配大小为sizeof(int) * 100; 而malloc 则必须要由我们计算字节数,并且在返回后强行转换为实际类型的指针。
【原创】Windows CE操作系统BSP开发——————BootLoader开发OAL开发2011-11-290 概述BSP:介于主板硬件和操作系统之间的一层软件系统把操作系统与硬件交互的接口抽象抽取出来,再作为单独的一层函数,操作系统需要访问底层硬件的时候(例如初始化硬件、关中断等),不再直接访问硬件,而是调用抽象出来的这一层函数完成操作。
有了BSP层的抽象之后,操作系统内核的代码就可以做到只与CPU体系结构相关,而与具体的硬件无关了。
对于不同的CPU体系结构,操作系统仍然需要提供编译好的二进制代码或在该CPU下可编译的源代码。
因此,在内核中如果要使用汇编语句,对不同的CPU都要编写一份,所以操作系统代码大多数都是用C/C++实现的。
BSP与特定的嵌入式操作系统相关。
BSP对应的是某块具体的开发板/产品板,而不是某款CPU,也不是某类CPU 体系架构。
因此,BSP 与开发板一一对应。
概念:芯片支持包,CSPOAL 层:负责Windows CE 内核与硬件通讯。
当引导程序引导操作系统结束后,由OAL层负责硬件平台初始化、中断服务例程、实时钟、计时器、内核调试、开关中断和内核性能监测等工作。
OAL的代码在物理上是内核的一部分,最终经过编译链接,OAL会成为内核的一部分。
引导程序(Boot Loader):在硬件开发板上执行的一段代码,它的主要功能是初始化硬件、加载操作系统映像到内存,然后跳转到操作系统代码去执行。
配置文件:一些包含配置信息的文本文件。
这些配置信息通常与操作系统映像或源代码有关。
例如告诉编译系统如何编译某些源代码,或告诉编译系统如何配置最终的操作系统映像文件。
.BIB、.DB、.REG 和.DAT四类平台初始化文件:用来告诉MakeImage工具如何生成操作系统映像;Sources和DIRS文件:告诉构建系统如何构建代码;CEC文件:这样BSP可以与Platform Builder集成。
分配内存函数
分配内存函数是指在程序中动态地分配内存空间的函数。
在C语
言中,常用的分配内存函数有malloc、calloc、realloc等。
1. malloc函数:malloc函数的原型为void *malloc(size_t size),功能是分配size字节的内存空间,并返回该空间的起始地址。
这个函数不会对申请到的空间进行初始化。
2. calloc函数:calloc函数的原型为void *calloc(size_t nmemb, size_t size),功能是分配nmemb个元素,每个元素大小为
size字节的内存空间,并返回该空间的起始地址。
这个函数会将申请
到的空间全部初始化为0。
3. realloc函数:realloc函数的原型为void *realloc(void
*ptr, size_t size),功能是重新分配ptr指向的内存空间的大小为size字节,并返回新的空间起始地址。
如果ptr指向的空间大小不够,会开辟新的空间并将数据复制到新的空间中,如果大小足够则直接返
回原空间的地址,如果size为0则释放空间并返回NULL。
这些函数在申请内存空间时都可能导致内存分配失败,因此需要
用if判断申请空间是否成功。
例如:
```
int *p = (int*)malloc(sizeof(int)*n);
if(p == NULL){
printf("分配内存失败");
exit(1);
}
```。
C语言分配内存并赋值的函数1. 概述在C语言中,我们经常需要动态地分配内存来存储数据。
为了方便地进行内存分配和赋值操作,C语言提供了一些特定的函数。
这些函数可以帮助我们在程序运行时动态地分配内存,并将指定的值赋给所分配的内存空间。
本文将详细介绍C语言中的几个常用的分配内存并赋值的函数,包括malloc、calloc和realloc。
我们将分别介绍它们的定义、用途和工作方式,并给出一些示例代码来说明它们的使用方法。
2. malloc函数2.1 定义malloc函数是C语言中用于动态分配内存的函数。
它的原型定义在stdlib.h头文件中,其定义如下:void* malloc(size_t size);2.2 用途malloc函数用于在程序运行时动态地分配指定大小的内存空间。
这个函数返回一个指向分配内存的指针,如果分配失败则返回NULL。
2.3 工作方式malloc函数的工作方式如下:1.接收一个size_t类型的参数size,表示需要分配的内存空间的大小。
2.在堆(heap)中分配一块大小为size的连续内存空间。
3.返回指向分配内存的指针,如果分配失败则返回NULL。
2.4 示例代码下面是一个使用malloc函数分配内存并赋值的示例代码:#include <stdio.h>#include <stdlib.h>int main() {int* ptr;int size = 5;ptr = (int*)malloc(size * sizeof(int));if (ptr == NULL) {printf("内存分配失败\n");return 1;}for (int i = 0; i < size; i++) {ptr[i] = i + 1;}for (int i = 0; i < size; i++) {printf("%d ", ptr[i]);}free(ptr);return 0;}上述代码中,我们使用malloc函数分配了一块大小为 5 * sizeof(int)的内存空间,并将其地址赋给指针ptr。
WINCE5.0和WINCE6.0的内存与系统架构********************************LoongEmbedded************************ 作者:LoongEmbedded(kandi)时间:2010.07.21类别:WINCE嵌入式操作系统********************************LoongEmbedded************************ 1.WINCE5.01.1 WINCE5.0的内存架构因为WINCE是32位的嵌入式操作系统,所以WINCE的虚拟寻址能力可达4GB(为什呢,2^32=4GB),但是WINCE5.0和XP操作系统的每个进程独享4GB虚拟地址空间不同,WINCE5.0中所有的进程共享一个4GB的虚拟地址空间。
这4GB的虚拟地址空间被分为两个2GB的区域,其中低地址的那2GB区域(0x00000000 ~ 0x7FFFFFFF)是用户虚拟空间,这块虚拟空间由应用程序的共用,也就是说应用程序申请的内存都会从低2GB虚拟内存空间分配的;而高2GB区域(0x80000000 ~ 0xFFFFFFFF)是操作系统的内核虚拟空间,供WINCE操作系统本身使用。
我们知道WINCE5.0的进程数量最多只能达到32个,而且每个进程只能独享32MB的虚拟空间(这个32MB的空间也叫一个slot),这33个进程(32+1,这个1就是指slot0,因为slot0用于映射当前在处理器上执行的线程所在的进程)占用的虚拟空间0x00000000~0x41FFFFFF(slot0~slot32),slot33~slot63对应的虚拟地址空间是0x42000000~0x7FFFFFFF,这块虚拟地址空间是由所有的进程共享的,如果每个进程独享的32MB虚拟地址空间不够用,那么进程可以在这个范围申请虚拟地址空间,这个范围包括对象存储和内存映射文件(.map文件,每个进程都有自己的map文件)。
Windows CE 5.0和Windo ws CE 6.0的内存与系统架构1.Windows CE 5.01.1 Windows CE 5.0的系统架构1.2 Windows CE 5.0的内存架构因为WINCE是32位的嵌入式操作系统,所以WINCE的虚拟寻址能力可达4GB(为什呢,2^32=4GB),但是WINCE5.0和XP操作系统的每个进程独享4GB虚拟地址空间不同,WINCE5.0中所有的进程共享一个4G B的虚拟地址空间。
这4GB 的虚拟地址空间被分为两个2GB的区域,其中低地址的那2GB区域(0x00000000 ~ 0x7FFFF FFF)是用户虚拟空间,这块虚拟空间由应用程序的共用,也就是说应用程序申请的内存都会从低2G B虚拟内存空间分配的;而高2GB区域(0x80000000 ~0xFFFFF FFF)是操作系统的内核虚拟空间,供WINCE操作系统本身使用。
我们知道WIN CE5.0的进程数量最多只能达到32个,而且每个进程只能独享32MB的虚拟空间(这个32MB的空间也叫一个sl ot),这33个进程(32+1,这个1就是指s l ot0,因为slot0用于映射当前在处理器上执行的线程所在的进程)占用的虚拟空间0x00000000~0x41FFFFFF(slot0~slot32),slot33~slot63对应的虚拟地址空间是0x42000000~0x7FFFFFFF,这块虚拟地址空间是由所有的进程共享的,如果每个进程独享的32MB虚拟地址空间不够用,那么进程可以在这个范围申请虚拟地址空间,这个范围包括对象存储和内存映射文件(.map文件,每个进程都有自己的map文件)。
此范围的最后一个slot(slot63)从0x7E000000~0x7FFFFFFF用来存放纯资源DLL。
emwin内存分配策略emWin是一款嵌入式图形库,广泛应用于各种嵌入式系统中。
在使用emWin进行图形界面开发的过程中,内存的分配策略是一个非常重要的问题。
本文将围绕emWin内存分配策略展开讨论,探讨其原理与应用。
一、内存分配策略的意义emWin作为一款嵌入式图形库,其运行需要占用一定的内存空间。
而嵌入式系统的内存资源往往较为有限,因此合理的内存分配策略对于系统的性能和稳定性具有重要影响。
通过合理的内存分配策略,可以最大程度地优化系统的内存使用效率,提高系统的响应速度和用户体验。
二、内存分配策略的原理emWin的内存分配策略主要包括两个方面:内存分区和内存块管理。
内存分区是将系统内存划分为多个不同的区域,每个区域用于存放不同类型的数据。
内存块管理则是对每个区域的内存块进行分配和释放操作。
1. 内存分区emWin将系统内存划分为几个不同的区域,包括显示缓冲区、绘图缓冲区、字体缓冲区等。
每个区域大小可以根据实际需求进行分配,不同的区域可以根据其功能和使用频率进行优先级排序。
2. 内存块管理emWin使用内存块管理机制对每个区域的内存进行分配和释放操作。
内存块管理采用了双向链表的数据结构,每个内存块有一个头部结构和一个数据区域。
头部结构中包含了该内存块的状态信息和指向上一个和下一个内存块的指针。
通过这种方式,可以高效地进行内存块的分配和释放操作。
三、内存分配策略的应用emWin提供了一系列的API函数,用于对内存进行分配和释放操作。
开发人员可以根据实际需求,自定义内存分配和释放函数,以适应不同的系统架构和内存资源。
1. 内存分配函数emWin提供了一个内存分配函数GUI_ALLOC_GetMemPtr(),用于分配指定大小的内存块。
开发人员可以根据实际需求,自定义该函数,实现对系统内存的分配操作。
在分配内存时,可以根据内存分区的优先级进行分配,以确保高频使用的区域获得更多的内存资源。
2. 内存释放函数emWin提供了一个内存释放函数GUI_ALLOC_FreePtr(),用于释放之前分配的内存块。
内存分配策略
内存分配策略是指操作系统在应用程序需要使用内存时,如何分配可用的内存空间,以达到最优的系统性能和资源利用率。
以下是常见的内存分配策略:
1. 静态内存分配
静态内存分配是在程序编译时就确定了内存使用量,由编译器在程序运行前分配好内存。
这种内存分配方式可以提高程序的运行速度,但内存空间无法动态调整,只能通过重新编译程序来改变内存分配。
2. 动态内存分配
动态内存分配是在程序运行时根据需要动态分配内存空间。
应用程序可以通过动态内存分配来根据需求分配内存,也可以在不需要时释放已分配的内存。
动态内存分配可以提高程序的灵活性和内存利用率。
3. 按需分配
按需分配是指只在需要时分配内存,而不是在程序开始时分配。
这种内存分配方式可以减少内存的浪费,但也可能会造成内存分配和释放之间的性能瓶颈。
4. 内存池
内存池是一种内存管理技术,它在程序开始运行时分配一定的内存空间,并在需要时从预分配的内存池中获取内存。
这种内存分配方式可以提高程序的性能和内存利用率。
5. 多级分配
多级分配是指将内存分为不同级别的块,每个块都有一个独立的内存池来管理。
这种内存分配方式可以提高程序的内存利用率,并减少内存碎片。
但是,多级分配也可能导致在不同块之间的内存搬移时出现性能瓶颈。
6. 内存交换
内存交换是指将当前不需要的内存数据移动到硬盘上,以释放物理内存空间。
这种内存分配方式可以使用更大的内存空间,但也会降低程序的性能。
总之,不同的内存分配策略适用于不同的操作系统和应用程序。
选择合适的内存分配策略可以提高应用程序的性能和资源利用率。
Windows CE 内存管理内存分配的不同类型一个Windows CE 应用程序有许多不同的内存分配方式。
在内存食物链的底端是Virtualxxx 函数,它们直接保留,提交和释放(free)虚拟内存页。
接下来的是堆(heap) API。
堆是系统为应用程序保留的内存区域。
堆有两种风味:当应用程序启动时自动默认分配的本地堆(local heap),以及能够由程序手动创建的分离堆(separate heap)。
在堆API之后是静态数据,数据块是被编译器定义好的或者由程序手动创建的。
最后,我们来看栈,这是程序为函数存储变量的区域。
一个Windows CE不支持的Win32 内存API是全局堆(global heap)。
全局堆API包括GlobalAlloc,GlobalFree和GlobalRealloc,将不会出现在Windows CE中(译者注:很奇怪,我在Windows CE 中仍然可以使用这几个API,并且工作正常,好像Microsoft并没有把它们完全去掉)。
全局堆只是从Windows 3.x的Win16 时期继承而来。
在Win32中,全部和本地的堆很类似,全局内存一个独特用法是,为剪贴板的数据分配内存,在Windows CE 中已经被本地堆替代并加上了句柄。
在Windows CE中最小化内存使用的关键是选择与内存块使用模型相匹配的恰当的内存分配策略。
我将回顾一下这些内存类型然后讲述Windows CE应用程序中的最小化内存使用策略。
虚拟内存虚拟内存是内存类型中最基础的。
系统调用虚拟内存API来为其他类型内存分配内存。
包括堆和栈。
虚拟内存API,包括VirtualAlloc,VirtualFree和VirtualReSize函数,这些可以直接操作应用程序虚拟内存空间的虚拟内存页面。
页面可以保留,提交给物理内存,或使用这些函数释放。
分配虚拟内存分配和保留虚拟内存是同过这个函数完成的:LPVOID VirtualAlloc (LPVOID lpAddress, DWORD dwSize,DWORD flAllocationType,DWORD flProtect);VirtualAlloc的第一个参数是要分配内存区域的地址。
Windows CE百科名片WindowsCE是微软公司嵌入式、移动计算平台的基础,它是一个开放的、可升级的32位嵌入式操作系统,是基于掌上型电脑类的电子设备操作系统,它是精简的Windows 95,Windows CE的图形用户界面相当出色。
简介Windows CE操作系统是Windows家族中的成员,为专门设计给掌上电脑(HPCs)以及嵌入式设备所使用的系统环境。
这样的操作系统可使完整的可移动技术与现有的Windows桌面技术整合工作。
Windows CE被设计成针对小型设备(它是典型的拥有有限内存的无磁盘系统)的通用操作系统,Windows CE可以通过设计一层位于内核和硬件之间代码来用设定硬件平台,这即是众所周知的硬件抽象层(HAL)(在以前解释时,这被称为OEMC(原始设备制造)适应层,即OAL;内核压缩层,即KAL。
以免与微软的Windows NT操作系统的HAL混淆)。
与其它的微软Windows操作系统不同,Windows CE并不是代表一个采用相同标准的对所有平台都适用的软件。
为了足够灵活以达到适应广泛产品需求,Windows CE可采用不同的标准模式,这就意味着,它能够从一系列软件模式中做出选择,从而使产品得到定制。
另外,一些可利用模式也可作为其组成部分,这意味着这些模式能够通过从一套可利用的组份做出选择,从而成为标准模式。
通过选择,Windows CE能够达到系统要求的最小模式,从而减少存储脚本和操作系统的运行,也为企业创造更大效益[1]。
Windows CE中的C代表袖珍(Compact)、消费(Consumer)、通信能力(Connectivity)和伴侣(Companion);E代表电子产品(Electronics)。
与Windows 95/98、Windows NT不同的是,Windows CE是所有源代码全部由微软自行开发的嵌入式新型操作系统,其操作界面虽来源于Windows 95/98,但Windows CE是基于WIN32 API重新开发、新型的信息设备的平台。
【转】LocalAlloc,VirtualAlloc,malloc,new的异同首先明白几个概念:虚拟内存是从硬盘置换出来的,堆本身就是内存,程序运行时,可用内存=物理内存+虚拟内存。
虚拟内存一般用文件来保存数据,虚拟内存的出现主要是因为以前内存不够(16M的内存刚出来的时候可是天价啊),磁盘相对便宜一些,所以聪明的系统设计者就把设计了虚拟内存,在程序运行的时候把那些很久没有被访问过的(可能以后也不会用到)内存映射到文件里面去(以后需要的时候再读进内存),把内存腾出来给真正需要执行的代码和数据,这样看起来可用内存就比物理内存多了。
HeapAlloc()是堆分配内存函数,查看c,c++的malloc,new函数的代码,可以看到就是对HeapAlloc()函数的封装,在堆上可以动态分配内存。
1. 首先我们来看HeapAlloc:
MSDN上的解释为:HeapALloc是从堆上分配一块内存,且分配的内存是不可移动的(即如果没有连续的空间能满足分配的大小,程序不能将其他零散的空间利用起来,从而导致分配失败),该分配方法是从一指定地址开始分配,而不像GloabalAlloc是从全局堆上分配,这个有可能是全局,也有可能是局部。
函数原型为:
LPVOID
HeapAlloc(
HANDLE hHeap,
DWORD dwFlags,
SIZE_T dwBytes
);
hHeap是进程堆内存开始位置。
dwFlags是分配堆内存的标志。
包括HEAP_ZERO_MEMORY,即使分配的空间清零。
dwBytes是分配堆内存的大小。
其对应的释放空间函数为HeapFree。
2. 再看GlobalAlloc:该函数用于从全局堆中分配出内存供程序使用,函数原型为:
HGLOBAL GlobalAlloc(
UINT uFlags,
SIZE_T dwBytes
);
uFlags参数含义
GHND GMEM_MOVEABLE和GMEM_ZEROINIT的组合
GMEM_FIXED 分配固定内存,返回值是一个指针
GMEM_MOVEABLE 分配活动内存,在Win32中,内存块不能在物理内存中移动,但能在默认的堆中移动。
返回值是内存对象的句柄,用函数GlobalLock可将句柄转化为指针
GMEM_ZEROINIT 将内存内容初始化为零
GPTR GMEM_FIXED和GMEM_ZEROINIT的组合
一般情况下我们在编程的时候,给应用程序分配的内存都是可以移动的或者是可以丢弃的,这样能使有限的内存资源充分利用,所以,在某一个时候我们分配的那块内存的地址是不确定的,因为他是可以移动的,所以得先锁定那块内存块,这儿应用程序需要调用API函数GlobalLock函数来锁定句柄。
如下:
lpMem=GlobalLock(hMem); 这样应用程序才能存取这块内存。
所以我们在使用GlobalAllock时,通常搭配使用GlobalLock,当然在不使用内存时,一定记得使用GlobalUnlock,否则被锁定的内存块一直不能被其他变量使用。
GlobalAlloc对应的释放空间的函数为GlobalFree。
3.LocalAlloc:该函数用于从局部堆中分配内存供程序使用,函数原型为:HLOCAL LocalAlloc(
UINT uFlags, //指定怎样去分配内存
此参数有三种标志:
LMEM_FIXED:分配固定内存,返回值是指向一个内存对象的指针。
LMEM_ZEROINIT:初始化内存内容为zero。
LPTR:结合了LMEM_FIXED和LMEM_ZEROINIT这两种标志。
LMEM_MOVEABLE:分配可移动内存。
LMEM_DISCARDABLE:分配可删除的内存。
SIZE_T uBytes //指定要分配的字节数
);
参数同GlobalAlloc。
在16位Windows中是有区别的,因为在16位windows用一个全局堆和局部堆来管理内存,每一个应用程序或dll装入内存时,代码段被装入全局堆,而系统又为每个实例从全局堆中分配了一个64kb的数据段作为该实例的局部堆,用来存放应用程序的堆栈和所有全局或静态变量。
而LocalAlloc/GlobalAlloc就是分别用于在局部堆或全局堆中分配内存。
由于每个进程的局部堆很小,所以在局部堆中分配内存会受到空间的限制。
但这个堆是每个进程私有的,相对而言分配数据较安全,数据访问出错不至于影响到整个系统。
而在全局堆中分配的内存是为各个进程共享的,每个进程只要拥有这个内存块的句柄都可以访问这块内存,但是每个全局内存空间需要额外的内存开销,造成分配浪费。
而且一旦发生严重错误,可能会影响到整个系统的稳定。
不过在Win32中,每个进程都只拥有一个省缺的私有堆,它只能被当前进程访问。
应用程序也不可能直接访问系统内存。
所以在Win32中全局堆和局部堆都指向进程的省缺堆。
用LocalAlloc/GlobalAlloc分配内存没有任何区别。
甚至LocalAlloc分配的内存可以被GlobalFree释放掉。
所以在Win32下编程,无需注意Local和Global的区别,一般的内存分配都等效于
HeapAlloc(GetProcessHeap(),...)。
LocalAlloc对应的释放函数为LockFree。
4.VirtualAlloc:该函数的功能是在调用进程的虚地址空间,预定或者提交一部分页,如果用于内存分配的话,并且分配类型未指定MEM_RESET,则系统将自动设置为0;其函数原型:
LPVOID VirtualAlloc(
LPVOID lpAddress, // region to reserve or commit
SIZE_T dwSize, // size of region
DWORD flAllocationType, // type of allocation
DWORD flProtect // type of access protection
);
VirtualAlloc可以通过并行多次调用提交一个区域的部分或全部来保留一个大的内存区域。
多重调用提交同一块区域不会引起失败。
这使得一个应用程序保留内存后可以随意提交将被写的页。
当这种方式不在有效的时候,它会释放应用程序通过检测被保留页的状态看它是否在提交调用之前已经被提交。
VirtualAlloc对应的释放函数为VirtualFree。
5. DrvLib_MapIoSpace :把物理地址转换为虚拟地址。
其实它就是在地址映射表中查找相应的物理地址,然后返回对应的虚拟地址加上它的偏移。
void *DrvLib_MapIoSpace
(UINT32 PhysicalAddress , //要实现映射的物理地址的起始地址。
UINT32 NumberOfBytes , //要映射物理地址的长度。
BOOL CacheEnable //该物理地址是否使用了CACHE.
)
6. Malloc:malloc与free是C++/C语言的标准库函数,可用于申请动态内存和释放内存。
对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求。
对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。
由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
7.New:new/delete是C++的运算符。
可用于申请动态内存和释放内存。
C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。
注意new/delete不是库函数。
C++程序经常要调用C函数,而C程序只能用malloc /free管理动态内存。
new 是个操作符,和什么"+","-","="...有一样的地位.
malloc是个分配内存的函数,供你调用的.
new是保留字,不需要头文件支持.
malloc需要头文件库函数支持.new 建立的是一个对象,
malloc分配的是一块内存.
new建立的对象你可以把它当成一个普通的对象,用成员函数访问,不要直接访问它的地址空间
malloc分配的是一块内存区域,就用指针访问好了,而且还可以在里面移动指针.
内存泄漏对于malloc或者new都可以检查出来的,区别在于new可以指明是那个文件的那一行,而malloc没有这些信息。
new可以认为是malloc加构造函数的执行。
new出来的指针是直接带类型信息的。
而malloc返回的都是void指针。